NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Level/State/LevelStateBattle.cs

449 lines
16 KiB
C#
Raw Normal View History

2024-01-04 15:32:00 +08:00
using System;
using AOT.PostProcess.BlackArea;
2023-08-22 19:08:45 +08:00
using Framework;
using Gameplay.Area;
using Gameplay.Buff;
using Gameplay.Bullet;
using Gameplay.Character;
2024-05-30 13:07:39 +08:00
using Gameplay.Fight.Capture;
2024-07-01 13:08:37 +08:00
using Gameplay.Guide;
2023-08-22 19:08:45 +08:00
using Gameplay.Pause;
using Gameplay.Skill;
2023-12-13 16:20:41 +08:00
using Gameplay.Unit;
using Gameplay.Unit.Data;
2023-08-22 19:08:45 +08:00
using Gameplay.Vehicle.Impl;
2023-10-19 15:00:19 +08:00
using Gameplay.Vehicle.TireMark;
2024-11-14 14:22:30 +08:00
using LTGame;
2024-08-09 18:08:27 +08:00
using PhxhSDK;
2023-08-22 19:08:45 +08:00
using TGS;
using UnityEngine;
2023-10-19 15:00:19 +08:00
using Utils.Bounds;
2023-08-22 19:08:45 +08:00
namespace Gameplay.Level
{
2024-11-14 14:22:30 +08:00
public class LevelStateBattle : BaseLevelState
2023-08-22 19:08:45 +08:00
{
2024-11-14 14:22:30 +08:00
public LevelStateBattle(Level level) : base(level, ELevelState.Battle)
{
}
2023-08-22 19:08:45 +08:00
2023-10-19 15:00:19 +08:00
private bool _canUpdate;
2023-08-22 19:08:45 +08:00
2024-11-14 14:22:30 +08:00
protected override void _OnEnter(NBaseState exitState,
object param)
2023-08-22 19:08:45 +08:00
{
2024-11-14 14:22:30 +08:00
base._OnEnter(exitState, param);
2023-08-22 19:08:45 +08:00
_canUpdate = false;
2023-12-14 14:42:27 +08:00
GameUnitManager.instance.EnterBattle();
2024-11-14 14:22:30 +08:00
2023-12-15 16:05:57 +08:00
// 这个必须在GameUnitManager.instance.EnterBattle()之后
// 因为他会给unit增加buff
BoundsManager.instance.Init();
2023-10-19 15:00:19 +08:00
2023-08-22 19:08:45 +08:00
_level.LevelTime = 0;
_level.isInBattle = true;
EventManager.Instance.Send(EventManager.EventName.LevelBattleBegin);
2024-01-04 15:32:00 +08:00
EventManager.Instance.Register(EventManager.EventName.ToFightModelDragEnd, (Action<Vector2>)_OnModelDragEnd);
2023-08-22 19:08:45 +08:00
_canUpdate = true;
2024-08-09 18:08:27 +08:00
2024-08-12 13:05:22 +08:00
var cameraInfo = _level.Map.MapData.cameraMarginInfo;
2024-08-09 18:08:27 +08:00
CameraManager.Instance.MainCamera.GetComponent<CameraController>().rightMargin = cameraInfo.rightMarginInFight;
CameraManager.Instance.MainCamera.GetComponent<CameraController>().leftMargin = cameraInfo.leftMarginInFight;
CameraManager.Instance.MainCamera.GetComponent<CameraController>().topMargin = cameraInfo.topMarginInFight;
CameraManager.Instance.MainCamera.GetComponent<CameraController>().bottomMargin = cameraInfo.bottomMarginInFight;
2024-08-15 18:18:12 +08:00
CameraManager.Instance.MainCamera.GetComponent<CameraController>().AdjustSelf();
LevelManager.Instance.CurrentLevel.SetSpeed(ELevelSpeed.DEFAULT_SPEED);
2023-08-22 19:08:45 +08:00
}
2024-11-14 14:22:30 +08:00
protected override void _OnRunning()
2023-08-22 19:08:45 +08:00
{
2024-11-14 14:22:30 +08:00
base._OnRunning();
2023-08-22 19:08:45 +08:00
if (!_canUpdate) return;
_level.LevelTime += deltaTime;
SkillManager.instance.LogicUpdate(deltaTime);
BulletManager.instance.LogicUpdate(deltaTime);
2023-12-14 15:31:46 +08:00
GameUnitManager.instance.LogicUpdate(deltaTime);
2024-07-09 15:03:48 +08:00
BuffManager.instance.LogicUpdate(deltaTime);
2023-08-22 19:08:45 +08:00
AreaManager.instance.LogicUpdate(deltaTime);
PauseManager.instance.LogicUpdate(deltaTime);
2023-10-19 15:00:19 +08:00
TireMarkManager.instance.LogicUpdate(deltaTime);
2024-05-30 13:07:39 +08:00
CaptureManager.instance.LogicUpdate(deltaTime);
BlackAreaManager.instance.LogicUpdate(deltaTime);
2023-11-08 12:59:16 +08:00
EventManager.Instance.Send(EventManager.EventName.LevelTimeIncrease,deltaTime);
2023-08-22 19:08:45 +08:00
}
2024-11-14 14:22:30 +08:00
protected override void _OnExit(NBaseState exitState,
object param)
2023-08-22 19:08:45 +08:00
{
2024-11-14 14:22:30 +08:00
base._OnExit(exitState, param);
2024-01-05 15:09:21 +08:00
2024-11-14 14:22:30 +08:00
_level.isInBattle = false;
2024-01-05 15:09:21 +08:00
EventManager.Instance.Unregister(EventManager.EventName.ToFightModelDragEnd, (Action<Vector2>)_OnModelDragEnd);
2023-08-22 19:08:45 +08:00
}
protected override void _OnClick(Vector2 screenPosition)
{
2023-12-29 15:07:04 +08:00
var clickCellIndex = GroundHitHelper.CalcHitCellIndex(screenPosition,_level.Map.TerrainGridSystem);
2023-08-22 19:08:45 +08:00
if (clickCellIndex < 0)
{
2024-07-03 14:07:54 +08:00
if (GuideManager.Instance.IsGuiding && GuideManager.Instance.IsControlFloor)
return;
2024-01-04 15:32:00 +08:00
_SendDragCancelEvent();
2023-08-22 19:08:45 +08:00
return;
}
2024-07-01 13:08:37 +08:00
CheckCellClick(_level.Map.TerrainGridSystem, clickCellIndex, 0);
2023-08-22 19:08:45 +08:00
}
protected override void _OnCellClick(TerrainGridSystem tgs,
int cellIndex,
int buttonIndex)
{
if (InputManager.Instance.HandledThisFrame())
{
2024-01-04 15:32:00 +08:00
_SendDragCancelEvent();
2023-08-22 19:08:45 +08:00
return;
}
2024-09-30 18:06:04 +08:00
if (AreaManager.instance.readyAreaManager.isShow)
{
// 上阵模式
_HandleUpUnit(cellIndex);
return;
}
var selectUnit = _level.selectUnit;
if (selectUnit == null)
{
// 没有选中单位,进行选中操作
_TrySelect(cellIndex);
}
else
{
// 有选中单位,进行移动操作
_TryMove(cellIndex);
}
// var unitList = AreaManager.instance.GetUnitsByCellIndex(cellIndex);
// OnHit(unitList, cellIndex);
//_SendDragSuccess();
}
private void _HandleUpUnit(int cellIndex)
{
// 不是准备区域
2023-08-22 19:08:45 +08:00
var map = _level.Map;
2024-09-30 18:06:04 +08:00
var worldPos = AreaManager.instance.GetCellPosByIndex(cellIndex);
var teamSelectID = TeamManager.Instance.SelectID;
var unit = GameUnitManager.instance.totalUnits.Search(teamSelectID);
if (unit == null)
{
_SendDragCancelEvent();
return;
}
if (GameUnitManager.instance.infightUnits.Contains(teamSelectID))
{
if (unit.gameunitType == EGameUnitType.Character)
{
if (unit.statusData.isOnVehicle)
{
//下车
_GetOutVehicle(teamSelectID, cellIndex);
}
}
}
else
{
_FightInBattle(map, cellIndex, worldPos);
}
}
private void _TryMove(int cellIndex)
{
if (!AreaManager.instance.moveAreaView.CheckIsInArea(cellIndex))
{
// 不在区域内,提示操作无效
UITipsManager.ShowTips("无法移动到该位置");
return;
}
var selectUnit = _level.selectUnit;
if (selectUnit.controlData.targetCellIndex == -1)
{
if (selectUnit.transData.cellIndex == cellIndex)
{
// 没有移动
if (!selectUnit.unitUIData.isContinueLock)
{
// 取消选中
_level.UnSelectUnit();
}
2024-09-30 18:06:04 +08:00
return;
}
}
else
{
if (selectUnit.controlData.targetCellIndex == cellIndex)
{
// 没有移动
if (!selectUnit.unitUIData.isContinueLock)
{
// 取消选中
_level.UnSelectUnit();
}
2024-09-30 18:06:04 +08:00
return;
}
}
selectUnit.MoveTo(cellIndex, true);
_CheckAfterMove(cellIndex);
2024-09-30 18:06:04 +08:00
if (!selectUnit.unitUIData.isContinueLock)
{
// 取消选中
_level.UnSelectUnit();
}
2024-09-30 18:06:04 +08:00
}
private void _CheckAfterMove(int cellIndex)
{
var selectUnit = _level.selectUnit;
2024-10-08 19:50:22 +08:00
if (selectUnit.gameunitType != EGameUnitType.Character
&& selectUnit.gameunitType != EGameUnitType.Vehicle) return;
var units = AreaManager.instance.GetUnitsByCellIndex(cellIndex);
for (int i = 0; i < units.Count; i++)
{
var unit = units[i];
if (unit.commonData.troopId == selectUnit.commonData.troopId)
{
2024-10-08 19:50:22 +08:00
if (selectUnit.gameunitType == EGameUnitType.Vehicle)
{
// 载具不能上载具
return;
}
// 点击的己方单位, 这里必然是载具
var vehicle = unit as NormalVehicle;
if (vehicle == null)
{
DebugUtil.LogError("不是载具");
return;
}
if (vehicle.CheckCanUp(selectUnit))
{
selectUnit.controlData.markVehicle = vehicle;
}
return;
}
else
{
// 如果是敌人, 则设置敌人目标
if (unit.statusData.CheckCanBeTarget(selectUnit, -1))
{
selectUnit.controlData.markEnemy = unit;
selectUnit.controlData.forceUpdateTarget = true;
return;
}
}
}
// 走到这里,说明没有目标,清空标记
selectUnit.controlData.markVehicle = null;
selectUnit.controlData.markEnemy = null;
}
2024-09-30 18:06:04 +08:00
private void _TrySelect(int cellIndex)
{
2023-08-22 19:08:45 +08:00
var unitList = AreaManager.instance.GetUnitsByCellIndex(cellIndex);
2024-09-30 18:06:04 +08:00
if (unitList.Count <= 0)
{
// 没有单位,不做任何操作
return;
}
for (int i = 0; i < unitList.Count; i++)
{
var unit = unitList[i];
if (unit.commonData.canSelect)
{
// 只选中可控制单位
_level.SelectUnit(unit);
if (unit.debugShowInfo.cacheConfigId != 0)
{
EventManager.Instance.Send(EventManager.EventName.INFIGHT_AUDIO_SELECT_UNIT, unit.debugShowInfo.cacheConfigId);
}
return;
}
}
2023-08-22 19:08:45 +08:00
}
2023-10-19 15:00:19 +08:00
private void _FightInBattle(Map map,
int cellIndex,
Vector3 worldPosition)
{
if (TeamManager.Instance.IsFightListLimit(TeamManager.Instance.SelectID))
{
//TODO chenyq 需要添加到stringconfig
2024-01-05 15:09:21 +08:00
_SendDragCancelEvent();
LevelManager.Instance.CurrentLevel.UnSelectUnit();
2023-10-19 15:00:19 +08:00
UITipsManager.ShowTips("上阵人数达到上限!");
return;
}
2023-10-19 15:00:19 +08:00
// 不是准备区域
if (!AreaManager.instance.readyAreaManager.CheckIsInReadyArea(cellIndex))
2023-10-19 15:00:19 +08:00
{
2024-01-05 15:09:21 +08:00
_SendDragCancelEvent();
2023-10-19 15:00:19 +08:00
return;
}
var crossLevel = 0;
var unitType = TeamManager.Instance.GetUnitType(TeamManager.Instance.SelectID);
switch (unitType)
{
case TeamUnitInfo.CharacType.Hero:
2023-10-19 15:00:19 +08:00
var characterDataInfo = TeamManager.Instance.GetCharacterDataInfo(TeamManager.Instance.SelectID)
.GetConfigInfo();
crossLevel = characterDataInfo.Cfg.MoveCrossLevel;
break;
case TeamUnitInfo.CharacType.Vehicle:
2023-10-19 15:00:19 +08:00
var vehicleInfo = TeamManager.Instance.GetCharacterDataInfo(TeamManager.Instance.SelectID)
.GetVehicleInfo();
crossLevel = vehicleInfo.Cfg.MoveCrossLevel;
break;
default:
DebugUtil.LogError("暂未处理的类型:{0}", unitType);
2023-08-22 19:08:45 +08:00
return;
2023-10-19 15:00:19 +08:00
}
// 检查通行级别是否可以放置
2023-12-14 18:25:52 +08:00
var blockData = map.GetBlockData(cellIndex);
2023-10-19 15:00:19 +08:00
if (!MapUtils.CanPass(crossLevel, blockData.GetTerrainTypeProperty()))
{
2024-01-05 15:09:21 +08:00
_SendDragCancelEvent();
2023-10-19 15:00:19 +08:00
return;
}
var yaw = LevelUtils.SetCharaterToward(_level.GetLevelData().preparingRegionToward);
switch (unitType)
{
case TeamUnitInfo.CharacType.Hero:
2023-10-19 15:00:19 +08:00
_CreateCharacter(TeamManager.Instance.SelectID, worldPosition, yaw);
break;
case TeamUnitInfo.CharacType.Vehicle:
2023-10-19 15:00:19 +08:00
_CreateVehicle(TeamManager.Instance.SelectID, worldPosition, yaw);
break;
}
2024-03-28 16:13:10 +08:00
2023-10-19 15:00:19 +08:00
_level.SelectUnit(TeamManager.Instance.SelectID);
2024-03-28 16:13:10 +08:00
_SendDragSuccess();
2024-01-09 17:08:19 +08:00
//_level.SetSpeed(ELevelSpeed.Normal);
2023-10-19 15:00:19 +08:00
}
private void _CreateCharacter(uint id,
2023-10-19 15:00:19 +08:00
Vector3 position,
float yaw)
{
var map = _level.Map;
if (map == null) return;
// var characterInfo = CharacterDataInfoManager.Instance.GetCharacterInfo(TeamManager.Instance.SelectID);
// if (characterInfo == null)
// {
// return;
// }
// var character = await GameUnitManager.instance.PrepareCharacter(characterInfo, ETroopsId.Self);
// if (character == null)
// {
// DebugUtil.LogError("创建角色失败");
// return;
// }
2023-12-14 14:42:27 +08:00
if (!map.WorldPosition2TGSCellIndex(position, out var cellIndex))
{
DebugUtil.LogError("无法获取到单元格索引");
return;
2023-10-19 15:00:19 +08:00
}
GameUnitManager.instance.MoveUnitToFight(id, cellIndex, yaw);
2023-10-19 15:00:19 +08:00
}
private void _CreateVehicle(uint id,
2023-10-19 15:00:19 +08:00
Vector3 pos,
float yaw)
{
// var vInfo = VehicleCultivateDataManager.Instance.GetVehicleCultivateData(id);
// var vehicle = await GameUnitManager.instance.PrepareVehicle(vInfo, ETroopsId.Self);
// if (vehicle == null)
// {
// DebugUtil.LogError("创建载具失败");
// return;
// }
2023-12-14 14:58:07 +08:00
if (!_level.Map.WorldPosition2TGSCellIndex(pos, out var cellIndex))
{
DebugUtil.LogError("无法获取到cellIndex: {0}", pos);
return;
}
GameUnitManager.instance.MoveUnitToFight(id, cellIndex, yaw);
2023-10-19 15:00:19 +08:00
}
private void _GetOutVehicle(uint uid,
int cellIndex)
{
if (GameUnitManager.instance.infightUnits.Search(uid) is Character.Character gameUnit)
2023-10-19 15:00:19 +08:00
{
var character = gameUnit;
2024-04-12 20:36:22 +08:00
if (character.fullFSM.currentState.id != EFullState.OnVehicle)
{
return;
}
if (AreaManager.instance.readyAreaManager.CheckIsInReadyArea(cellIndex))
2023-10-19 15:00:19 +08:00
{
character.transData.disableEvent = true;
character.transData.pos =
LevelManager.Instance.CurrentLevel.Map.TGSCellIndex2WorldPosition(cellIndex);
character.transData.disableEvent = false;
character.DownVehicle();
2024-03-28 16:13:10 +08:00
_SendDragSuccess();
2024-03-28 16:53:57 +08:00
return;
2023-08-22 19:08:45 +08:00
}
2024-03-28 16:53:57 +08:00
_SendDragCancelEvent();
2023-10-19 15:00:19 +08:00
}
}
2024-01-04 15:32:00 +08:00
private void _OnModelDragEnd(Vector2 screenPos)
{
_OnClick(screenPos);
}
private void _SendDragCancelEvent()
{
if (TeamManager.IsHideAllUI)
{
TeamManager.IsHideAllUI = false;
TeamManager.Instance.CloseFightPosterUI();
}
2024-01-04 15:32:00 +08:00
EventManager.Instance.Send(EventManager.EventName.ToFightModelDragSuc, false);
}
private void _SendDragSuccess()
{
if (TeamManager.IsHideAllUI)
{
TeamManager.IsHideAllUI = false;
TeamManager.Instance.CloseFightPosterUI();
}
2024-01-04 15:32:00 +08:00
EventManager.Instance.Send(EventManager.EventName.ToFightModelDragSuc, true);
}
2023-08-22 19:08:45 +08:00
}
}