2
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

207 lines
8.2 KiB
C#

using Entitas;
using Game;
using System;
using System.Collections.Generic;
namespace Game
{
//连招输入数据
public class ComboInputRecord
{
public PPlayerInput InputInfo;
public float TimeRecord;
public bool CancelIgore;
public bool Active;
}
//武器携带的技能数据
public class WeaponSkill
{
public Dictionary<Tuple<EComboStance, EComboTriggerType>, string> SkillDict = new Dictionary<Tuple<EComboStance, EComboTriggerType>, string>();
public Dictionary<EComboTriggerType, string> SkillAnyDict = new Dictionary<EComboTriggerType, string>();
public HashSet<string> SkillSet = new HashSet<string>();
}
}
[Game]
public class ComboComponent : IComponent
{
public List<string> WeaponList = new List<string>(); //武器列表
public MetaData<int> WeaponNow = new MetaData<int>();//当前武器下标
public Dictionary<string, WeaponSkill> WeaponSkillDict = new Dictionary<string, WeaponSkill>();//武器技能
public EComboStance Stance; //当前真正的姿态,进入后摇后更新
public EComboStance PreStance; //当前技能的后摇姿态,释放技能时更新
public List<ComboInputRecord> InputQueue = new List<ComboInputRecord>();//指令缓存
public float TriggerCancelSafeTime = 0; //清除cache的保护时间
public HashSet<EFunctionKey> KeyPressSet = new HashSet<EFunctionKey>(); //按下状态的按键
public EMoveCommand MoveCommand = EMoveCommand.Stop; //移动指令 技能释放时会根据最新的移动指令调整方向
public bool IsJumpCancelable = false; //当前技能是否能通过跳跃取消
public bool IsGroundCancelable = false; //当前技能是否能通过落地取消
public bool IsSkillCancelable = false; //当前技能是否能通过其他技能取消
public int TargetLock = 0; //锁定的目标id 0为当前无目标 -1为当前范围内找不到目标
public Dictionary<int, float> TargetLastLockTime = new Dictionary<int, float>(); //距离目标上次锁定的时间 一段时间内无法重复锁定相同目标以便切换目标
public MetaData<int> TargetInteract = new MetaData<int>(); //交互的目标id 0为当前无目标
}
namespace Game
{
public abstract partial class Util
{
public static bool HasSkill(GameEntity entity, string skillId)
{
var weaponSkill = GetWeaponSkillBySkillId(entity, skillId);
if (weaponSkill == null)
{
return false;
}
return weaponSkill.SkillSet.Contains(skillId);
}
public static void AddSkillAll(GameEntity entity)
{
var skillCfgDatas = Util.GetSkillMasterConfigDataAll();
foreach (var skillCfgData in skillCfgDatas)
{
AddSkill(entity, skillCfgData.TechnicalName);
}
}
public static void AddSkill(GameEntity entity, string skillId)
{
var weaponSkill = GetWeaponSkillBySkillId(entity, skillId);
if (weaponSkill == null)
{
return;
}
if (weaponSkill.SkillSet.Contains(skillId))
{
return;
}
weaponSkill.SkillSet.Add(skillId);
var skillCfg = Util.GetSkillMasterConfig(skillId);
var stance = (EComboStance)skillCfg.SkillCombo.StanceStart;
var triggerType = (EComboTriggerType)skillCfg.SkillCombo.TriggerType;
if (stance == EComboStance.Any)
{
//顶替
if (weaponSkill.SkillAnyDict.ContainsKey(triggerType))
{
RemoveSkill(entity, weaponSkill.SkillAnyDict[triggerType]);
}
weaponSkill.SkillAnyDict.Add(triggerType, skillId);
}
else
{
var skillKey = new Tuple<EComboStance, EComboTriggerType>(stance, triggerType);
//顶替
if (weaponSkill.SkillDict.ContainsKey(skillKey))
{
RemoveSkill(entity, weaponSkill.SkillDict[skillKey]);
}
weaponSkill.SkillDict.Add(skillKey, skillId);
}
}
public static void RemoveSkill(GameEntity entity, string skillId)
{
var weaponSkill = GetWeaponSkillBySkillId(entity, skillId);
if (weaponSkill == null)
{
return;
}
if (!weaponSkill.SkillSet.Contains(skillId))
{
return;
}
weaponSkill.SkillSet.Remove(skillId);
foreach (var item in weaponSkill.SkillDict)
{
if (item.Value == skillId)
{
weaponSkill.SkillDict.Remove(item.Key);
break;//原则上只有一个
}
}
foreach (var item in weaponSkill.SkillAnyDict)
{
if (item.Value == skillId)
{
weaponSkill.SkillAnyDict.Remove(item.Key);
break;//原则上只有一个
}
}
}
public static WeaponSkill GetWeaponSkillBySkillId(GameEntity entity, string skillId)
{
var combo = entity.combo;
var skillCfg = Util.GetSkillMasterConfig(skillId);
var weaponId = skillCfg.SkillCombo.Weapon.TechnicalName;
if (combo.WeaponSkillDict.ContainsKey(weaponId))
{
return combo.WeaponSkillDict[weaponId];
}
return null;
}
public static WeaponSkill GetWeaponSkillNow(GameEntity entity)
{
var combo = entity.combo;
return combo.WeaponSkillDict[combo.WeaponList[combo.WeaponNow.Value]];
}
public static bool HasComboAny(GameEntity entity, EComboTriggerType triggerType)
{
var combo = entity.combo;
var weaponSkill = GetWeaponSkillNow(entity);
return weaponSkill.SkillAnyDict.ContainsKey(triggerType);
}
public static string GetComboAny(GameEntity entity, EComboTriggerType triggerType)
{
var combo = entity.combo;
var weaponSkill = GetWeaponSkillNow(entity);
return weaponSkill.SkillAnyDict[triggerType];
}
public static bool HasCombo(GameEntity entity, Tuple<EComboStance, EComboTriggerType> skillKey)
{
var combo = entity.combo;
var weaponSkill = GetWeaponSkillNow(entity);
return weaponSkill.SkillDict.ContainsKey(skillKey);
}
public static string GetCombo(GameEntity entity, Tuple<EComboStance, EComboTriggerType> skillKey)
{
var combo = entity.combo;
var weaponSkill = GetWeaponSkillNow(entity);
return weaponSkill.SkillDict[skillKey];
}
public static void SetWeaponList(GameEntity entity, List<string> weaponList)
{
var combo = entity.combo;
combo.WeaponList = weaponList;
combo.WeaponNow.Value = 0;
foreach (var item in weaponList)
{
combo.WeaponSkillDict[item] = new WeaponSkill();
}
}
public static void SetWeaponListAll(GameEntity entity)
{
var weaponCfgDatas = Util.GetWeaponConfigDataAll();
var weaponIdList = new List<string>();
foreach (var weaponCfgData in weaponCfgDatas)
{
weaponIdList.Add(weaponCfgData.TechnicalName);
}
SetWeaponList(entity, weaponIdList);
}
public static void ClearCombo(GameEntity entity)
{
entity.combo.Stance = EComboStance.Idle;
entity.combo.PreStance = EComboStance.Idle;
entity.combo.MoveCommand = EMoveCommand.Stop;
entity.combo.WeaponSkillDict.Clear();
entity.combo.InputQueue.Clear();
entity.combo.KeyPressSet.Clear();
}
}
}