NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Unit/Data/UnitStatusData.cs

308 lines
7.5 KiB
C#

using AOT.PostProcess.BlackArea;
using Gameplay.Area;
using Gameplay.Character;
using Gameplay.PostProcess.BlackArea;
namespace Gameplay.Unit.Data
{
public class UnitStatusData
{
public readonly GameUnit owner;
/// <summary>
/// 是否正在移动
/// </summary>
public bool isMoveing
{
get;
set;
}
/// <summary>
/// 是否已死亡
/// </summary>
public bool isDead = false;
/// <summary>
/// 是否可以被攻击
/// </summary>
public bool canBeAttack = true;
/// <summary>
/// 是否在载具上
/// </summary>
public bool isOnVehicle
{
get;
set;
} = false;
/// <summary>
/// 是否在建筑内
/// </summary>
public bool isInBuilding
{
get;
set;
} = false;
public bool isOnFloor
{
get
{
return !isOnVehicle && !isInBuilding;
}
}
/// <summary>
/// 是否混乱
/// </summary>
public bool isChaos = false;
/// <summary>
/// 是否眩晕
/// </summary>
public bool isStun = false;
/// <summary>
/// 是否锁定位置
/// </summary>
public bool isLockPos = false;
/// <summary>
/// 是否逃跑
/// </summary>
public bool isRetreat = false;
/// <summary>
/// 是否恐惧
/// </summary>
public bool isFear = false;
/// <summary>
/// 是否已经撤离
/// </summary>
public bool isEvacuate
{
get;
set;
} = false;
/// <summary>
/// 是否需要技能暂停
/// </summary>
public bool needSkillPaused
{
get;
set;
}
/// <summary>
/// 是否是战斗状态
/// </summary>
public bool isInFight
{
get;
set;
} = true;
/// <summary>
/// 是否在释放技能
/// </summary>
public bool isInSkilling = false;
/// <summary>
/// 是否不可逃跑
/// </summary>
public bool isNoRetreat = false;
/// <summary>
/// 是否是AI控制
/// </summary>
public bool isAIControll = false;
/// <summary>
/// 是否是伪装状态
/// </summary>
public bool isPretend
{
get;
set;
} = false;
/// <summary>
/// 是否是死撑状态
/// </summary>
public bool isDeadRetreat = false;
/// <summary>
/// 是否是扛旗状态
/// </summary>
public bool isHoldFlag
{
get;
set;
}
public GameUnit lastAttackUnit = null;
/// <summary>
/// 是否激活攻击
/// </summary>
public bool isAttackActive
{
get;
set;
} = false;
/// <summary>
/// 是否允许攻击
/// </summary>
public bool isAllowAttack
{
get;
set;
} = true;
/// <summary>
/// 是否被选中
/// </summary>
public bool isSelected { get; set; }
/// <summary>
/// 是否正在重新装填
/// </summary>
public bool isReloading
{
get;
set;
}
public float reloadProgress
{
get;
set;
}
/// <summary>
/// 是否在攻击间隔中
/// </summary>
public bool isAttackEnd
{
get;
set;
}
public float attackEndProgress
{
get;
set;
}
/// <summary>
/// 自身是否可以发起攻击
/// </summary>
/// <returns></returns>
public bool CheckCanAttack()
{
if (isDead) return false;
if (!isOnFloor) return false;
if (isRetreat) return false;
if (isInSkilling) return false;
if (isEvacuate) return false;
if (!isAttackActive) return false;
if (!isAllowAttack) return false;
if (isPretend) return false;
return true;
}
/// <summary>
/// 检查是否可以被当做被攻击目标
/// checkDistance -1:不检查距离 0:使用攻击距离
/// </summary>
/// <returns></returns>
public bool CheckCanBeTarget(GameUnit attacker, int checkDistance = 0)
{
if (owner.needRemove) return false;
if (isEvacuate) return false;
if (!canBeAttack) return false;
if (!owner.isReady) return false;
if (isDead) return false;
if (!isOnFloor) return false;
if (isPretend) return false;
if (owner.commonData.troopId != ETroopsId.Self)
{
if (!BlackAreaManager.instance.CheckIsInLightArea(owner.transData.cellIndex))
{
return false;
}
}
return CheckIsInAttackArea(attacker, checkDistance);
}
public bool CheckIsInAttackArea(GameUnit attacker, int checkDistance = 0)
{
if (checkDistance == -1) return true;
if (attacker != null)
{
if (checkDistance == 0)
{
checkDistance = attacker.fightData.attackDistance;
}
var attackArea = AreaManager.instance.attackAreaManager.GetAttackArea(attacker.transData.cellIndex, checkDistance);
if (owner.fightData.isAttackIgnoreBlock)
{
if (!attackArea.totalCells.Contains(owner.transData.cellIndex))
{
return false;
}
}
else
{
if (!attackArea.canAttackCells.Contains(owner.transData.cellIndex))
{
return false;
}
}
}
return true;
}
public bool CheckCanPickFlag()
{
if (owner.commonData.troopId != ETroopsId.Self) return false;
if (owner.gameunitType != EGameUnitType.Character) return false;
var character = owner as Character.Character;
if (character == null) return false;
if (character.runtimeData.isInSuppressed) return false;
if (isPretend) return false;
if (isDead) return false;
if (!isOnFloor) return false;
if (isRetreat) return false;
// if (isInSkilling) return false;
return true;
}
public UnitStatusData(GameUnit owner)
{
this.owner = owner;
}
public void Reset()
{
isMoveing = false;
isDead = false;
canBeAttack = true;
isOnVehicle = false;
isChaos = false;
isStun = false;
isLockPos = false;
isRetreat = false;
needSkillPaused = false;
isInSkilling = false;
isNoRetreat = false;
isDeadRetreat = false;
}
}
}