| | |
| | | if len(jobItemList) < job:
|
| | | GameWorld.ErrLog("职业物品集合key没有配置对应职业ID: npcID=%s,jobItemKey=%s,job=%s" % (npcID, jobItemKey, job))
|
| | | continue
|
| | | mustDropCount = dropRate / Def_NPCMaxDropRate
|
| | | dropRate = dropRate % Def_NPCMaxDropRate # 基础概率
|
| | | canDropCount = mustDropCount
|
| | | doCnt = ItemKeyMaxDropCountDict.get(jobItemKey, 1) # 默认1个
|
| | | doCnt = __GetNPCDropDoCountChange(doCnt, doCountRate, doCountAdd)
|
| | | for _ in xrange(doCnt):
|
| | | if not GameWorld.CanHappen(dropRate, maxRate=Def_NPCMaxDropRate):
|
| | | continue
|
| | | jobItemID = jobItemList[job - 1]
|
| | | canDropCount += 1
|
| | | |
| | | jobItemID = jobItemList[job - 1]
|
| | | for _ in xrange(canDropCount):
|
| | | dropItemIDList.append(jobItemID)
|
| | | #GameWorld.DebugLog("掉落自身职业指定物品ID: jobItemKey=%s,jobItemID=%s" % (jobItemKey, jobItemID))
|
| | |
|
| | |
| | | # 在只掉本职业里的不处理
|
| | | if jobItemKey in ItemKeyDropRateJobDict:
|
| | | continue
|
| | | mustDropCount = dropRate / Def_NPCMaxDropRate
|
| | | dropRate = dropRate % Def_NPCMaxDropRate # 基础概率
|
| | | canDropCount = mustDropCount
|
| | | doCnt = ItemKeyMaxDropCountDict.get(jobItemKey, 1) # 默认1个
|
| | | doCnt = __GetNPCDropDoCountChange(doCnt, doCountRate, doCountAdd)
|
| | | for _ in xrange(doCnt):
|
| | | if not GameWorld.CanHappen(dropRate, maxRate=Def_NPCMaxDropRate):
|
| | | continue
|
| | | canDropCount += 1
|
| | | |
| | | for _ in xrange(canDropCount):
|
| | | randJobItemID = random.choice(jobItemList)
|
| | | dropItemIDList.append(randJobItemID)
|
| | | #GameWorld.DebugLog("掉落随机职业指定物品ID: jobItemKey=%s,randJobItemID=%s" % (jobItemKey, randJobItemID))
|
| | |
| | | # 这种情况一般是玩家未加入队伍前对该NPC有伤血,加入到某个队伍后,将该伤害转移到队伍中
|
| | | return True
|
| | |
|
| | | if hurtPlayer.GetHP() <= 0 or hurtPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
|
| | | deadTime = hurtPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DeadTime)
|
| | | if time.time() - deadTime >= IpyGameDataPY.GetFuncCfg("BossHurtValue", 1):
|
| | | #GameWorld.DebugLog("伤血玩家死亡超过伤血保护时长,清除该伤血!playerID=%s" % hurtID)
|
| | | return True
|
| | | |
| | | #GameWorld.DebugLog("正常玩家伤血保护中!playerID=%s" % hurtID)
|
| | | return False
|
| | |
|
| | |
| | | if curTeamPlayer.GetCopyMapID() != copyMapID:
|
| | | #GameWorld.DebugLog("队员不在本线路,不计!playerID=%s" % playerID)
|
| | | continue
|
| | | |
| | | if curTeamPlayer.GetHP() <= 0 or curTeamPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
|
| | | deadTime = curTeamPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DeadTime)
|
| | | if time.time() - deadTime >= IpyGameDataPY.GetFuncCfg("BossHurtValue", 1):
|
| | | #GameWorld.DebugLog("伤血队员死亡超过伤血保护时长,不计!playerID=%s" % playerID)
|
| | | continue
|
| | | |
| | | #if curTeamPlayer.GetHP() > 0 and self.GetIsInRefreshPoint(curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), refreshPoint):
|
| | | if self.GetIsInRefreshPoint(curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), refreshPoint):
|
| | | #GameWorld.DebugLog("有队员在boss范围内,保留队伍伤血!teamID=%s,playerID=%s" % (teamID, curTeamPlayer.GetPlayerID()))
|
| | |
| | | #获得伤血对象
|
| | | hurtObj = npcHurtList.GetHurtAt(index)
|
| | |
|
| | | curPlayer, curTeam = self.__GetTagByHurtObj(hurtObj, False)
|
| | | curPlayer, curTeam = self.__GetTagByHurtObj(hurtObj, True)
|
| | |
|
| | | if curPlayer or curTeam:
|
| | | return hurtObj
|
| | |
| | | # @remarks 设置对象奖励
|
| | | def __GiveObjPrize(self):
|
| | | curNPC = self.__Instance
|
| | | objID = curNPC.GetID()
|
| | | #objID = curNPC.GetID()
|
| | | npcID = curNPC.GetNPCID()
|
| | | self.__LastHurtPlayer = self.__FindLastTimeHurtObjEx()
|
| | | self.__MaxHurtPlayer = self.__FindBossMaxHurtObj() # py自定义伤血所得到的Boss最大伤血玩家
|
| | |
|
| | | self.__AllKillerDict, curTeam, hurtType, hurtID = self.__FindNPCKillerInfo()
|
| | | #isLog = self.__GetIsLog()
|
| | | #if isLog:
|
| | | # GameWorld.Log("__GiveObjPrize npcID=%s,hurtType=%s,hurtID=%s,allKillPlayer=%s,curTeam=%s" |
| | | # % (npcID, hurtType, hurtID, self.__AllKillerDict.keys(), curTeam.GetTeamID() if curTeam else None))
|
| | | |
| | | # 归属队伍时,有击杀次数限制的NPC特殊处理
|
| | | if hurtType == ChConfig.Def_NPCHurtTypeTeam and curTeam:
|
| | | if ChConfig.IsGameBoss(curNPC) and GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_MaxHurt:
|
| | | #if isLog:
|
| | | # GameWorld.DebugLog("击杀boss有次数限制的NPC,队伍人数=%s" % (curTeam.GetMemberCount()))
|
| | | memInfoList = []
|
| | | for i in xrange(curTeam.GetMemberCount()):
|
| | | curTeamPlayer = curTeam.GetMember(i)
|
| | | if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0:
|
| | | #if isLog:
|
| | | # GameWorld.DebugLog(" i=%s,队员不存在!" % i)
|
| | | memInfoList.append(None)
|
| | | continue
|
| | | findBuff = SkillCommon.FindBuffByID(curTeamPlayer, ChConfig.Def_SkillID_DropOwnerBuff)[0]
|
| | | if not findBuff:
|
| | | #if isLog:
|
| | | # GameWorld.DebugLog(" i=%s,找不到归属buff!" % i, curTeamPlayer.GetPlayerID())
|
| | | memInfoList.append([curTeamPlayer.GetPlayerID(), "Not DropOwnerBuff"])
|
| | | continue
|
| | | #同一张地图可能有多个boss,该队伍可能同时在打多个boss,且都获得归属,所以需判断归属的buff所对应的NPC实例ID
|
| | | if findBuff.GetOwnerType() != IPY_GameWorld.gotNPC or findBuff.GetOwnerID() != objID:
|
| | | #if isLog:
|
| | | # GameWorld.DebugLog(" i=%s,不同归属bossBuff,不能设置归属!objID=%s,curBuffOwnerID=%s" |
| | | # % (i, objID, findBuff.GetOwnerID()), curTeamPlayer.GetPlayerID())
|
| | | #GameWorld.DebugLog("不同归属bossbuff,不能设置归属!objID=%s,curBuffOwnerID=%s" |
| | | # % (objID, findBuff.GetOwnerID()), curTeamPlayer.GetPlayerID())
|
| | | memInfoList.append([curTeamPlayer.GetPlayerID(), {"OwnerType":findBuff.GetOwnerType(), "OwnerID":findBuff.GetOwnerID()}])
|
| | | continue
|
| | | playerID = curTeamPlayer.GetPlayerID()
|
| | | if playerID not in self.__AllKillerDict:
|
| | | self.__AllKillerDict[playerID] = curTeamPlayer
|
| | | memInfoList.append([playerID, 1])
|
| | | |
| | | curTeam = None
|
| | | hurtType, hurtID = ChConfig.Def_NPCHurtTypeSpecial, 0
|
| | | |
| | | if not self.__AllKillerDict:
|
| | | GameWorld.ErrLog("归属异常队伍信息: objID=%s,npcID=%s, %s" % (objID, npcID, memInfoList))
|
| | |
|
| | | #最后一击处理
|
| | | self.__DoLastTimeHurtLogic()
|
| | |
| | | def __FindNPCKillerInfo(self):
|
| | | curNPC = self.__Instance
|
| | | npcID = curNPC.GetNPCID()
|
| | | objID = curNPC.GetID()
|
| | | key = (GameWorld.GetGameWorld().GetLineID(), objID, npcID)
|
| | | if key in PyGameData.g_npcKillerInfo:
|
| | | killerDict, killTeam, hurtType, hurtID = PyGameData.g_npcKillerInfo.pop(key)
|
| | | teamID = killTeam.GetTeamID() if killTeam else 0
|
| | | GameWorld.Log("NPC被击杀,归属信息: key=%s,playerIDList=%s,teamID=%s,hurtType=%s,hurtID=%s" |
| | | % (key, killerDict.keys(), teamID, hurtType, hurtID))
|
| | | return killerDict, killTeam, hurtType, hurtID
|
| | |
|
| | | hurtType = 0
|
| | | hurtID = 0
|
| | |
| | | # @param maxHurtObj 最大伤血对象
|
| | | # @return 返回值, 伤血对象
|
| | | # @remarks 获得伤血对象,支持抢怪
|
| | | def __GetTagByHurtObj(self, maxHurtObj, isLog=True):
|
| | | def __GetTagByHurtObj(self, maxHurtObj, isCheckRefreshArea=False):
|
| | | #获得死亡的NPC
|
| | | curNPC = self.__Instance
|
| | | # 伤害的obj类型元组(玩家, 队伍)
|
| | | hurtObjTuple = (None, None)
|
| | | #isLog = self.__GetIsLog() and isLog
|
| | | if maxHurtObj == None:
|
| | | GameWorld.DebugLog("伤血对象错误,npcID=%s" % (curNPC.GetNPCID()))
|
| | | return hurtObjTuple
|
| | |
|
| | | refreshPoint = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
|
| | | #最大伤血类型
|
| | | maxHurtValueType = maxHurtObj.GetValueType()
|
| | |
|
| | |
| | | curPlayer = GameWorld.GetObj(maxHurtObj.GetValueID(), IPY_GameWorld.gotPlayer)
|
| | |
|
| | | if curPlayer == None:
|
| | | #if isLog:
|
| | | # GameWorld.DebugLog("无法找到玩家,npcID=%s" % (curNPC.GetNPCID()))
|
| | | return hurtObjTuple
|
| | |
|
| | | #支持抢怪,个人杀死,但自己死亡,不算
|
| | | if curPlayer.GetHP() <= 0 :
|
| | | #if isLog:
|
| | | # GameWorld.DebugLog("玩家已死亡!playerID=%s" % curPlayer.GetPlayerID())
|
| | | if curPlayer.GetHP() <= 0 or curPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
|
| | | return hurtObjTuple
|
| | |
|
| | | if isCheckRefreshArea:
|
| | | if not self.GetIsInRefreshPoint(curPlayer.GetPosX(), curPlayer.GetPosY(), refreshPoint):
|
| | | return hurtObjTuple
|
| | | #如果玩家已经超出指定距离,不加经验
|
| | | if GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(),
|
| | | elif GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(),
|
| | | curPlayer.GetPosX(), curPlayer.GetPosY()) > ChConfig.Def_Team_GetExpScreenDist:
|
| | | #if isLog:
|
| | | # GameWorld.DebugLog("玩家已经超出指定距离,npcPos(%s,%s),playerPos(%s,%s)" % (curNPC.GetPosX(), curNPC.GetPosY(), curPlayer.GetPosX(), curPlayer.GetPosY()))
|
| | | return hurtObjTuple
|
| | |
|
| | | #正常返回
|
| | |
| | | teamID = maxHurtObj.GetValueID()
|
| | | curTeam = GameWorld.GetTeamManager().FindTeam(teamID)
|
| | | if curTeam == None:
|
| | | #if isLog:
|
| | | # GameWorld.Log("该队伍异常不存在!npcID=%s,teamID=%s" % (curNPC.GetNPCID(), teamID))
|
| | | return hurtObjTuple
|
| | |
|
| | | #组队成员检查
|
| | | playerlist = PlayerControl.GetAreaTeamMember(curTeam, curNPC.GetPosX(), curNPC.GetPosY())
|
| | | if len(playerlist) == 0 :
|
| | | #所有队伍成员,均超过获得奖励距离,或者全部死亡
|
| | | #遍历队伍,半径为一屏半的距离内的所有队伍/团队成员,可以获得经验
|
| | | for i in xrange(curTeam.GetMemberCount()):
|
| | | curTeamPlayer = curTeam.GetMember(i)
|
| | | if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0:
|
| | | continue
|
| | | |
| | | if curTeamPlayer.GetHP() <= 0 or curTeamPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
|
| | | continue
|
| | | |
| | | if isCheckRefreshArea:
|
| | | if not self.GetIsInRefreshPoint(curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), refreshPoint):
|
| | | continue
|
| | | elif GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTeamPlayer.GetPosX(),
|
| | | curTeamPlayer.GetPosY()) > ChConfig.Def_Team_GetExpScreenDist:
|
| | | continue
|
| | | |
| | | hurtObjTuple = (None, curTeam)
|
| | | return hurtObjTuple
|
| | |
|
| | | #正常返回
|
| | | hurtObjTuple = (None, curTeam)
|
| | | return hurtObjTuple
|
| | |
|
| | | #最大伤血对象是NPC,那么一定不给经验(玩家的召唤兽伤血算玩家)
|
| | | elif maxHurtValueType == ChConfig.Def_NPCHurtTypeNPC:
|
| | | #if isLog:
|
| | | # GameWorld.DebugLog("最大伤血对象是NPC...valueID=%s" % maxHurtObj.GetValueID())
|
| | | return hurtObjTuple
|
| | |
|
| | | #异常信息,添加伤血类型错误
|
| | | else:
|
| | | pass
|
| | | #if isLog:
|
| | | # GameWorld.Log("异常信息,伤血类型错误 maxHurtValueType = %s" % (maxHurtValueType))
|
| | |
|
| | | return hurtObjTuple
|
| | |
|
| | |
| | | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillWorldBoss, 1)
|
| | | # 每日活动
|
| | | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_WorldBOSS)
|
| | | PlayerMagicWeapon.SetMWPrivilegeData(curPlayer, ChConfig.MWPrivilege_KillBossAddAttr, 1, True)
|
| | | PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_WorldBOSS, 1)
|
| | | PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_WorldBoss, 1)
|
| | | elif limitIndex == 1: #BOSS之家
|
| | |
| | | # @param None
|
| | | # @param None
|
| | | def SyncCollectionItemInfo(curPlayer, addExp, addMoney, addZhenQi, syncItemInfoList, collectNPCID=0):
|
| | | return #暂不同步
|
| | | if addExp <= 0 and addMoney <= 0 and addZhenQi <= 0 and not syncItemInfoList:
|
| | | return
|
| | |
|
| | |
| | | collectNPCIDTimeLimit = ReadChConfig.GetEvalChConfig('CollectNPCIDTimeLimit')
|
| | | npcIDList = collectNPCIDTimeLimit.keys()
|
| | |
|
| | | if funcTypeList:
|
| | | collection = ChPyNetSendPack.tagMCFuncNPCCollectionCnt()
|
| | | for fType in funcTypeList:
|
| | | todayCollTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcCollTime % fType)
|
| | | collection.Clear()
|
| | | collection.FuncType = fType
|
| | | collection.CollectionCnt = todayCollTime
|
| | | collection.BuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcBuyTime % fType)
|
| | | NetPackCommon.SendFakePack(curPlayer, collection)
|
| | | # if funcTypeList:
|
| | | # collection = ChPyNetSendPack.tagMCFuncNPCCollectionCnt()
|
| | | # for fType in funcTypeList:
|
| | | # todayCollTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcCollTime % fType)
|
| | | # collection.Clear()
|
| | | # collection.FuncType = fType
|
| | | # collection.CollectionCnt = todayCollTime
|
| | | # collection.BuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcBuyTime % fType)
|
| | | # NetPackCommon.SendFakePack(curPlayer, collection)
|
| | |
|
| | | if npcIDList:
|
| | | npcIDCollInfo = ChPyNetSendPack.tagMCNPCIDCollectionCntInfo()
|
| | |
| | | NetPackCommon.SendFakePack(curPlayer, npcInfoPack)
|
| | | return
|
| | |
|
| | |
|
| | | ## 获取本地图NPC数量
|
| | | # @param queryNPCIDList:查询的NPCID列表
|
| | | # @param tick
|
| | | # @return {NPCID:cnt}
|
| | | def GetNPCCntInfo(queryNPCIDList, tick):
|
| | | npcCntDict = {}
|
| | |
|
| | | if not queryNPCIDList:
|
| | | return npcCntDict
|
| | | |
| | | gameNPCManager = GameWorld.GetNPCManager()
|
| | | GameWorld.DebugLog("GetNPCCntInfo...queryNPCIDList=%s" % (str(queryNPCIDList)))
|
| | |
|
| | | for index in xrange(gameNPCManager.GetNPCCount()):
|
| | | curNPC = gameNPCManager.GetNPCByIndex(index)
|
| | | curID = curNPC.GetID()
|
| | | if curID == 0:
|
| | | continue
|
| | | |
| | | curNPCID = curNPC.GetNPCID()
|
| | | |
| | | if curNPCID not in queryNPCIDList:
|
| | | continue
|
| | | if curNPC.GetCurAction() == IPY_GameWorld.laNPCDie or not curNPC.IsAlive():
|
| | | continue
|
| | | npcCntDict[curNPCID] = npcCntDict.get(curNPCID, 0) + 1
|
| | | |
| | | GameWorld.DebugLog(" npcCntDict=%s" % (str(npcCntDict)))
|
| | | return npcCntDict
|
| | |
|
| | | ## 同步地图NPC数量信息
|
| | | # @param curPlayer:采集玩家实例
|
| | | # @param mapID:
|
| | | # @param npcInfoDict:
|
| | | # @return None
|
| | | def SyncNPCCntInfo(curPlayer, mapID, npcCntDict):
|
| | | npcInfoPack = ChPyNetSendPack.tagMCNPCCntList()
|
| | | npcInfoPack.Clear()
|
| | | npcInfoPack.MapID = mapID
|
| | | npcInfoPack.NPCInfoList = []
|
| | |
|
| | | for npcid, npcCnt in npcCntDict.items():
|
| | | npcInfo = ChPyNetSendPack.tagMCNPCCntInfo()
|
| | | npcInfo.Clear()
|
| | | npcInfo.NPCID = npcid
|
| | | npcInfo.Cnt = npcCnt
|
| | | npcInfoPack.NPCInfoList.append(npcInfo)
|
| | | |
| | | npcInfoPack.NPCInfoCnt = len(npcInfoPack.NPCInfoList)
|
| | | NetPackCommon.SendFakePack(curPlayer, npcInfoPack)
|
| | | return
|
| | |
|
| | | def SendGameServerGoodItemRecord(mapID, npcID, playerName, playerID, itemID, equipInfo=[]):
|
| | | # @param equipInfo: [equipPlace, itemClassLV, itemColor, itemQuality, itemUserData]
|
| | | # GameWorld.DebugLog("检查物品是否发送GameServer: mapID=%s, npcID=%s, playerName=%s, itemID=%s"
|