local Base = require("Battle/Logic/Level/LevelFunction/SyncCityWarBaseLevelFunction") local SyncCityWarSideLevelFunction = class("SyncCityWarSideLevelFunction", Base) local siege_city_battlecheck_pb = require 'Proto/siege_city_battlecheck_pb' local EStatisticType = LuaConst.EStatisticType local FEATUREID_BOSS = 622061 local FEATUREID_ELITE = 622062 local MONSTERID_ZHUYAN = 62200308 local FP_ZERO = FP.Const.Zero local SiegeCitySubBattleKillPoint = DataSheetManager.ConstData:GetDataByID("SiegeCitySubBattleKillPoint").IntValue --副战场击杀贡献 local SiegeCitySubBattleAssistPoint = DataSheetManager.ConstData:GetDataByID("SiegeCitySubBattleAssistPoint").IntValue --副战场助攻贡献 local SiegeCitySubBattleEliteKillPoint = DataSheetManager.ConstData:GetDataByID("SiegeCitySubBattleEliteKillPoint").IntValue --副战场精英怪击杀贡献 local SiegeCitySubBattleEliteAssistPoint = DataSheetManager.ConstData:GetDataByID("SiegeCitySubBattleEliteAssistPoint").IntValue --副战场精英怪助攻贡献 local SiegeCitySubBattleBossKillPoint = DataSheetManager.ConstData:GetDataByID("SiegeCitySubBattleBossKillPoint").IntValue --副战场中央boss击杀贡献 local SiegeCitySubBattleBossAssistPoint = DataSheetManager.ConstData:GetDataByID("SiegeCitySubBattleBossAssistPoint").IntValue --副战场中央boss击杀贡献 local SiegeCitySubBattleEliteKillGoods = DataSheetManager.ConstData:GetDataByID("SiegeCitySubBattleEliteKillGoods").IntValue --副战场boss尾刀获得资源 local SiegeCitySubBattleEliteAssistGoods = DataSheetManager.ConstData:GetDataByID("SiegeCitySubBattleEliteAssistGoods").IntValue --副战场boss尾刀获得资源 local SiegeCitySubBattleBossKillGoods = DataSheetManager.ConstData:GetDataByID("SiegeCitySubBattleBossKillGoods").IntValue --副战场boss尾刀获得资源 local SiegeCitySubBattleBossAssistGoods = DataSheetManager.ConstData:GetDataByID("SiegeCitySubBattleBossAssistGoods").IntValue --副战场boss尾刀获得资源 local SiegeCityBOSSPVEKillTime_a = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSPVEKillTime_a").FloatValue local SiegeCityBOSSPVEKillTime_b = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSPVEKillTime_b").FloatValue local SiegeCityBOSSPVEKillTime_c = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSPVEKillTime_c").FloatValue local SiegeCityBOSSEVPKillTime_a = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSEVPKillTime_a").FloatValue local SiegeCityBOSSEVPKillTime_b = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSEVPKillTime_b").FloatValue local SiegeCityBOSSEVPKillTime_c = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSEVPKillTime_c").FloatValue local SiegeCityBOSSDefRate = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSDefRate").FloatValue local SiegeCityBOSSAmlmt = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSAmlmt").FloatValue local SiegeCityBOSSHeroPerArmy = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSHeroPerArmy").FloatValue local SiegeCityBOSSArmyCount = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSArmyCount").FloatValue local SiegeCityBOSSPVECrit = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSPVECrit").FloatValue local SiegeCityBOSSPVEParry = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSPVEParry").FloatValue local SiegeCityBOSSPVECriteff = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSPVECriteff").FloatValue local SiegeCityBOSSPVEParryeff = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSPVEParryeff").FloatValue local SiegeCityBOSSEVPCrit = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSEVPCrit").FloatValue local SiegeCityBOSSEVPParry = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSEVPParry").FloatValue local SiegeCityBOSSEVPCriteff = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSEVPCriteff").FloatValue local SiegeCityBOSSEVPParryeff = DataSheetManager.ConstData:GetDataByID("SiegeCityBOSSEVPParryeff").FloatValue local SiegeCityAssistingKillTimeFrame = DataSheetManager.ConstData:GetDataByID("SiegeCityAssistingKillTime").IntValue * LuaConst.LogicFrameRate function SyncCityWarSideLevelFunction:InitLevel() Base.InitLevel(self) self.hurtedFlagDicList = {} --key是精英或者boss怪的ID,value是一个dictionary。dictionary的key是playerID,value是true,用来标记这个玩家有没有对这个怪造成过伤害 self.countryResourcesList = {0,0,0,0} --魏蜀吴群获取的资源数量 self.curZhuYanHurtTimestampDic = {} --当前对朱厌造成伤害的玩家的时间戳(帧号) end function SyncCityWarSideLevelFunction:InitPlayerStatistic(statistic) Base.InitPlayerStatistic(self, statistic) statistic[EStatisticType.BossKillNum] = 0 statistic[EStatisticType.InvolvedBossKillNum] = 0 statistic[EStatisticType.AssistBossKillNum] = 0 statistic[EStatisticType.EliteKillNum] = 0 statistic[EStatisticType.InvolvedEliteKillNum] = 0 statistic[EStatisticType.AssistEliteKillNum] = 0 end function SyncCityWarSideLevelFunction:IsMiddleBossFeatureID(featureID) return featureID == FEATUREID_BOSS end --entity可能传nil function SyncCityWarSideLevelFunction:ChangeResourceAmountOfPlayer(entity, playerID, delta, eventEntityType) local statisticInfo = self.PlayerStatisticDic[playerID] if statisticInfo then statisticInfo[EStatisticType.PlayerContributeResourceCount] = statisticInfo[EStatisticType.PlayerContributeResourceCount] + delta local playerInfo = LevelPlayerManager.GetPlayerInfoByPlayerIDInRoom(playerID) self.countryResourcesList[playerInfo.countryId] = self.countryResourcesList[playerInfo.countryId] + delta else logging.error(LTAG.ERROR, "HYW : statisticInfo nil Error!") end end function SyncCityWarSideLevelFunction:OnEntityBorn(entity) Base.OnEntityBorn(self, entity) if entity.featureID == FEATUREID_ELITE or entity.featureID == FEATUREID_BOSS then self.hurtedFlagDicList[entity.EntityID] = {} end end function SyncCityWarSideLevelFunction:OnHpChange(entity, caster, delta, op) Base.OnHpChange(self, entity, caster, delta, op) if delta < FP_ZERO then local originEntity = caster:GetOriginEntity() if originEntity.isHero then if entity:GetCharacterID() == MONSTERID_ZHUYAN then self.curZhuYanHurtTimestampDic[originEntity:GetPlayerID()] = LogicUpdateManager._clientHandleFrame elseif entity.featureID == FEATUREID_ELITE or entity.featureID == FEATUREID_BOSS then self.hurtedFlagDicList[entity.EntityID][originEntity:GetPlayerID()] = true end end end end function SyncCityWarSideLevelFunction:OnEntityDead(entity) Base.OnEntityDead(self, entity) local hurtedFlagDic local statisticTypeKill local statisticTypeInvolvedKill local statisticTypeAssistKill local killResource local assistResource if entity:GetCharacterID() == MONSTERID_ZHUYAN then local killerEntity = entity.components.record.KillerEntity if killerEntity and killerEntity:GetCampID() == self.attackCampID then local originKillerPlayerID = killerEntity:GetOriginEntity():GetPlayerID() local curFrame = LogicUpdateManager._clientHandleFrame for playerID, timestampFrame in pairs(self.curZhuYanHurtTimestampDic) do--pairs safe 数据处理对顺序不敏感 local playerStatistic = self.PlayerStatisticDic[playerID] if playerStatistic then if curFrame - timestampFrame <= SiegeCityAssistingKillTimeFrame then if playerID == originKillerPlayerID then self:ChangeResourceAmountOfPlayer(nil, playerID, SiegeCitySubBattleBossKillGoods) playerStatistic[EStatisticType.BossKillNum] = playerStatistic[EStatisticType.BossKillNum] + 1 else self:ChangeResourceAmountOfPlayer(nil, playerID, SiegeCitySubBattleBossAssistGoods) playerStatistic[EStatisticType.AssistBossKillNum] = playerStatistic[EStatisticType.AssistBossKillNum] + 1 end playerStatistic[EStatisticType.InvolvedBossKillNum] = playerStatistic[EStatisticType.InvolvedBossKillNum] + 1 end end end end table.clear(self.curZhuYanHurtTimestampDic) else if entity.isElite then hurtedFlagDic = self.hurtedFlagDicList[entity.EntityID] statisticTypeKill = EStatisticType.EliteKillNum statisticTypeInvolvedKill = EStatisticType.InvolvedEliteKillNum statisticTypeAssistKill = EStatisticType.AssistEliteKillNum killResource = SiegeCitySubBattleEliteKillGoods assistResource = SiegeCitySubBattleEliteAssistGoods elseif entity.isBoss then hurtedFlagDic = self.hurtedFlagDicList[entity.EntityID] statisticTypeKill = EStatisticType.BossKillNum statisticTypeInvolvedKill = EStatisticType.InvolvedBossKillNum statisticTypeAssistKill = EStatisticType.AssistBossKillNum killResource = SiegeCitySubBattleBossKillGoods assistResource = SiegeCitySubBattleBossAssistGoods end if hurtedFlagDic then local originKillerPlayerID if entity.components.record.KillerEntity then originKillerPlayerID = entity.components.record.KillerEntity:GetOriginEntity():GetPlayerID() end local playerStatistic for playerID,v in pairs(hurtedFlagDic) do --pairs safe 数据处理对顺序不敏感 playerStatistic = self.PlayerStatisticDic[playerID] if playerStatistic then playerStatistic[statisticTypeInvolvedKill] = playerStatistic[statisticTypeInvolvedKill] + 1 if playerID == originKillerPlayerID then playerStatistic[statisticTypeKill] = playerStatistic[statisticTypeKill] + 1 if killResource then self:ChangeResourceAmountOfPlayer(nil, playerID, killResource) end else playerStatistic[statisticTypeAssistKill] = playerStatistic[statisticTypeAssistKill] + 1 if assistResource then self:ChangeResourceAmountOfPlayer(nil, playerID, assistResource) end end end end end end end function SyncCityWarSideLevelFunction:GetStandardPlayerAttrDic(entity, recommandGs) if entity:GetCharacterID() == MONSTERID_ZHUYAN then local count = 0 local gsSum = FP.newV1(0) for i,_entity in ipairs(LogicUpdateManager.EntityList_Sync) do if _entity:GetCampID() == self.attackCampID and _entity:IsActive() then gsSum:Add(_entity:GetGs()) count = count + 1 end end if count == 0 then return Base.GetStandardPlayerAttrDic(self, entity, 3000) --策划要求如果没有人的时候,设为3000 else return Base.GetStandardPlayerAttrDic(self, entity, FP.tonumberV1(gsSum:Div(count))) end else return Base.GetStandardPlayerAttrDic(self, entity) end end function SyncCityWarSideLevelFunction:GetMonsterValueDataByPowerPoint(entity) if entity:GetCharacterID() == MONSTERID_ZHUYAN then return self:CalculateZhuYanMonsterValueDataByPowerPoint(entity) else return Base.GetMonsterValueDataByPowerPoint(self, entity) end end function SyncCityWarSideLevelFunction:CalculateZhuYanMonsterValueDataByPowerPoint(entity) local attackHeroCount = 0 for i,entity in ipairs(LogicUpdateManager.EntityList_Sync) do if entity:IsActive() and entity:GetCampID() == self.attackCampID then attackHeroCount = attackHeroCount + 1 end end local data = { PVEKillTime = FP.newV1(0), EVPKillTime = FP.newV1(0), DefRate = SiegeCityBOSSDefRate, Amlmt = 99999999, HeroPerArmy = FP.tonumberV1(SiegeCityBOSSHeroPerArmy), ArmyCount = FP.tonumberV1(SiegeCityBOSSArmyCount), PVECrit = SiegeCityBOSSPVECrit, PVEParry = SiegeCityBOSSPVEParry, PVECriteff = SiegeCityBOSSPVECriteff, PVEParryeff = SiegeCityBOSSPVEParryeff, EVPCrit = SiegeCityBOSSEVPCrit, EVPParry = SiegeCityBOSSEVPParry, EVPCriteff = SiegeCityBOSSEVPCriteff, EVPParryeff = SiegeCityBOSSEVPParryeff, } local tempV1 = FP.newV1(0) tempV1:Reset(SiegeCityBOSSPVEKillTime_b):Mul(attackHeroCount) data.PVEKillTime:Reset(SiegeCityBOSSPVEKillTime_a):Mul(attackHeroCount):Mul(attackHeroCount):Add(tempV1):Add(SiegeCityBOSSPVEKillTime_c) tempV1:Reset(SiegeCityBOSSEVPKillTime_b):Mul(attackHeroCount) data.EVPKillTime:Reset(SiegeCityBOSSEVPKillTime_a):Mul(attackHeroCount):Mul(attackHeroCount):Add(tempV1):Add(SiegeCityBOSSEVPKillTime_c) return data end function SyncCityWarSideLevelFunction:GetPlayerScoreInfo(playerID) local playerStatistic = self.PlayerStatisticDic[playerID] if playerStatistic then local playerInfo = LevelPlayerManager.GetPlayerInfoByPlayerIDInRoom(playerID) local info = {} local killNum = playerStatistic[EStatisticType.HeroKillNum] local assistNum = playerStatistic[EStatisticType.AssistHeroKillNum] info.killScore = killNum * SiegeCitySubBattleKillPoint info.assistScore = assistNum * SiegeCitySubBattleAssistPoint info.bossKillScore = playerStatistic[EStatisticType.BossKillNum] * SiegeCitySubBattleBossKillPoint info.bossAssistScore = playerStatistic[EStatisticType.AssistBossKillNum] * SiegeCitySubBattleBossAssistPoint info.eliteKillScore = playerStatistic[EStatisticType.EliteKillNum] * SiegeCitySubBattleEliteKillPoint info.eliteAssistScore = playerStatistic[EStatisticType.AssistEliteKillNum] * SiegeCitySubBattleEliteAssistPoint info.otherScore = playerStatistic[EStatisticType.ScorePlus] + info.bossKillScore + info.bossAssistScore + info.eliteKillScore + info.eliteAssistScore info.playerInfo = playerInfo return info end end function SyncCityWarSideLevelFunction:GetResourcesListPbBytes() local msg = siege_city_battlecheck_pb.SiegeCityResourcesList() for i,resourceAmount in ipairs(self.countryResourcesList) do local resouceMsg = siege_city_battlecheck_pb.SiegeCityResources() resouceMsg.countryId = i resouceMsg.resources = resourceAmount table.insert(msg.resourceList, resouceMsg) end return msg:SerializeToString() end return SyncCityWarSideLevelFunction