local Base = require("Battle/Logic/Level/LevelFunction/SyncLevelFunction") local SyncCityWarBaseLevelFunction = class("SyncCityWarBaseLevelFunction", Base) local EventSystem = require('Event/EventSystem') local siege_city_pb = require 'Proto/siege_city_pb' local FP = FP local tonumberV1 = FP.tonumberV1 local EStatisticType = LuaConst.EStatisticType local SiegeCityAssistingKillTimeFrame = DataSheetManager.ConstData:GetDataByID("SiegeCityAssistingKillTime").IntValue * LuaConst.LogicFrameRate local Const_KillerDeBuff = {100094, 100095} -- 给杀人者加上的debuff local VisualFieldSystem = require "Battle/Logic/Entity/System/VisualFieldSystem" function SyncCityWarBaseLevelFunction:GetExpClass() return require "Battle/Expression/ExpLevel/ExpLevelFunction/ExpSyncCityWarBaseLevelFunction" end -- SiegeCityMainBattleAttackerGoodsBase 主战场守方物资基础值 -- SiegeCityMainBattleDefenderGoodsBase 主战场攻方物资基础值 -- SiegeCityMainBattleAttackerGoodsIncrease 主战场守方物资每秒增加(xxx/s) -- SiegeCityMainBattleDefenderGoodsIncrease 主战场攻方物资每秒增加(xxx/s) -- SiegeCityTowerLV1BallistaCost 守方1级弩塔-消耗 -- SiegeCityTowerLV2CannonCost 守方2级炮塔-消耗 -- SiegeCityTowerLV3Cannon1Cost 守方3级炮塔样式1-消耗 -- SiegeCityTowerLV3Cannon2Cost 守方3级炮塔样式2-消耗 -- SiegeCityTowerLV2MagicCost 守方2级玄术塔-消耗 -- SiegeCityTowerLV3Magic1Cost 守方3级玄术塔样式1-消耗 -- SiegeCityTowerLV3Magic2Cost 守方3级玄术塔样式2-消耗 -- SiegeCityTankMode1Cost 攻方战车1,火牛,消耗 -- SiegeCityTankMode2Cost 攻方战车2,玄龟,消耗 -- SiegeCityTankMode3Cost 攻方战车3,铁虎,消耗 function SyncCityWarBaseLevelFunction:InitLevel() self.playerID2AcidDic = {} Base.InitLevel(self) self.attackCampID = 1 self.defendCampID = 2 self.isFreeToEnterAndLeave = true --如果是随进随出,必须在Base.InitLevel之后把这个设为true self.isSwitchOneReviveNeerBy = true -- 复活的地点为 出生点 。 self.LevelReviveType = LuaConst.LevelReviveType.SelectOne end function SyncCityWarBaseLevelFunction:InitPlayerStatistic(statistic) Base.InitPlayerStatistic(self, statistic) statistic[EStatisticType.HeroDamageWall] = FP.newV1(0) statistic[EStatisticType.PlayerContributeResourceCount] = 0 statistic[EStatisticType.ScorePlus] = 0 end function SyncCityWarBaseLevelFunction:OnCreatePlayer(playerID, playerInfo, firstEntity) Base.OnCreatePlayer(self, playerID, playerInfo, firstEntity) self:TryInheritPlayerStatistic(playerInfo) self.playerID2AcidDic[playerID] = playerInfo.acid end --一个player继承前面某个player的statistics, 并且会清空被继承的player的statistics function SyncCityWarBaseLevelFunction:TryInheritPlayerStatistic(playerInfo) for playerID,acid in pairs(self.playerID2AcidDic) do --pairs safe 纯数据操作 if acid == playerInfo.acid then self.PlayerStatisticDic[playerInfo.playerID] = self.PlayerStatisticDic[playerID] self.PlayerStatisticDic[playerID] = nil self.playerID2AcidDic[playerID] = nil break end end end function SyncCityWarBaseLevelFunction:SetSelectOneReviveParam() self.RebornBaseTime = DataSheetManager.ConstData:GetDataByID("SiegeCityHeroRebornBaseTime").IntValue -- 基础复活时间 s self.RebornExtraTime = DataSheetManager.ConstData:GetDataByID("SiegeCityHeroRebornExtraTime").IntValue -- 死亡次数额外附加时间 s self.RebornMaxTime = DataSheetManager.ConstData:GetDataByID("SiegeCityHeroRebornMaxTime").IntValue -- 最大复活时间 end function SyncCityWarBaseLevelFunction:GetBornIndex(playerInfo) return playerInfo.campID end function SyncCityWarBaseLevelFunction:GetHeroKillInvolvedTimeLimitFrame() return SiegeCityAssistingKillTimeFrame end function SyncCityWarBaseLevelFunction:IsCollectAmountReachLimit() return false end function SyncCityWarBaseLevelFunction:GetResourceAmount() return nil end function SyncCityWarBaseLevelFunction:AddScore(entity, value) local playerID = entity:GetPlayerID() if playerID > 0 then local statistic = self.PlayerStatisticDic[playerID] statistic[EStatisticType.ScorePlus] = statistic[EStatisticType.ScorePlus] + value else logging.error(LTAG.ERROR, "HYW : 警告!试图给非玩家单位添加积分!") end end function SyncCityWarBaseLevelFunction:OnEntityBorn(entity) Base.OnEntityBorn(self, entity) self.exp:OnEntityBorn(entity) end function SyncCityWarBaseLevelFunction:HandleHeroDead(deadEntity, killer) Base.HandleHeroDead(self, deadEntity, killer) for i,v in ipairs(Const_KillerDeBuff) do SystemManager.DeleteBuff(deadEntity, v) end EventSystem.Dispatch(EventID.CityWar_HeroDead, killer, deadEntity) end function SyncCityWarBaseLevelFunction: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 SyncCityWarBaseLevelFunction:OnDrive(driver, beDrivedEntity) Base.OnDrive(self, driver, beDrivedEntity) self.exp:OnDrive(driver, beDrivedEntity) end --服务器查询接口 function SyncCityWarBaseLevelFunction:GetBattlePlayerInfos() local msg = siege_city_pb.SiegeCityMatchInfo() local playerInfo local statisticInfo for _,playerID in ipairs(LevelPlayerManager.SyncPlayerIDList) do local battlePlayerInfo = siege_city_pb.SiegeCityPlayerInfo() battlePlayerInfo.playerId = playerID playerInfo = LevelPlayerManager.GetPlayerInfoByPlayerIDInRoom(playerID) battlePlayerInfo.countryId = playerInfo.countryId statisticInfo = self.PlayerStatisticDic[playerID] if statisticInfo then battlePlayerInfo.damageToWall = math.floor(tonumberV1(statisticInfo[EStatisticType.HeroDamageWall])) battlePlayerInfo.resourceNum = statisticInfo[EStatisticType.PlayerContributeResourceCount] --物资 end table.insert(msg.playerInfoList, battlePlayerInfo) end return msg:SerializeToString() end function SyncCityWarBaseLevelFunction:GetPlayerScoreInfoList() -- 只是给UI使用 local infoList = {} for _,playerID in ipairs(LevelPlayerManager.SyncPlayerIDList) do local info = self:GetPlayerScoreInfo(playerID) if info then table.insert(infoList, info) end end return infoList end function SyncCityWarBaseLevelFunction:GetPlayerScoreInfo(playerID) logging.error(LTAG.ERROR, "HYW : 警告!子类未实现方法 SyncCityWarBaseLevelFunction:GetPlayerScoreInfo LevelID : ", LevelManger.GetCurLevelID()) end function SyncCityWarBaseLevelFunction:OnLevelSucceed() self:SendResult() Base.OnLevelSucceed(self) end function SyncCityWarBaseLevelFunction:OnLevelFail() self:SendResult() Base.OnLevelFail(self) end local playerPbSorter = function(a, b) return a.playerID < b.playerID end function SyncCityWarBaseLevelFunction:GetResultPlayerScoreInfo(playerID) return self:GetPlayerScoreInfo(playerID) end function SyncCityWarBaseLevelFunction:SendResult() local msg = siege_city_pb.C2GUploadSiegeCityResult() msg.checkInfo = self:GetBattleResultCheckStr() for k,v in pairs(LevelPlayerManager.PlayersArmyTable) do --pairs safe 后面会排序 local playerInfo = v.playerInfo local playerID = playerInfo.playerID if self.playerID2AcidDic[playerID] then local playerResult = siege_city_pb.SiegeCityResult() playerResult.playerID = playerID playerResult.playerAcid = playerInfo.acid playerResult.playerName = playerInfo.name playerResult.isDefend = playerInfo.campID == self.defendCampID playerResult.killNum = self:GetPlayerKillNum(playerID) playerResult.assistNum = self:GetPlayerAssistKillNum(playerID) playerResult.deadNum = self:GetPlayerDeadHeroCount(playerID) local scoreInfo = self:GetResultPlayerScoreInfo(playerID) if scoreInfo then playerResult.otherContribute = scoreInfo.otherScore playerResult.totalContribute = scoreInfo.killScore + scoreInfo.assistScore + scoreInfo.otherScore else logging.error(LTAG.ERROR, "HYW : scoreInfo nil Error playerID : ", playerID) end table.insert(msg.allFighterRes, playerResult) --else --do nothing. 这种情况代表 playerID 因为 Inherit 而作废了,发送结果时跳过这个 playerID end end table.sort(msg.allFighterRes, playerPbSorter) if LogicUpdateManager.IsReplayOrServerCheck then -- 客户端重播或服务器校验的话,不要发送TCP logging.log(LTAG.LOG," HYW : CityWar BattleCheckStr = ", msg.checkInfo) else EventSystem.Dispatch(EventID.CityWar_SendResult, msg) end if USE_LUA_STANDALONE then BattleSimulator.SetCheckResult(msg.checkInfo, msg:SerializeToString()) end end function SyncCityWarBaseLevelFunction:GetSelectOneRevivePunishTime() return DataSheetManager.ConstData:GetDataByID("FightThroneDeathPunishTime").IntValue -- 死亡惩罚时长 end function SyncCityWarBaseLevelFunction:CanSeeEntity(seeingEntity, beSawEntity) return VisualFieldSystem.CanSeeEntityByVisualLevel(seeingEntity, beSawEntity) end return SyncCityWarBaseLevelFunction