NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/PVP/PVPDefenderData.cs

260 lines
7.7 KiB
C#

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;
/// <summary>
/// pvp防守方上阵数据
/// </summary>
public class PVPDefenderData
{
public List<PVPUnitRuntimeInfo> pvpRuntimeUnitInfos = new();
public List<PVPUnitInfo> 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<CharacterInfo> characterInfos = new();
if (pvpDefenceData.Characters != null)
{
foreach (var serverCharacterInfo in pvpDefenceData.Characters)
{
CharacterInfo characterInfo = new()
{
ID = serverCharacterInfo.Id,
};
characterInfo.Refresh(serverCharacterInfo);
characterInfos.Add(characterInfo);
}
}
Gameplay.Net.VehicleInfo vehicleInfo = null;
if (pvpDefenceData.Vehicle != null)
{
vehicleInfo = new()
{
nID = pvpDefenceData.Vehicle.Id,
};
vehicleInfo.Refresh(pvpDefenceData.Vehicle);
}
var unitInfos = new List<PVPUnitInfo>() { };
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);
}
if (vehicleInfo != null)
{
var unit = new PVPUnitInfo()
{
unitID = vehicleInfo.nID,
type = Unit.UnitType.Vehicle,
cellIndex = (int)unitCellInfos.VehicleCell - 1
};
unitInfos.Add(unit);
}
Init(unitInfos, characterInfos, vehicleInfo);
}
public void Init(List<PVPUnitInfo> unitInfos, List<CharacterInfo> characterInfos,
Gameplay.Net.VehicleInfo vehicleInfo)
{
pvpRuntimeUnitInfos.Clear();
int characterIndex = 0;
int vehicleIndex = 0;
for (int i = 0; i < unitInfos.Count; i++)
{
var unitInfo = unitInfos[i];
CharacterInfo characterInfo = null;
Gameplay.Net.VehicleInfo currVehicleInfo = null;
switch (unitInfo.type)
{
case Unit.UnitType.Charactor:
characterInfo = characterInfos[characterIndex];
characterIndex++;
break;
case Unit.UnitType.Vehicle:
currVehicleInfo = vehicleInfo;
vehicleIndex++;
break;
default:
break;
}
PVPUnitRuntimeInfo runtimeInfo = new(unitInfo, characterInfo, currVehicleInfo);
pvpRuntimeUnitInfos.Add(runtimeInfo);
}
}
}
/// <summary>
/// 单个战斗单元上阵数据,该数据会序列化后发送给服务器
/// </summary>
[Serializable]
public class PVPUnitInfo
{
[Serializable]
private class PVPUnitInfoListData
{
public List<PVPUnitInfo> 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<PVPUnitInfo> unitInfos)
{
// var listData = new PVPUnitInfoListData()
// {
// unitInfos = unitInfos,
// };
//var jsonStr = JsonUtility.ToJson(listData);
MSG_PvpTeamData teamData = new MSG_PvpTeamData() { };
teamData.VehicleCell = 0;
foreach (var unit in unitInfos)
{
if (unit.type == Unit.UnitType.Charactor)
{
teamData.CharacterCell.Add((uint)unit.cellIndex + 1);
}
else
{
teamData.VehicleCell = (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<PVPUnitInfo> ParsePvpDefenceData(MSG_PvpDefenceData pvpDefenceData)
{
var characterIDs = new List<uint>(pvpDefenceData.Characters.Select(character => character.Id));
var vehicleID = pvpDefenceData.Vehicle.Id;
var teamData = MSG_PvpTeamData.Parser.ParseFrom(pvpDefenceData.TeamData);
var pvpUnitInfos = new List<PVPUnitInfo>();
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);
}
if (vehicleID > 0)
{
var unit = new PVPUnitInfo()
{
unitID = vehicleID,
cellIndex = (int)teamData.VehicleCell - 1,
type = Unit.UnitType.Vehicle
};
pvpUnitInfos.Add(unit);
}
return pvpUnitInfos;
}
public static List<PVPUnitInfo> ParseMyPvpDefenceData()
{
var characterIDs = Actor.Instance.Pvp.CharacterIDs;
var vehicleID = Actor.Instance.Pvp.VehicleID;
var teamDataBytes = Actor.Instance.Pvp.TeamData;
var teamData = MSG_PvpTeamData.Parser.ParseFrom(teamDataBytes);
var pvpUnitInfos = new List<PVPUnitInfo>();
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);
}
if (vehicleID > 0)
{
var unit = new PVPUnitInfo()
{
unitID = vehicleID,
cellIndex = (int)teamData.VehicleCell - 1,
type = Unit.UnitType.Vehicle
};
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 PVPUnitRuntimeInfo(PVPUnitInfo pvpUnitInfo, Gameplay.Net.CharacterInfo characterInfo,
Gameplay.Net.VehicleInfo vehicleInfo)
{
this.pvpUnitInfo = pvpUnitInfo;
this.characterInfo = characterInfo;
this.vehicleInfo = vehicleInfo;
}
}