using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Cysharp.Threading.Tasks; using Framework.Wrapper; using Gameplay.Level; using Gameplay.Net; using Google.Protobuf; using NLDPB; using UnityEngine; using CharacterInfo = Gameplay.Net.CharacterInfo; /// /// pvp防守方上阵数据 /// public class PVPDefenderData { public List pvpRuntimeUnitInfos = new(); public List PVPUnitInfos => pvpRuntimeUnitInfos.Select(runtimeInfo => runtimeInfo.pvpUnitInfo).ToList(); public PVPDefenderData() { } public PVPDefenderData(MSG_PvpDefenceData pvpDefenceData) { //DebugUtil.LogError($"pvpDefenceData:{pvpDefenceData.ToString()}"); var unitCellInfos = MSG_PvpTeamData.Parser.ParseFrom(pvpDefenceData.TeamData); List characterInfos = new(); if (pvpDefenceData.Characters != null) { foreach (var serverCharacterInfo in pvpDefenceData.Characters) { CharacterInfo characterInfo = new() { ID = serverCharacterInfo.Id, }; characterInfo.Refresh(serverCharacterInfo); characterInfos.Add(characterInfo); } //DebugUtil.Log($"PVPEnemyInfo: characters count{characterInfos.Count}"); } List vehicleInfos = new(); if (pvpDefenceData.Vehicle != null) { foreach (var serverVehicleInfo in pvpDefenceData.Vehicle) { Gameplay.Net.VehicleInfo vehicleInfo = new() { nID = serverVehicleInfo.Id, }; vehicleInfo.Refresh(serverVehicleInfo); vehicleInfos.Add(vehicleInfo); } //DebugUtil.Log($"PVPEnemyInfo: vehicleInfos count{vehicleInfos.Count}"); } List buildingInfos = new(); if (pvpDefenceData.BuildingId != null) { for (int i = 0; i < pvpDefenceData.BuildingId.Count; i++) { var id = pvpDefenceData.BuildingId[i]; var buildingData = FightBuildingDataManager.Instance.DataDic[id]; //刷新数据 buildingInfos.Add(buildingData); } //DebugUtil.Log($"PVPEnemyInfo: vehicleInfos count{vehicleInfos.Count}"); } var unitInfos = new List() { }; for (int i = 0; i< characterInfos.Count; i++ ) { var characterInfo = characterInfos[i]; var unit = new PVPUnitInfo() { unitID = characterInfo.ID, type = Unit.UnitType.Charactor, cellIndex = (int)unitCellInfos.CharacterCell[i] - 1 }; unitInfos.Add(unit); } for (int i = 0; i < vehicleInfos.Count; i++) { var vehicleInfo = vehicleInfos[i]; var unit = new PVPUnitInfo() { unitID = vehicleInfo.nID, type = Unit.UnitType.Vehicle, cellIndex = (int)unitCellInfos.VehicleCell[i] - 1 }; unitInfos.Add(unit); } if (unitCellInfos.BuildingCell != null) { for (int i = 0; i < buildingInfos.Count; i++) { var buildingData = buildingInfos[i]; var unit = new PVPUnitInfo() { unitID = buildingData.Uid, type = Unit.UnitType.Building, cellIndex = (int)unitCellInfos.BuildingCell[i] - 1 }; unitInfos.Add(unit); } } //DebugUtil.Log($"PVPEnemyInfo: unitInfos count{unitInfos.Count}"); Init(unitInfos, characterInfos, vehicleInfos, buildingInfos); } public void Init(List unitInfos, List characterInfos, List vehicleInfos, List buildingInfos) { pvpRuntimeUnitInfos.Clear(); int characterIndex = 0; int vehicleIndex = 0; int bulidIndex = 0; for (int i = 0; i < unitInfos.Count; i++) { var unitInfo = unitInfos[i]; CharacterInfo characterInfo = null; Gameplay.Net.VehicleInfo currVehicleInfo = null; FightBuildingData buildingData = null; switch (unitInfo.type) { case Unit.UnitType.Charactor: characterInfo = characterInfos[characterIndex]; // if (!CharacterDataInfoManager.Instance.DataDic.ContainsKey(characterInfo.ID)) // { // continue; // } characterIndex++; break; case Unit.UnitType.Vehicle: currVehicleInfo = vehicleInfos[vehicleIndex]; // if (!VehicleCultivateDataManager.Instance.DataDic.ContainsKey(currVehicleInfo.nID)) // { // continue; // } vehicleIndex++; break; case Unit.UnitType.Building: buildingData = buildingInfos[bulidIndex]; // if (!FightBuildingDataManager.Instance.DataDic.ContainsKey(buildingData.Uid)) // { // continue; // } bulidIndex++; break; default: break; } PVPUnitRuntimeInfo runtimeInfo = new(unitInfo, characterInfo, currVehicleInfo, buildingData); pvpRuntimeUnitInfos.Add(runtimeInfo); } //DebugUtil.Log($"PVPEnemyInfo: pvpRuntimeUnitInfos count:{pvpRuntimeUnitInfos.Count}"); } } /// /// 单个战斗单元上阵数据,该数据会序列化后发送给服务器 /// [Serializable] public class PVPUnitInfo { [Serializable] private class PVPUnitInfoListData { public List unitInfos; } public uint unitID; public Unit.UnitType type = Unit.UnitType.Charactor; public int cellIndex; public LevelData.AIType aiType = LevelData.AIType.BasicAI; public LevelData.AttachAIType attachAIType = LevelData.AttachAIType.ChainAI; public static byte[] Serialize(List unitInfos) { // var listData = new PVPUnitInfoListData() // { // unitInfos = unitInfos, // }; //var jsonStr = JsonUtility.ToJson(listData); MSG_PvpTeamData teamData = new MSG_PvpTeamData() { }; foreach (var unit in unitInfos) { if (unit.type == Unit.UnitType.Charactor) { teamData.CharacterCell.Add((uint)unit.cellIndex + 1); } else if (unit.type == Unit.UnitType.Building) { teamData.BuildingCell.Add((uint)unit.cellIndex + 1); } else { teamData.VehicleCell.Add((uint)unit.cellIndex + 1); } } return teamData.ToByteArray(); } public static MSG_PvpTeamData DeSerialize(byte[] bytes) { if (bytes == null) return null; //var jsonStr = System.Text.Encoding.UTF8.GetString(bytes); MSG_PvpTeamData teamData = MSG_PvpTeamData.Parser.ParseFrom(bytes); return teamData; } public static List ParsePvpDefenceData(MSG_PvpDefenceData pvpDefenceData) { var characterIDs = new List(pvpDefenceData.Characters.Select(character => character.Id)); var vehicleIDs = new List(pvpDefenceData.Vehicle.Select(v => v.Id)); var buildingIDs = pvpDefenceData.BuildingId; var teamData = MSG_PvpTeamData.Parser.ParseFrom(pvpDefenceData.TeamData); var pvpUnitInfos = new List(); for (int i = 0; i < characterIDs.Count; i++) { var unit = new PVPUnitInfo() { unitID = characterIDs[i], cellIndex = (int)teamData.CharacterCell[i] - 1, type = Unit.UnitType.Charactor }; pvpUnitInfos.Add(unit); } for (int i = 0; i < vehicleIDs.Count; i++) { var unit = new PVPUnitInfo() { unitID = vehicleIDs[i], cellIndex = (int)teamData.VehicleCell[i] - 1, type = Unit.UnitType.Vehicle }; pvpUnitInfos.Add(unit); } for (int i = 0; i < buildingIDs.Count; i++) { var unit = new PVPUnitInfo() { unitID = buildingIDs[i], cellIndex = (int)teamData.BuildingCell[i] - 1, type = Unit.UnitType.Building }; pvpUnitInfos.Add(unit); } return pvpUnitInfos; } public static List ParseMyPvpDefenceData() { var characterIDs = Actor.Instance.Pvp.CharacterIDs; var vehicleIDs = Actor.Instance.Pvp.VehicleIDs; var buildingIDs = Actor.Instance.Pvp.BuildingIds; var teamDataBytes = Actor.Instance.Pvp.TeamData; var teamData = MSG_PvpTeamData.Parser.ParseFrom(teamDataBytes); var pvpUnitInfos = new List(); for (int i = 0; i < characterIDs.Count; i++) { var unit = new PVPUnitInfo() { unitID = characterIDs[i], cellIndex = (int)teamData.CharacterCell[i] - 1, type = Unit.UnitType.Charactor }; pvpUnitInfos.Add(unit); } for (int i = 0; i < vehicleIDs.Count; i++) { var vehicleID = vehicleIDs[i]; if (vehicleID > 0 && VehicleCultivateDataManager.Instance.DataDic.ContainsKey(vehicleID)) { var unit = new PVPUnitInfo() { unitID = vehicleID, cellIndex = (int)teamData.VehicleCell[i] - 1, type = Unit.UnitType.Vehicle }; pvpUnitInfos.Add(unit); } } for (int i = 0; i < buildingIDs.Count; i++) { var id = buildingIDs[i]; var unit = new PVPUnitInfo() { unitID = id, cellIndex = (int)teamData.BuildingCell[i] - 1, type = Unit.UnitType.Building }; pvpUnitInfos.Add(unit); } return pvpUnitInfos; } } public class PVPUnitRuntimeInfo { public PVPUnitInfo pvpUnitInfo { get; private set; } public uint unitID => pvpUnitInfo.unitID; public Unit.UnitType type => pvpUnitInfo.type; public int cellIndex => pvpUnitInfo.cellIndex; public LevelData.AIType aiType => pvpUnitInfo.aiType; public LevelData.AttachAIType attachAIType => pvpUnitInfo.attachAIType; public Gameplay.Net.CharacterInfo characterInfo { get; private set; } public Gameplay.Net.VehicleInfo vehicleInfo { get; private set; } public FightBuildingData fightBuildingData{ get; private set; } public PVPUnitRuntimeInfo(PVPUnitInfo pvpUnitInfo, Gameplay.Net.CharacterInfo characterInfo, Gameplay.Net.VehicleInfo vehicleInfo, FightBuildingData buildingData) { this.pvpUnitInfo = pvpUnitInfo; this.characterInfo = characterInfo; this.vehicleInfo = vehicleInfo; this.fightBuildingData = buildingData; } }