local BattlePropSystem = require "Battle/Logic/Entity/System/BattlePropSystem" local EventSystem = require('Event/EventSystem') local dragon_artery = require('Proto/dragon_artery_pb') local Base = require("Battle/Logic/Level/LevelFunction/SyncLevelFunction") local SyncDragonArteryLevelFunction = class("SyncDragonArteryLevelFunction",Base) local EStatisticType = LuaConst.EStatisticType local DRAGON_ARTERY_BOSS_NUM = 4 local DRAGON_ARTERY_BOSS_FEATURE = 142 local MIDDLE_BOSS_FEATURE = 141 local MIDDLE_BOSS_DRIVED_CHARID = 37103141 local TRANSPORT_POINT_ITEM_GROUP = 6501 local BattleProp_Convey = 21 local BattleProp_Gather = 22 local Const_KillerDeBuff = {100094, 100095} -- 给杀人者加上的debuff local SUICIDE_REVIVE_HP_FACTOR = 0.1 -- 自杀后获得图腾导致的复活保留的血量 local CarryScoreEachTime = DataSheetManager.ConstData:GetDataByID("DragonArteryGotPoint").IntListValue[1] local CarryScoreGotInterval = DataSheetManager.ConstData:GetDataByID("DragonArteryGotPoint").IntListValue[2] local DragonArteryBossKillScore = DataSheetManager.ConstData:GetDataByID("DragonArteryKillABoss").IntValue local MiddleBossKillScore = DataSheetManager.ConstData:GetDataByID("DragonArteryKillBBoss").IntValue local GodPropGotScore = DataSheetManager.ConstData:GetDataByID("DragonArteryGotSkill").IntValue local KillHeroScore = DataSheetManager.ConstData:GetDataByID("DragonArteryKill1").IntValue local AssistKillHeroScore = DataSheetManager.ConstData:GetDataByID("DragonArteryKill2").IntValue local DragonArteryWinFrame = DataSheetManager.ConstData:GetDataByID("DragonArteryWinTime").IntValue * LuaConst.LogicFrameRate local DragonArteryGodPropIdList = DataSheetManager.ConstData:GetDataByID("DragonArteryGodPropID").IntListValue local FPZero = FP.Const.Zero function SyncDragonArteryLevelFunction:GetExpClass() return require "Battle/Expression/ExpLevel/ExpLevelFunction/ExpSyncDragonArteryLevelFunction" end function SyncDragonArteryLevelFunction:InitLevel() Base.InitLevel(self) self.isFreeToEnterAndLeave = true self.retainWhenQuitRoom = true self.dontStartAutoFightWhenRetain = true --退出时不开启自动战斗 self.LevelReviveType = LuaConst.LevelReviveType.SelectOne --复活界面风格是3选1 self.isSwitchOneReviveNeerBy = true -- 复活的地点为 出生点 。 self.shouldReviveAtNearestBornPoint = true --复活地点为最近的复活点 self.dragonArteryIndex = LogicRandom.GetIntegerValue(nil, 1, DRAGON_ARTERY_BOSS_NUM , 989898545) --随出第几个死的boss会掉落玉玺 self.deadBossCount = 0 self.dragonArteryEntity = nil --持有玉玺的单位 self.dragonArteryPlayerID = nil --持有玉玺的玩家ID self.dragonArteryPlayerComboFrame = 0 --连续持有玉玺帧数时长 self.dragonArteryDurationReachLimitPlayerID = nil --持续持有玉玺到达胜利时长要求的玩家ID self.dragonArteryPlayerChangedCount = 0 self.bossDmgRecordDic = {} --对boss造成伤害的记录字典 key = playerID, value是一个dic,key是boss的entityID,value是对这个boss造成的伤害 self.deadBossRecord = {} --记录死掉的boss self.dragonArteryLevelBornedBossList = {} --出生过的boss列表,包含已经死掉了的 self.summonerList = {} --发起过召唤的玩家list,越新的发起玩家在越后面 self.dragonArteryBossAssistScoreInfoList = {} local prefix = "DragonArteryKillABoss_" --杀boss得分配置的前缀 for i=1,99 do --最多支持99段,正常情况下会提前跳出 local ID = prefix .. i local has, info = DataSheetManager.ConstData:TryGetDataByID(ID) if has then table.insert(self.dragonArteryBossAssistScoreInfoList, info.IntListValue) else break end end self.middleBossAssistScoreInfoList = {} prefix = "DragonArteryKillBBoss_" for i=1,99 do --最多支持99段,正常情况下会提前跳出 local ID = prefix .. i local has, info = DataSheetManager.ConstData:TryGetDataByID(ID) if has then table.insert(self.middleBossAssistScoreInfoList, info.IntListValue) else break end end end function SyncDragonArteryLevelFunction:SetSelectOneReviveParam() self.RebornBaseTime = DataSheetManager.ConstData:GetDataByID("DragonArteryHeroRebornBaseTime").IntValue -- 基础复活时间 s self.RebornExtraTime = DataSheetManager.ConstData:GetDataByID("DragonArteryHeroRebornExtraTime").IntValue -- 死亡次数额外附加时间 s self.RebornMaxTime = DataSheetManager.ConstData:GetDataByID("DragonArteryHeroRebornMaxTime").IntValue -- 最大复活时间 end function SyncDragonArteryLevelFunction:AfterLevelLayoutInited() Base.AfterLevelLayoutInited(self) self.transportLevelItemIDList = LevelItemManager.GetItemIDListByGroup(TRANSPORT_POINT_ITEM_GROUP, LuaConst.LevelItemType.TargetPoint) if self.transportLevelItemIDList then self.transportPosList = {} local item for i,itemId in ipairs(self.transportLevelItemIDList) do item = LevelItemManager.GetItemByID(itemId) if item then table.insert(self.transportPosList, item.ItemData.ItemPos) end end end end function SyncDragonArteryLevelFunction:InitPlayerStatistic(statistic) Base.InitPlayerStatistic(self, statistic) statistic[EStatisticType.DragonArteryFrame] = 0 statistic[EStatisticType.DragonArteryBossKillNum] = 0 statistic[EStatisticType.DragonArteryMiddleBossKillNum] = 0 statistic[EStatisticType.DragonArteryMiddleBossAssist] = 0 statistic[EStatisticType.DragonArteryGodPropGotNum] = 0 end function SyncDragonArteryLevelFunction:OnCreatePlayer(playerID) Base.OnCreatePlayer(self, playerID) SystemManager.SetFightMode(playerID, LuaConst.EFightMode.ALL, true) end function SyncDragonArteryLevelFunction:IsDragonArteryBoss(entity) return entity:IsMonster() and entity:GetOriginCharacterData().MonsterType == DRAGON_ARTERY_BOSS_FEATURE end function SyncDragonArteryLevelFunction:IsMiddleBoss(entity) return entity:IsMonster() and entity:GetOriginCharacterData().MonsterType == MIDDLE_BOSS_FEATURE end function SyncDragonArteryLevelFunction:IsGodProp(propData) for i,v in ipairs(DragonArteryGodPropIdList) do if v == propData.ID then return true end end return false end function SyncDragonArteryLevelFunction:IsDragonArteryPlayer(playerID) return self.dragonArteryPlayerID and self.dragonArteryPlayerID == playerID end function SyncDragonArteryLevelFunction:GetSelectOneRevivePunishTime() return DataSheetManager.ConstData:GetDataByID("DragonArteryDeathPunishTime").IntValue -- 死亡惩罚时长 end local _tempCarryScore = FP.newV1(0) local _tempHpDmgPercent = FP.newV1(0) local _tempMinPercent = FP.newV1(0) local _tempMaxPercent = FP.newV1(0) function SyncDragonArteryLevelFunction:GetScore(playerID) -- body local score = 0 local statistic = self.PlayerStatisticDic[playerID] if statistic then if statistic[EStatisticType.DragonArteryFrame] > 0 then self:GetDragonArteryPlayerCarryScoreFP(playerID, statistic, _tempCarryScore) score = score + FP.tonumberV1(_tempCarryScore) end if statistic[EStatisticType.DragonArteryBossKillNum] > 0 or statistic[EStatisticType.DragonArteryMiddleBossKillNum] > 0 then score = score + self:GetDragonArteryBossKillScore(playerID, statistic) end if statistic[EStatisticType.DragonArteryGodPropGotNum] > 0 then score = score + self:GetGodPropScore(playerID, statistic) end if statistic[EStatisticType.HeroKillNum] > 0 then score = score + self:GetKillHeroScore(playerID, statistic) end if statistic[EStatisticType.AssistHeroKillNum] > 0 then score = score + self:GetAssistHeroKillScore(playerID, statistic) end score = score + self:GetAssistBossKillScore(playerID) end return score end function SyncDragonArteryLevelFunction:GetAssistBossKillScore(playerID) local bossAssistScore = 0 local bossDmgRecord = self.bossDmgRecordDic[playerID] if bossDmgRecord then local deadBoss local scoreInfoList for entityID, dmgValue in pairs(bossDmgRecord) do --pairs safe 数值计算对顺序不敏感 deadBoss = self.deadBossRecord[entityID] if deadBoss then _tempHpDmgPercent:Reset(dmgValue):Div(deadBoss:GetAttrValue(LuaConst.AttrType.hplmt)):Mul(100) if self:IsDragonArteryBoss(deadBoss) then scoreInfoList = self.dragonArteryBossAssistScoreInfoList elseif self:IsMiddleBoss(deadBoss) then scoreInfoList = self.middleBossAssistScoreInfoList end if scoreInfoList then for i,info in ipairs(scoreInfoList) do _tempMinPercent:Reset(info[1]) _tempMaxPercent:Reset(info[2]) if _tempHpDmgPercent > _tempMinPercent and _tempHpDmgPercent <= _tempMaxPercent then bossAssistScore = bossAssistScore + info[3] --logging.error(LTAG.ERROR, "HYW : 增加助攻boss分 : ", info[3]) break end end else logging.error(LTAG.ERROR, "HYW : scoreInfoList Error!") end end end end return bossAssistScore end function SyncDragonArteryLevelFunction:GetAssistHeroKillScore(playerID, statistic) statistic = statistic or self.PlayerStatisticDic[playerID] return statistic and statistic[EStatisticType.AssistHeroKillNum] * AssistKillHeroScore or 0 end function SyncDragonArteryLevelFunction:GetKillHeroScore(playerID, statistic) statistic = statistic or self.PlayerStatisticDic[playerID] return statistic and statistic[EStatisticType.HeroKillNum] * KillHeroScore or 0 end function SyncDragonArteryLevelFunction:GetGodPropScore(playerID, statistic) statistic = statistic or self.PlayerStatisticDic[playerID] return statistic and statistic[EStatisticType.DragonArteryGodPropGotNum] * GodPropGotScore or 0 end function SyncDragonArteryLevelFunction:GetDragonArteryBossKillScore(playerID, statistic) statistic = statistic or self.PlayerStatisticDic[playerID] return statistic and (statistic[EStatisticType.DragonArteryBossKillNum] * DragonArteryBossKillScore + statistic[EStatisticType.DragonArteryMiddleBossKillNum] * MiddleBossKillScore) or 0 end function SyncDragonArteryLevelFunction:GetDragonArteryPlayerCarryScoreFP(playerID, statistic, fpV1) statistic = statistic or self.PlayerStatisticDic[playerID] fpV1 = fpV1 or FP.newV1(0) if statistic then fpV1:Reset(statistic[EStatisticType.DragonArteryFrame]):Div(LuaConst.LogicFrameRate):Div(CarryScoreGotInterval) fpV1:Reset(math.floor(FP.tonumberV1(fpV1))):Mul(CarryScoreEachTime) end return fpV1 end --死人也可能获得龙脉,比如通过副将技、召唤物、死亡不移除的子弹等打死龙脉boss或者龙脉持有玩家,此时策划要求获得图腾玩家的当前英雄立马复活(如果当前英雄死亡的情况下),用这个方法复活玩家 function SyncDragonArteryLevelFunction:ReviveIfDeadPlayerGetDragonArtery(isSuicide) local playerActiveEntity = LevelPlayerManager.GetPlayerActiveEntity(self.dragonArteryEntity:GetPlayerID()) if playerActiveEntity and not playerActiveEntity:IsAlive() then self:TryReviveAndSwitchOneHero(playerActiveEntity, 1, false, false, true) SystemManager.SetNextState(LuaConst.StateType.Idle, playerActiveEntity) --↓强制复活需要设置死亡信息数据 local armyPos = LevelPlayerManager.GetHeroArmyPos(playerActiveEntity:GetPlayerID(), playerActiveEntity:GetCharacterID()) -- 判断是前中后军 0,2,4 local deadInfo = self.playerHeroDeadTimeFrame[playerActiveEntity:GetPlayerID()][armyPos] deadInfo.ReviveFrame = LogicUpdateManager._clientHandleFrame --↑↑↑↑↑↑ if isSuicide then --如果是自杀,则复活后血量设为10% local hplmt = playerActiveEntity:GetAttrValue(LuaConst.AttrType.hplmt) local hp = hplmt * SUICIDE_REVIVE_HP_FACTOR playerActiveEntity:SetAttrBaseValue(LuaConst.RealtimeAttrType.hp, hp) local attr = playerActiveEntity.components.attr playerActiveEntity.ExpEntity:SetModelUI_HP(FP.tonumberV1(hp), FP.tonumberV1(attr.pc), FP.tonumberV1(hplmt)) end self.exp:OnGetDragonArteryRevive(playerActiveEntity) end end function SyncDragonArteryLevelFunction:SetDragonArteryPlayer(entity) self.dragonArteryEntity = entity if self.dragonArteryEntity then if self.dragonArteryPlayerID ~= self.dragonArteryEntity:GetPlayerID() then --如果不是自杀就立即复活 self:ReviveIfDeadPlayerGetDragonArtery(false) --看看需不需要复活 else --如果是自杀,需要延迟复活,因为直接复活会复活失败 self.suicideReviveIfDeadPlayerGetDragonArteryFrame = LogicUpdateManager._clientHandleFrame + 1 end if self.dragonArteryPlayerChangedCount == 0 then self:DragonArteryRandomTransport(self.dragonArteryEntity) else local buffCtrl = RuntimeDataManager.New_BuffCtrl() buffCtrl.ForceDuration:Reset(1) --第二次及以后的玩家获取龙脉图腾时,添加1秒无敌 SystemManager.AddBuff(self.dragonArteryEntity, 500001, self.dragonArteryEntity, nil, buffCtrl) end end local playerID = nil if entity then playerID = entity:GetPlayerID() else logging.error(LTAG.ERROR, "HYW : Entity nil @SyncDragonArteryLevelFunction:SetDragonArteryPlayer 不符合预期!!!") end if self.dragonArteryPlayerID ~= playerID then local oldDragonArteryPlayerID = self.dragonArteryPlayerID self.dragonArteryPlayerID = playerID self.dragonArteryPlayerChangedCount = self.dragonArteryPlayerChangedCount + 1 self:OnDragonArteryPlayerChanged(entity, playerID, oldDragonArteryPlayerID) --else --正常情况,自杀时玉玺会在自己身上流转 --logging.error(LTAG.ERROR, "HYW : 严重警告, 怎么玉玺在持有者自己身上流转?") end end function SyncDragonArteryLevelFunction:OnSwitchHero(fromEntity, toEntity) Base.OnSwitchHero(self, fromEntity, toEntity) if self.dragonArteryEntity and self.dragonArteryEntity == fromEntity then self.dragonArteryEntity = toEntity self.exp:OnDragonArteryPlayerSwitchHero(fromEntity, toEntity) end end function SyncDragonArteryLevelFunction:GetDragonArteryPlayer() return self.dragonArteryPlayerID end function SyncDragonArteryLevelFunction:OnEntityBorn(entity) Base.OnEntityBorn(self, entity) if self:IsDragonArteryBoss(entity) or self:IsMiddleBoss(entity) then table.insert(self.dragonArteryLevelBornedBossList, entity) if self:IsMiddleBoss(entity) then if self.dragonArteryPlayerID then self:AddIgnoreToPlayer(self.dragonArteryPlayerID, entity) end self.exp:OnMiddileBossBorn(entity) end end end function SyncDragonArteryLevelFunction:AddIgnoreToPlayer(playerID, bossEntity, noPlayer) local playerEntityList = LevelPlayerManager.GetPlayerEntitysByPlayerIDInRoom(playerID) if playerEntityList then for i,_entity in ipairs(playerEntityList) do if not noPlayer then _entity.components.target:AddIgnoreEnemyEntity(bossEntity) end bossEntity.components.target:AddIgnoreEnemyEntity(_entity) end end end local _transportPosSorterEntityPos local _transportPosSorter = function(a, b) return a:DistanceSqr(_transportPosSorterEntityPos) < b:DistanceSqr(_transportPosSorterEntityPos) end --龙脉战传送:去除两个最近的传送点,在剩余的传送点中随机一个传过去 function SyncDragonArteryLevelFunction:DragonArteryRandomTransport(entity) if entity then if self.transportPosList and #self.transportPosList > 2 then _transportPosSorterEntityPos = entity:GetLogicPos() table.sort(self.transportPosList, _transportPosSorter) local index = LogicRandom.GetIntegerValue(entity, 3, #self.transportPosList, 454354389) SystemManager.OnConvey(entity, self.transportPosList[index],forward,dontReset,camAngle) end end end function SyncDragonArteryLevelFunction:SummonRequest(summoner, outParams) local propId if outParams and outParams.battlePropData then propId = outParams.battlePropData.ID end if propId and BattlePropSystem.CanUseBattlePropID(summoner, propId) then table.insert(self.summonerList, summoner) self.exp:OnSummonRequest(summoner, propId) end end function SyncDragonArteryLevelFunction:SummonAccept(entity) if entity:IsAlive() then local summoner for i=#self.summonerList,1,-1 do if self.summonerList[i]:GetCampID() == entity:GetCampID() then summoner = self.summonerList[i] break end end if summoner then --这里正常情况下 summoner不会为空,但是如果出现了客户端服务器不一致,就可能为空。加个判空防止服务器校验出exception导致校验失败 --if LevelManager.CurLevelFunc:IsDragonArteryPlayer(summoner) then --暂时不判定了,感觉点击了同意又不传送对于玩家来说有点奇怪 local pos = FP.newV2(0,0) LogicRandom.GetRandomPointInCircle(entity, 3, 324239594, pos) --暂时写死3m pos:Add(summoner:GetLogicPos()) entity.components.skillBase.NeedReleaseGetInSkill = true SystemManager.OnConvey(entity, pos)--目前位置修正最大是修正20次,如果半径太大,可能修正失败,传到墙里 --else --正常情况,比如发起拉人指令后,自己被杀死,就不能再拉人了 --end end end end function SyncDragonArteryLevelFunction:OnUpdate() Base.OnUpdate(self) if self.dragonArteryPlayerID then self.dragonArteryPlayerComboFrame = self.dragonArteryPlayerComboFrame + 1 local statistic = self.PlayerStatisticDic[self.dragonArteryPlayerID] statistic[EStatisticType.DragonArteryFrame] = statistic[EStatisticType.DragonArteryFrame] + 1 if not self.dragonArteryDurationReachLimitPlayerID and self.dragonArteryPlayerComboFrame >= DragonArteryWinFrame then --持有超过5分钟, 算胜利 self:OnDragonArteryDurationReachLimit() end end if self.suicideReviveIfDeadPlayerGetDragonArteryFrame then self.suicideReviveIfDeadPlayerGetDragonArteryFrame = nil self:ReviveIfDeadPlayerGetDragonArtery(true) end end --获取连续持有图腾帧数时长 function SyncDragonArteryLevelFunction:GetPlayerComboFrame() return self.dragonArteryPlayerComboFrame end function SyncDragonArteryLevelFunction:OnDragonArteryDurationReachLimit() self.dragonArteryDurationReachLimitPlayerID = self.dragonArteryPlayerID --self.exp:OnDragonArteryDurationReachLimit(self.dragonArteryDurationReachLimitPlayerID) self:SendResult(self.dragonArteryDurationReachLimitPlayerID, true) self:StopLevel() if LogicUpdateManager.IsReplayOrServerCheck then BattleSimulator.EndPlay() end end function SyncDragonArteryLevelFunction:OnLevelSucceed() self:SendResult(self.dragonArteryPlayerID) Base.OnLevelSucceed(self) end function SyncDragonArteryLevelFunction:OnLevelFail() self:SendResult(self.dragonArteryPlayerID) Base.OnLevelSucceed(self) end local _sorterWinnerPlayerID local playerPbSorter = function(a, b) if a.playerID == _sorterWinnerPlayerID then return true elseif b.playerID == _sorterWinnerPlayerID then return false end if a.score ~= b.score then return a.score > b.score else return a.playerID < b.playerID end end local _sorterWinnerCampID local contryPbSorter = function(a, b) if a.countryId == _sorterWinnerCampID then return true elseif b.countryId == _sorterWinnerCampID then return false end if a.totalScore ~= b.totalScore then return a.totalScore > b.totalScore else return a.countryId < b.countryId end end function SyncDragonArteryLevelFunction:SendResult(winnerPlayerID, isEarlyEnd) if not self.isResultSent then if not isEarlyEnd then isEarlyEnd = false end self.isResultSent = true _sorterWinnerPlayerID = winnerPlayerID local msg = dragon_artery.C2GUploadDragonArteryResult() local playerInfo local contryPb local playerPb for campID=1,4 do contryPb = dragon_artery.DragonArteryCountry() contryPb.countryId = campID --跟服务器约定死了,campID就等于countryId contryPb.KillPlayer = BattleDataGetter.GetDragonArteryKingdomKillScore(campID) --跟服务器约定死了,campID就等于kingdom类型 contryPb.holdTotem = BattleDataGetter.GetDragonArteryKingdomCarryScore(campID) --跟服务器约定死了,campID就等于kingdom类型 contryPb.killBoss = BattleDataGetter.GetDragonArteryKingdomBossKillScore(campID) --跟服务器约定死了,campID就等于kingdom类型 contryPb.skill = BattleDataGetter.GetDragonArteryKingdomGodPropScore(campID) --跟服务器约定死了,campID就等于kingdom类型 contryPb.totalScore = BattleDataGetter.GetDragonArteryKingdomScore(campID) --跟服务器约定死了,campID就等于kingdom类型 table.insert(msg.country, contryPb) for k,v in pairs(LevelPlayerManager.PlayersArmyTable) do --pairs safe 后面会排序 playerInfo = v.playerInfo local playerID = playerInfo.playerID if playerInfo.campID == campID then if playerID == winnerPlayerID then _sorterWinnerCampID = campID end playerPb = dragon_artery.DragonArteryPlayer() playerPb.playerID = playerID playerPb.playerAcid = playerInfo.acid playerPb.emblemContent = playerInfo.guildEmblemContent playerPb.emblemFrame = playerInfo.guildEmblemFrame playerPb.serId = playerInfo.serId playerPb.playerName = playerInfo.name playerPb.killPlayer = BattleDataGetter.GetKillHeroScore(playerID) playerPb.assist = BattleDataGetter.GetAssistHeroKillScore(playerID) playerPb.holdTotem = BattleDataGetter.GetDragonArteryPlayerCarryScore(playerID) playerPb.killBoss = BattleDataGetter.GetDragonArteryBossKillScore(playerID) playerPb.skill = BattleDataGetter.GetGodPropScore(playerID) playerPb.score = BattleDataGetter.GetDragonArteryPlayerScore(playerID) playerPb.heroDeadNum = self:GetPlayerDeadHeroCount(playerID) table.insert(contryPb.players, playerPb) end end table.sort(contryPb.players, playerPbSorter) end table.sort(msg.country, contryPbSorter) msg.checkInfo = self:GetBattleResultCheckStr() msg.passTime = LogicUpdateManager._clientHandleFrame / 20 msg.earlyEnd = isEarlyEnd if LogicUpdateManager.IsReplayOrServerCheck then -- 客户端重播或服务器校验的话,不要发送TCP logging.log(LTAG.LOG,"[GWS]DragonArtery BattleCheckStr = ",msg.checkInfo) else EventSystem.Dispatch(EventID.DragonArtery_SendResult, msg) end if USE_LUA_STANDALONE then BattleSimulator.SetCheckResult(msg.checkInfo, msg:SerializeToString()) end else logging.error(LTAG.ERROR, "HYW : 试图多次发送结果 请求拒绝!") end end function SyncDragonArteryLevelFunction:OnDragonArteryPlayerChanged(entity, playerID, oldDragonArteryPlayerID) self.dragonArteryPlayerComboFrame = 0 if oldDragonArteryPlayerID then local playerEntityList = LevelPlayerManager.GetPlayerEntitysByPlayerIDInRoom(oldDragonArteryPlayerID) if playerEntityList then for i,_entity in ipairs(playerEntityList) do _entity.components.target:ClearIgnoreEnemy() --删除道具 SystemManager.DeleteBattlePropsByID(_entity, BattleProp_Convey, 0) SystemManager.DeleteBattlePropsByID(_entity, BattleProp_Gather, 0) end end end for i,bossEntity in ipairs(self.dragonArteryLevelBornedBossList) do if self:IsDragonArteryBoss(bossEntity) and bossEntity:IsAlive() and bossEntity:IsActive() then SystemManager.OnDead(bossEntity) else bossEntity.components.target:ClearIgnoreEnemy() self:AddIgnoreToPlayer(playerID, bossEntity, self:IsDragonArteryBoss(bossEntity)) end end --添加道具 if entity then SystemManager.AddBattleProp(entity, BattleProp_Convey, true) SystemManager.AddBattleProp(entity, BattleProp_Gather, true) --如果处于驾驶大将中,则需要销毁大将 local carEntity = entity.components.drive.DriveEntity if carEntity then SystemManager.OffDrive(entity) SystemManager.DeadQuit(carEntity) end end self.exp:OnDragonArteryPlayerChanged(entity, playerID, oldDragonArteryPlayerID) end function SyncDragonArteryLevelFunction:TrySetDragonArteryPlayerByKiller(killerEntity) if killerEntity then local originKiller = killerEntity:GetOriginEntity() if originKiller:IsHero() then local killerCurEntity = LevelPlayerManager.GetPlayerActiveEntity(originKiller:GetPlayerID()) self:SetDragonArteryPlayer(killerCurEntity) else logging.error(LTAG.ERROR, "HYW : 严重警告!杀死玉玺持有者(玩家或boss)的killer不是玩家!charID :", originKiller:GetCharacterID(), " characterType : ", originKiller:GetCharacterType()) end --else --正常情况,如果玩家不打boss,最后结算的时候关卡会杀死boss,此时就没有killer --logging.error(LTAG.ERROR, "HYW : 严重警告!玉玺持有者(玩家或boss)死亡时没有killer!") end end --只要是有血量改变意图,即便最终血量没有任何改变,也会调用该方法 function SyncDragonArteryLevelFunction:OnHpChange(entity, caster, delta, op, realDelta) Base.OnHpChange(self, entity, caster, delta, op, realDelta) local originCaster = caster:GetOriginEntity() if originCaster:IsHero() then if realDelta < FPZero then if self:IsDragonArteryBoss(entity) or self:IsMiddleBoss(entity) then local record = self.bossDmgRecordDic[originCaster:GetPlayerID()] if not record then record = {} self.bossDmgRecordDic[originCaster:GetPlayerID()] = record end record[entity.EntityID] = record[entity.EntityID] or FP.newV1(0) record[entity.EntityID]:Sub(realDelta) end end end end function SyncDragonArteryLevelFunction:OnDrive(driver, beDrivedEntity) Base.OnDrive(self, driver, beDrivedEntity) if beDrivedEntity:GetCharacterID() == MIDDLE_BOSS_DRIVED_CHARID then if self.drivingMiddleBossEntity then logging.error(LTAG.ERROR, "HYW : 严重错误! 有人在驾驶大将了,又有人开启驾驶大将! 这是怎么回事!? ") end self.drivingMiddleBossEntity = driver end end function SyncDragonArteryLevelFunction:OnOffDrive(driver, beDrivedEntity) Base.OnOffDrive(self, driver, beDrivedEntity) if beDrivedEntity:GetCharacterID() == MIDDLE_BOSS_DRIVED_CHARID then if self.drivingMiddleBossEntity == driver then self.drivingMiddleBossEntity = nil else logging.error(LTAG.ERROR, "HYW : 严重错误! 解除驾驶大将的不是levelFunc里的drivingMiddleBossEntity 这是怎么回事!? ") end end end function SyncDragonArteryLevelFunction:OnHeroDead(entity) Base.OnHeroDead(self, entity) local playerID = entity:GetPlayerID() if playerID == self.dragonArteryPlayerID then self:TrySetDragonArteryPlayerByKiller(entity.components.record.KillerEntity) end if self.drivingMiddleBossEntity ~= entity then --如果是变身大将的玩家死亡,不删除惩罚buff。这个生命周期测过了是没问题的,在这判定就可以了 for i,v in ipairs(Const_KillerDeBuff) do SystemManager.DeleteBuff(entity, v) end end end function SyncDragonArteryLevelFunction:OnHeroKillHero(killer, deadEntity, deadComboKill) Base.OnHeroKillHero(self, killer, deadEntity, deadComboKill) if killer:IsActive() then for i,v in ipairs(Const_KillerDeBuff) do SystemManager.AddBuff(killer, v) end end end function SyncDragonArteryLevelFunction:OnEntityDead(entity) Base.OnEntityDead(self, entity) if self:IsDragonArteryBoss(entity) then self.deadBossCount = self.deadBossCount + 1 self.deadBossRecord[entity.EntityID] = entity if self.deadBossCount == self.dragonArteryIndex then self:TrySetDragonArteryPlayerByKiller(entity.components.record.KillerEntity) end local killer = entity.components.record.KillerEntity if killer then local originKiller = killer:GetOriginEntity() local statistic = self.PlayerStatisticDic[originKiller:GetPlayerID()] if statistic then local curKillBossNum = statistic[EStatisticType.DragonArteryBossKillNum] statistic[EStatisticType.DragonArteryBossKillNum] = curKillBossNum + 1 end self.exp:OnDragonArteryBossKilledByPlayer(entity, killer) end elseif self:IsMiddleBoss(entity) then self.deadBossRecord[entity.EntityID] = entity local killer = entity.components.record.KillerEntity if killer then local originKiller = killer:GetOriginEntity() local statistic = self.PlayerStatisticDic[originKiller:GetPlayerID()] if statistic then local curKillBossNum = statistic[EStatisticType.DragonArteryMiddleBossKillNum] statistic[EStatisticType.DragonArteryMiddleBossKillNum] = curKillBossNum + 1 end end end end function SyncDragonArteryLevelFunction:HandleHeroDead(deadEntity, killer) local deadPlayerID = deadEntity:GetPlayerID() local deadKillNums = self:GetPlayerComboKillNum(deadPlayerID) Base.HandleHeroDead(self, deadEntity, killer) if not killer then --好像有些情况关卡会杀Hero,且这种情况下KillerEntity为空,所以这里要判空 return end local originKiller = killer:GetOriginEntity() if originKiller:IsHero() then local firstBlood = 0 if not self.hasFirstBlood then firstBlood = 1 self.hasFirstBlood = true end local killerPlayerID = originKiller:GetPlayerID() local killerName = LevelPlayerManager.GetPlayerName(killerPlayerID) local guildIdA = originKiller:GetCampID() local killNums = self:GetPlayerComboKillNum(killerPlayerID) local heroIDA = originKiller:GetCharacterID() local playerNameB = LevelPlayerManager.GetPlayerName(deadPlayerID) local guildIdB = deadEntity:GetCampID() local heroIDB = deadEntity:GetCharacterID() local info = { killNums = killNums, firstBlood = firstBlood, playerNameA = killerName, guildIdA = guildIdA, playerNameB = playerNameB, guildIdB = guildIdB, playerHeroIdA = heroIDA, playerHeroIdB = heroIDB, killNumsB = deadKillNums, playerIdA = killerPlayerID, playerIdB = deadPlayerID} --A 是杀人者 ,B是被杀者 EventSystem.Dispatch(EventID.SyncBattle_KillInfoNotice, info) end end function SyncDragonArteryLevelFunction:OnEntityAddProp(entity, btnIndex, propData) Base.OnEntityAddProp(self, entity, btnIndex, propData) if self:IsGodProp(propData) then local statistic = self.PlayerStatisticDic[entity:GetPlayerID()] if statistic then statistic[EStatisticType.DragonArteryGodPropGotNum] = statistic[EStatisticType.DragonArteryGodPropGotNum] + 1 --else --正常情况 end end end return SyncDragonArteryLevelFunction