| | |
| | | import FBCommon
|
| | | import PlayerActivity
|
| | | import PlayerSuccess
|
| | | import BossHurtMng
|
| | | import PlayerPrestigeSys
|
| | | import GY_Query_BossFirstKill
|
| | | import GameLogic_FamilyInvade
|
| | | import GameLogic_GatherSoul
|
| | | import FormulaControl
|
| | | import PlayerBossReborn
|
| | | import PlayerFairyCeremony
|
| | | import PlayerCrossYaomoBoss
|
| | | import PlayerActCollectWords
|
| | | import PlayerNewFairyCeremony
|
| | | import GameLogic_CrossGrassland
|
| | | import PlayerActGarbageSorting
|
| | | import PlayerActBossTrial
|
| | | import PlayerTongTianLing
|
| | |
| | | import PlayerGoldInvest
|
| | | import PlayerWeekParty
|
| | | import NPCRealmRefresh
|
| | | import NPCHurtManager
|
| | | import PlayerActLogin
|
| | | import PlayerActTask
|
| | | import PlayerZhanling
|
| | | import FamilyRobBoss
|
| | | import IpyGameDataPY
|
| | | import PlayerGubao
|
| | | import PlayerState
|
| | | import TurnAttack
|
| | | import PyGameData
|
| | | import PlayerTeam
|
| | | import NPCHurtMgr
|
| | | import PlayerVip
|
| | | import GameObj
|
| | | import ChNPC
|
| | |
|
| | |
| | | gameFB = GameWorld.GetGameFB()
|
| | |
|
| | | if strengthenIpyData.GetIsStrengthenByPlayerCount():
|
| | | 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
|
| | | strengthenPlayerCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenPlayerCnt)
|
| | | if not strengthenPlayerCnt:
|
| | | GameWorld.ErrLog("NPC配置了按玩家人数成长类型,但是无法获取到对应的玩家人数!npcID=%s" % (npcID))
|
| | | return
|
| | |
|
| | | lvStrengthenType = strengthenIpyData.GetLVStrengthenType()
|
| | | # 根据世界等级
|
| | |
| | | for skillID in skillIDList:
|
| | | skillManager.LearnSkillByID(skillID)
|
| | | FBLogic.OnRandomRobotJob(curNPC, lineRobotJobDict)
|
| | | return
|
| | |
|
| | |
|
| | | def __DoGiveVSPlayerNPCSkill(curNPC, job, npcLV):
|
| | | skillManager = curNPC.GetSkillManager()
|
| | | jobSkillDict = IpyGameDataPY.GetFuncEvalCfg("XMZZRobotSkill", 1)
|
| | | if job not in jobSkillDict:
|
| | | return
|
| | | skillInfoDict = jobSkillDict[job]
|
| | | #{1:{(100, 101, 102, 103):1, 50000:100, 50100:200, 50400:300}, 2:{(200, 201, 202, 203):1, 55000:100, 55100:200, 55200:300}}
|
| | | skillIDList = []
|
| | | for skillInfo, needLV in skillInfoDict.items():
|
| | | if npcLV < needLV:
|
| | | continue
|
| | | if isinstance(skillInfo, int):
|
| | | skillIDList.append(skillInfo)
|
| | | else:
|
| | | skillIDList += list(skillInfo)
|
| | | GameWorld.DebugLog("给NPC技能: job=%s,npcLV=%s, %s" % (job, npcLV, skillIDList))
|
| | | for skillID in skillIDList:
|
| | | skillManager.LearnSkillByID(skillID)
|
| | | return
|
| | |
|
| | | def GiveKillNPCDropPrize(curPlayer, mapID, npcCountDict, exp_rate=None, mailTypeKey=None, isMail=False,
|
| | |
| | | #===============================================================================
|
| | |
|
| | | def GetDefaultMaxAngryNPCIDList():
|
| | | return GameLogic_FamilyInvade.GetDefaultMaxAngryNPCIDList()
|
| | | return []
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | ##NPC进入战斗状态
|
| | |
| | | #GameWorld.GetGameWorld().SetGameWorldDict(ChConfig.Map_NPC_WorldBossDeadTick % npcid, GameWorld.GetGameWorld().GetTick())
|
| | | #因为存在boss分流,所以用gameFB字典,但是存活状态还是用GameWorld字典
|
| | | GameWorld.GetGameFB().SetGameFBDict(ChConfig.Map_NPC_WorldBossDeadTick % npcid, GameWorld.GetGameWorld().GetTick())
|
| | | |
| | | if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
|
| | | FamilyRobBoss.ClearFamilyOwnerBossHurt(curNPC)
|
| | | |
| | | ChNPC.OnNPCSetDead(curNPC)
|
| | |
|
| | | if npcid == IpyGameDataPY.GetFuncCfg("CrossYaomoBoss", 1):
|
| | |
| | |
|
| | | # 清除队伍成员伤血列表
|
| | | AttackCommon.ClearTeamPlayerHurtValue(curNPC)
|
| | | # 清除自定义伤血列表
|
| | | #BossHurtMng.ClearHurtValueList(curNPC)
|
| | | NPCHurtManager.DeletePlayerHurtList(curNPC)
|
| | | NPCHurtMgr.DeletePlayerHurtList(curNPC)
|
| | | if curNPC.GetType() == ChConfig.ntRobot:
|
| | | lineID = GameWorld.GetGameWorld().GetLineID()
|
| | | lineRobotJobDict = PyGameData.g_fbRobotJobDict.get(lineID, {})
|
| | |
| | | key = ChConfig.Def_PDict_Boss_KillCnt % limitIndex
|
| | | newCnt = curPlayer.NomalDictGetProperty(key, 0) + 1
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, key, newCnt)
|
| | | BossHurtMng.NotifyAttackBossCnt(curPlayer, limitIndex)
|
| | | GameWorld.DebugLog("更新击杀Boss次数: index=%s, todayCnt=%s, totalCnt=%s" % (limitIndex, newCnt, totalCnt), curPlayer.GetPlayerID())
|
| | |
|
| | | dataDict = {"objID":npcID, "bossID":npcID, "touchCnt":newCnt, "totalCnt":totalCnt,
|
| | |
| | | # 每日活动
|
| | | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_WorldBOSS)
|
| | | PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_WorldBOSS, 1)
|
| | | PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_WorldBoss, 1)
|
| | | PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_WorldBoss, 1)
|
| | | PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_WorldBOSS, 1)
|
| | | PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_WorldBoss, 1)
|
| | | PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_WorldBOSS, 1)
|
| | |
| | | # 每日活动
|
| | | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_BOSSHome)
|
| | | PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_BOSSHome, 1)
|
| | | PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1)
|
| | | PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1)
|
| | | PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_BOSSHome, 1)
|
| | | PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_BossHome, 1)
|
| | | PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_BossHome, 1)
|
| | |
| | | #清除所有身上buff
|
| | | self.ClearAllBuff(isClearAuraBuff)
|
| | | curNPC = self.__Instance
|
| | | NPCHurtManager.ClearPlayerHurtList(curNPC)
|
| | | NPCHurtMgr.ClearPlayerHurtList(curNPC)
|
| | | return True
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | ipyData = IpyGameDataPY.GetIpyGameDataNotLog('BOSSInfo', curNPCID)
|
| | | if ipyData:
|
| | | GameServe_GameWorldBossState(curNPCID, 1)
|
| | | if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
|
| | | FamilyRobBoss.FamilyOwnerBossOnReborn(curNPC)
|
| | | |
| | | |
| | | # 检查是否有光环, 在重生时处理,不然可能导致有些无战斗逻辑的怪物无法套上光环buff
|
| | | skillManager = curNPC.GetSkillManager()
|
| | | for index in xrange(skillManager.GetSkillCount()):
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def SetHelpBattleRobotRebornAttr(self, fightPower):
|
| | | '''助战机器人只设置血量属性
|
| | | 血量算法,(助战玩家=助战机器人):每个副本配置伤害*(助战玩家战力/副本规定战力)*系数值 系数值暂定为50
|
| | | '''
|
| | | curNPC = self.__Instance
|
| | | mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
|
| | | funcLineID = FBCommon.GetFBPropertyMark()
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID)
|
| | | if not ipyData:
|
| | | return
|
| | | |
| | | SetSuppressFightPower(curNPC, fightPower)
|
| | | fbFightPower = ipyData.GetFightPowerMin()
|
| | | baseHurt = ipyData.GetRobotBaseHurt()
|
| | | hpCoefficient = ipyData.GetRobotHPCoefficient()
|
| | | maxHP = int(eval(IpyGameDataPY.GetFuncCompileCfg("HelpBattleRobot", 2)))
|
| | | GameWorld.DebugLog("设置助战机器人属性: objID=%s,fightPower=%s,maxHP=%s" % (curNPC.GetID(), fightPower, maxHP))
|
| | | GameObj.SetMaxHP(curNPC, maxHP)
|
| | | GameObj.SetHP(curNPC, maxHP)
|
| | | curNPC.Notify_HP()
|
| | | curNPC.Notify_MaxHP()
|
| | | return
|
| | | |
| | | # NPC移动速度特殊处理,只处理百分比不能处理固定值
|
| | | # 因为 ChConfig.TYPE_Calc_AttrSpeed 非服务端移动速度,偷懒处理法
|
| | | def RefreshNPCSpeed(self, allAttrList):
|
| | |
| | | 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
|
| | |
|
| | |
|
| | |
| | | npcID = curNPC.GetNPCID()
|
| | | #######################特殊NPC的处理
|
| | |
|
| | | #boss伤血排行榜击杀逻辑
|
| | | #BossHurtMng.BossOnKilled(curNPC)
|
| | | |
| | | #掉落需要用到摸怪,所以在处理掉落奖励之前设置
|
| | | self.__SetFeelNPCPlayerList()
|
| | |
|
| | |
| | | # 记录boss击杀信息的NPC
|
| | | bossIpyData = IpyGameDataPY.GetIpyGameDataListNotLog('BOSSInfo', npcID)
|
| | | if bossIpyData and mapID not in [ChConfig.Def_FBMapID_ZhuXianBoss, ChConfig.Def_FBMapID_SealDemon]:
|
| | | if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
|
| | | killerName = FamilyRobBoss.FamilyOwnerBossOnKilled(curNPC, self.__OwnerHurtID)
|
| | | #KillerJob = 0 if not self.__Killer else self.__Killer.GetJob()
|
| | | killerIDList = [player.GetPlayerID() for player in self.__ownerPlayerList]
|
| | | GameServer_KillGameWorldBoss(curNPC.GetNPCID(), killerName, 0, True, killerIDList)
|
| | |
|
| | | if npcID == IpyGameDataPY.GetFuncCfg("BossRebornServerBoss", 3):
|
| | | PlayerControl.WorldNotify(0, "BossRebornBossKilled", [curNPC.GetNPCID()])
|
| | |
|
| | | #===========================================================================================
|
| | | # # 暗金boss
|
| | | # if curNPC.GetIsBoss() == ChConfig.Def_NPCType_Boss_Dark:
|
| | | # #PlayerControl.WorldNotify(0, "Old_andyshao_861048", [curNPC.GetNPCID()])
|
| | | # if mapID == ChConfig.Def_MapID_DouHunTan:
|
| | | # NPCCustomRefresh.DoRefreshNeutralBoss(npcID)
|
| | | |
| | | #清空NPC的仇恨
|
| | | curNPC.GetNPCAngry().Clear()
|
| | | return
|
| | |
| | | curNPC = self.__Instance
|
| | | self.__FeelPlayerList = []
|
| | |
|
| | | npcHurtList = NPCHurtManager.GetPlayerHurtList(curNPC)
|
| | | npcHurtList = [] #NPCHurtManager.GetPlayerHurtList(curNPC)
|
| | | if not npcHurtList:
|
| | | npcHurtList = curNPC.GetPlayerHurtList()
|
| | | #npcHurtList.Sort() #这里不排序,只要有伤害就算
|
| | |
| | | return
|
| | |
|
| | | curNPC = self.__Instance
|
| | | |
| | | # VIP杀怪加攻
|
| | | PlayerVip.DoAddVIPKillLVExp(lastHurtPlayer, GetNPCLV(curNPC))
|
| | | |
| | | # SPֵ
|
| | | #PlayerControl.AddZhenQiByKillNPC(lastHurtPlayer, curNPC.GetSP())
|
| | | 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
|
| | |
|
| | |
| | | ## 测试查错日志,临时用
|
| | | ## 相关bug: 仙界秘境无经验、boss无掉落
|
| | | return ChConfig.IsGameBoss(self.__Instance)
|
| | | #return GameWorld.GetMap().GetMapID() == ChConfig.Def_FBMapID_BZZD or ChConfig.IsGameBoss(self.__Instance)
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | ## 普通组队给经验
|
| | |
| | | GameWorld.Log("检查Boss死亡: lineID=%s,objID=%s,npcID=%s,dropOwnerType=%s"
|
| | | % (GameWorld.GetGameWorld().GetLineID(), curNPC.GetID(), curNPC.GetNPCID(), dropOwnerType))
|
| | | #if dropOwnerType == ChConfig.DropOwnerType_MaxHurt:
|
| | | maxHurtInfo = NPCHurtManager.RefreshHurtList(curNPC, tick, refreshInterval, isDead, checkCanDead)
|
| | | if not maxHurtInfo:
|
| | | maxHurtInfo = NPCHurtMgr.RefreshHurtList(curNPC, tick, refreshInterval, isDead)
|
| | | |
| | | if maxHurtInfo:
|
| | | tagObj, ownerType, ownerID = maxHurtInfo
|
| | | #maxHurtInfo = NPCHurtManager.RefreshHurtList(curNPC, tick, refreshInterval, isDead, checkCanDead)
|
| | | #
|
| | | #if maxHurtInfo:
|
| | | # tagObj, ownerType, ownerID = maxHurtInfo
|
| | |
|
| | | elif dropOwnerType == ChConfig.DropOwnerType_Family:
|
| | | ownerInfo = FamilyRobBoss.RefreshFamilyOwnerNPCHurt(self, curNPC, tick, refreshInterval)
|
| | | if ownerInfo:
|
| | | tagObj, ownerFamilyID = ownerInfo
|
| | | ownerType, ownerID = ChConfig.Def_NPCHurtTypeFamily, ownerFamilyID
|
| | | |
| | | pass
|
| | | |
| | | elif dropOwnerType == ChConfig.DropOwnerType_Contend:
|
| | | tagObj = self.__RefreshContendOwner()
|
| | | if tagObj:
|
| | |
| | | if isDead:
|
| | | GameWorld.Log("Boss归属: key=%s,ownerType=%s,ownerID=%s" % (key, ownerType, ownerID))
|
| | |
|
| | | hurtList = NPCHurtManager.GetPlayerHurtList(curNPC)
|
| | | hurtList = [] #NPCHurtManager.GetPlayerHurtList(curNPC)
|
| | | # 刷新归属
|
| | | if ownerType == ChConfig.Def_NPCHurtTypePlayer:
|
| | | curPlayer = GameWorld.GetObj(ownerID, IPY_GameWorld.gotPlayer)
|
| | |
| | |
|
| | | # 采集耗时
|
| | | prepareTime = collectNPCIpyData.GetPrepareTime() * 1000
|
| | | collTimeReduceRate = PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_CollTimeReduceRate)
|
| | | if collTimeReduceRate:
|
| | | prepareTime = max(1000, int(prepareTime * (ShareDefine.Def_MaxRateValue - collTimeReduceRate) / float(ShareDefine.Def_MaxRateValue)))
|
| | | prepareType = IPY_GameWorld.pstCollecting if curNPC.GetType() == IPY_GameWorld.ntCollection else IPY_GameWorld.pstMissionCollecting
|
| | | PlayerControl.Sync_PrepareBegin(curPlayer, prepareTime, prepareType, prepareID=curNPC.GetID())
|
| | | if collectNPCIpyData.GetLostHPPer():
|
| | |
| | | return
|
| | |
|
| | | def DoGiveCollectNPCAward(curPlayer, npcID, collectNPCIpyData, collectCnt=1, crossCollectOK=False, isSweep=False):
|
| | | GameWorld.DebugLog("给采集奖励: npcID=%s,collectCnt=%s,crossCollectOK=%s" % (npcID, collectCnt, crossCollectOK))
|
| | | if collectCnt <= 0:
|
| | | return
|
| | |
|
| | | if collectNPCIpyData.GetIsMissionCollectNPC():
|
| | | #GameWorld.DebugLog("任务采集物暂不处理")
|
| | | return
|
| | | |
| | | isMaxTime = False # 是否达到了采集最大次数
|
| | | limitMaxTime = collectNPCIpyData.GetMaxCollectCount()
|
| | | if limitMaxTime > 0:
|
| | | todayCollTime = GetTodayCollectCount(curPlayer, npcID)
|
| | | canCollectCnt = max(0, limitMaxTime - todayCollTime)
|
| | | collectCnt = min(collectCnt, canCollectCnt)
|
| | | if collectCnt <= 0:
|
| | | GameWorld.DebugLog(" 该NPC已达到最大采集次数: npcID=%s,todayCollTime=%s,limitMaxTime=%s" % (npcID, todayCollTime, limitMaxTime))
|
| | | return
|
| | | |
| | | curCollTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcIDCollTime % npcID)
|
| | | updCollTime = curCollTime + collectCnt
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CollNpcIDCollTime % npcID, updCollTime)
|
| | | SyncCollNPCTime(curPlayer, [npcID])
|
| | | GameWorld.DebugLog(" 增加采集次数: npcID=%s,todayCollTime=%s,curCollTime=%s,updCollTime=%s" % (npcID, todayCollTime, curCollTime, updCollTime))
|
| | | isMaxTime = todayCollTime + collectCnt >= limitMaxTime
|
| | | |
| | | awardItemList = []
|
| | | collectAwardCfg = collectNPCIpyData.GetCollectAward()
|
| | | collectAppointAwardCfg = collectNPCIpyData.GetCollectAppointAward()
|
| | | if collectAppointAwardCfg:
|
| | | #缥缈草园的采集定制由缥缈寻访次数决定
|
| | | if collectNPCIpyData.GetCollectResetType() in [12, 14]:
|
| | | fairyDomainVisitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)
|
| | | grasslandCollectAppointCfg = collectAppointAwardCfg.get(fairyDomainVisitCnt, {})
|
| | | curCollTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcIDCollTime % npcID)
|
| | | if curCollTime in grasslandCollectAppointCfg:
|
| | | awardItemList.append(grasslandCollectAppointCfg[curCollTime])
|
| | | GameWorld.DebugLog(" 草园采集定制奖励: fairyDomainVisitCnt=%s,curCollTime=%s,awardItemList=%s" % (fairyDomainVisitCnt, curCollTime, awardItemList))
|
| | | else:
|
| | | collTotalTime = min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcIDCollTimeTotal % npcID) + 1, ChConfig.Def_UpperLimit_DWord)
|
| | | if collTotalTime in collectAppointAwardCfg:
|
| | | awardItemList.append(collectAppointAwardCfg[collTotalTime])
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CollNpcIDCollTimeTotal % npcID, collTotalTime)
|
| | | GameWorld.DebugLog(" 采集次数定制奖励: collTotalTime=%s,awardItemList=%s" % (collTotalTime, awardItemList))
|
| | | |
| | | if not awardItemList:
|
| | | alchemyDiffLV = collectNPCIpyData.GetAlchemyDiffLV()
|
| | | giveItemWeightList = ItemCommon.GetWeightItemListByAlchemyDiffLV(curPlayer, collectAwardCfg, alchemyDiffLV)
|
| | | GameWorld.DebugLog(" 常规采集物品权重列表: alchemyDiffLV=%s,collectAwardCfg=%s,giveItemWeightList=%s" % (alchemyDiffLV, collectAwardCfg, giveItemWeightList))
|
| | | giveItemInfo = GameWorld.GetResultByWeightList(giveItemWeightList)
|
| | | if giveItemInfo:
|
| | | awardItemList.append(giveItemInfo)
|
| | | |
| | | GameWorld.DebugLog(" 最终采集奖励: awardItemList=%s" % awardItemList)
|
| | | jsonItemList = []
|
| | | if awardItemList:
|
| | | for itemID, itemCount, isAuctionItem in awardItemList:
|
| | | if ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem]):
|
| | | jsonItemList.append(ItemCommon.GetJsonItem([itemID, itemCount, isAuctionItem]))
|
| | | |
| | | if not isSweep:
|
| | | if collectNPCIpyData.GetNotifyCollectResult():
|
| | | awardPack = ChPyNetSendPack.tagMCCollectAwardItemInfo()
|
| | | awardPack.CollectNPCID = npcID
|
| | | for itemID, itemCount, isAuctionItem in awardItemList:
|
| | | awardItem = ChPyNetSendPack.tagMCCollectAwardItem()
|
| | | awardItem.ItemID = itemID
|
| | | awardItem.Count = itemCount
|
| | | awardItem.IsAuctionItem = isAuctionItem
|
| | | awardPack.AwardItemList.append(awardItem)
|
| | | awardPack.Count = len(awardPack.AwardItemList)
|
| | | NetPackCommon.SendFakePack(curPlayer, awardPack)
|
| | | GameLogic_CrossGrassland.RecordGrasslandAward(curPlayer, awardItemList)
|
| | | else:
|
| | | GameWorld.ErrLog("采集物品没有奖励!npcID=%s" % (npcID))
|
| | | |
| | | #采集成就
|
| | | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Collect, collectCnt, [npcID])
|
| | | if crossCollectOK:
|
| | | PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_CrossCollect)
|
| | | #SyncCollectionItemInfo(curPlayer, addExp, addMoney, addZhenQi, giveItemInfoList, npcID)
|
| | | |
| | | if not isSweep:
|
| | | GameLogic_CrossGrassland.DecCustomSceneNPCCount(curPlayer, npcID)
|
| | | if isMaxTime:
|
| | | GameLogic_CrossGrassland.DoCheckUpdateGrasslandEnd(curPlayer)
|
| | | |
| | | return jsonItemList
|
| | | return
|
| | |
|
| | | ## 采集结果同步
|
| | | # @param None
|
| | |
| | | buyTimesVIPPriID = IpyGameDataPY.GetFuncEvalCfg("KillBossCntLimit1", 1, {}).get(killBossMark)
|
| | | if not buyTimesVIPPriID:
|
| | | return
|
| | | canBuyCnt = PlayerVip.GetPrivilegeValue(curPlayer, buyTimesVIPPriID)
|
| | | canBuyCnt = 0
|
| | | canBuyCnt += PlayerGoldInvest.GetAddBossBuyCnt(curPlayer, killBossMark)
|
| | | hasBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntBuyCnt%killBossMark, 0)
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | if hasBuyCnt >= canBuyCnt:
|
| | | GameWorld.DebugLog('购买BOSS可击杀次数, 已达到今日最大可购买次数,hasBuyCnt=%s, canBuyCnt=%s'%(hasBuyCnt, canBuyCnt), playerID)
|
| | | return
|
| | | canKillCnt, dayTimesLimit = BossHurtMng.GetCanKillBossCnt(curPlayer, killBossMark)
|
| | | if canKillCnt >= dayTimesLimit:
|
| | | GameWorld.DebugLog('购买BOSS可击杀次数, 剩余次数已满!,canKillCnt=%s'%(canKillCnt), playerID)
|
| | | return
|
| | |
|
| | | costGold = IpyGameDataPY.GetFuncEvalCfg("KillBossCntLimit1", 2, {}).get(killBossMark)
|
| | |
| | | return
|
| | | # 增加购买次数
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Boss_KillCntBuyCnt%killBossMark, hasBuyCnt + 1)
|
| | | BossHurtMng.NotifyAttackBossCnt(curPlayer, killBossMark)
|
| | |
|
| | | CrossPlayerData.SendMergePlayerDataNow(curPlayer)
|
| | | return
|
| | |
| | | GameWorld.DebugLog("通知GameServer地图Boss分流信息: mapID=%s,lineID=%s,shuntPlayerDict=%s" % (mapID, lineID, shuntPlayerDict), lineID)
|
| | | return
|
| | |
|
| | | def NPCSpeedChangeNotify(curNPC, speed):
|
| | | ##通知NPC速度
|
| | | GameObj.NotifyObjInfoRefresh(curNPC, IPY_GameWorld.CDBPlayerRefresh_Speed, speed)
|
| | | return
|
| | |
|
| | | def UpdateNPCAttackCount(curPlayer, npcID, attackCount, maxCount=0):
|
| | | ## 更新玩家攻击NPC次数
|
| | | if not npcID:
|
| | | return
|
| | | GameWorld.DebugLog("更新玩家攻击NPC次数: npcID=%s,attackCount=%s,maxCount=%s" % (npcID, attackCount, maxCount))
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_NPCAttackCount % npcID, attackCount)
|
| | | |
| | | if GameWorld.IsCrossServer():
|
| | | serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
|
| | | msgInfo = {"PlayerID":curPlayer.GetPlayerID(), "NPCID":npcID, "AttackCount":attackCount, "MaxCount":maxCount}
|
| | | GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_NPCAttackCount, msgInfo, [serverGroupID])
|
| | | else:
|
| | | SyncNPCAttackCount(curPlayer, [npcID])
|
| | | if attackCount and attackCount >= maxCount:
|
| | | GameLogic_CrossGrassland.DoCheckUpdateGrasslandEnd(curPlayer)
|
| | | return
|
| | |
|
| | | def CrossServerMsg_NPCAttackCount(curPlayer, msgData):
|
| | |
| | | # @param curNPC 被攻击NPC
|
| | | # @return None
|
| | | def __OnAttackedDropItem(atkObj, curNPC):
|
| | | attackPlayer, npcObjType = AttackCommon.GetAttackPlayer(atkObj)
|
| | | if npcObjType:
|
| | | return
|
| | | if not attackPlayer:
|
| | | return
|
| | | npcID = curNPC.GetNPCID()
|
| | | ipyData = IpyGameDataPY.GetIpyGameDataNotLog("TreasureNPC", npcID)
|
| | | if not ipyData:
|
| | | return
|
| | | attackCountDropWeightInfo = ipyData.GetAttackCountDropWeightInfo()
|
| | | attackDropWeightList = ipyData.GetAttackDropWeightList()
|
| | | attackDropWeightListEx = ipyData.GetAttackDropWeightListEx()
|
| | | dropCountEx = ipyData.GetDropCountEx()
|
| | | alchemyDiffLV = ipyData.GetAlchemyDiffLV()
|
| | | |
| | | mainItemWeightList = []
|
| | | if attackCountDropWeightInfo:
|
| | | maxCount = max(attackCountDropWeightInfo)
|
| | | attackCount = attackPlayer.NomalDictGetProperty(ChConfig.Def_PDict_NPCAttackCount % npcID) + 1
|
| | | if attackCount <= maxCount:
|
| | | if attackCount in attackCountDropWeightInfo:
|
| | | mainItemWeightList = attackCountDropWeightInfo[attackCount]
|
| | | UpdateNPCAttackCount(attackPlayer, npcID, attackCount, maxCount)
|
| | | |
| | | if mainItemWeightList:
|
| | | mainItemWeightList = ItemCommon.GetWeightItemListByAlchemyDiffLV(attackPlayer, mainItemWeightList, alchemyDiffLV)
|
| | | elif attackDropWeightList:
|
| | | mainItemWeightList = ItemCommon.GetWeightItemListByAlchemyDiffLV(attackPlayer, attackDropWeightList, alchemyDiffLV)
|
| | | |
| | | mainItemInfo = GameWorld.GetResultByWeightList(mainItemWeightList)
|
| | | |
| | | if not mainItemInfo:
|
| | | notDropNotify = ipyData.GetNotDropNotify()
|
| | | if notDropNotify:
|
| | | PlayerControl.NotifyCode(attackPlayer, notDropNotify)
|
| | | return
|
| | | |
| | | dropItemList = []
|
| | | if mainItemInfo:
|
| | | dropItemList.append(mainItemInfo)
|
| | | |
| | | if attackDropWeightListEx and dropCountEx:
|
| | | weightListEx = ItemCommon.GetWeightItemListByAlchemyDiffLV(attackPlayer, attackDropWeightListEx, alchemyDiffLV)
|
| | | for _ in xrange(dropCountEx):
|
| | | itemInfo = GameWorld.GetResultByWeightList(weightListEx)
|
| | | if itemInfo:
|
| | | dropItemList.append(itemInfo)
|
| | | |
| | | if not dropItemList:
|
| | | return
|
| | | |
| | | mapID = PlayerControl.GetCustomMapID(attackPlayer)
|
| | | if mapID:
|
| | | DoGiveItemByVirtualDrop(attackPlayer, dropItemList, npcID)
|
| | | GameLogic_CrossGrassland.RecordGrasslandAward(attackPlayer, dropItemList)
|
| | | else:
|
| | | dropPosX, dropPosY = curNPC.GetPosX(), curNPC.GetPosY()
|
| | | ChItem.DoMapDropItem(attackPlayer, dropItemList, npcID, dropPosX, dropPosY, isOnlySelfSee=False)
|
| | | return
|
| | |
|
| | | |