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#
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();
|
|
}
|
|
}
|
|
} |