CTT/Server/Hotfix/Game/System/User/UnitSkillComponentSystem.cs

327 lines
12 KiB
C#
Raw Normal View History

2021-04-08 20:09:59 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
2021-04-11 19:50:39 +08:00
using Cal;
2021-04-08 20:09:59 +08:00
using Cal.DataTable;
namespace ET
{
public class UnitSkillComponentDestroySystem : DestroySystem<UnitSkillComponent>
{
public override void Destroy(UnitSkillComponent self)
{
self.SkillLearnedDic.Clear();
self.SkillUnLearnedDic.Clear();
}
}
public static class UnitSkillComponentSystem
{
public static bool InitSkill(this UnitSkillComponent self, JobType jobType)
{
2021-04-11 19:50:39 +08:00
Dictionary<int, SkillLogicConfig>.KeyCollection skillLogicConfig = SkillConfigComponent.SkillLogicCollection.skillDic.Keys;
foreach (int skillId in skillLogicConfig)
2021-04-08 20:09:59 +08:00
{
if (skillId / 100000 == (int)jobType)
{
UnitSkill unitSkill = new UnitSkill { Id = skillId };
if (skillId % 100000 == 1)
{
unitSkill.Level = 1;
self.SkillLearnedDic.Add(skillId, unitSkill);
}
else
{
unitSkill.Level = 0;
self.SkillUnLearnedDic.Add(skillId, unitSkill);
}
}
}
return true;
}
public static async ETTask ResetSkill(this UnitSkillComponent self)
{
2021-04-11 19:50:39 +08:00
Unit unit = self.GetParent<Unit>();
PlayerData data = self.Parent.GetComponent<PlayerData>();
KeyValuePair<int, int> kv = data.SkillPointKV;
2021-04-08 20:09:59 +08:00
data.SkillPointKV = KeyValuePair.Create(kv.Value, kv.Value);
Dictionary<int, int> retdic = new Dictionary<int, int>();
2021-04-11 19:50:39 +08:00
Dictionary<int, UnitSkill> dic = self.SkillLearnedDic;
2021-04-08 20:09:59 +08:00
UnitSkill unitSkill = null;
2021-04-11 19:50:39 +08:00
foreach (KeyValuePair<int, UnitSkill> dicKV in dic)
2021-04-08 20:09:59 +08:00
{
try
{
if (dicKV.Key % 100000 == 1)
{
unitSkill = dicKV.Value;
continue;
}
for (int i = 1; i <= dicKV.Value.Level; i++)
{
int nextSkillId = dicKV.Key * 100 + i;
SkillLearn skillLearn = SkillLearnCategory.Instance.Get(nextSkillId);
2021-04-11 19:50:39 +08:00
foreach (SkillLearn.Material item in skillLearn.MaterialArr)
2021-04-08 20:09:59 +08:00
{
if (!retdic.ContainsKey(item._Id))
{
retdic[item._Id] = 0;
}
retdic[item._Id] += item.Count;
}
}
dicKV.Value.Level = 0;
self.SkillUnLearnedDic.Add(dicKV.Key, dicKV.Value);
}
catch (Exception e)
{
Log.Error(e);
}
}
dic.Clear();
if (unitSkill != null)
{
dic.TryAdd(unitSkill.Id, unitSkill);
}
else
Log.Error($"skill == null where id = {unit.Id}");
2021-04-11 19:50:39 +08:00
foreach (KeyValuePair<int, int> item in retdic)
2021-04-08 20:09:59 +08:00
{
try
{
await MailHelper.AddItem(unit.Id, item.Key, item.Value, true, "", "重置技能", "节能书返还", "");
}
catch (Exception e)
{
Log.Error(e);
}
}
UnitHelper.SaveComponenet(data).Coroutine();
UnitHelper.SaveComponenet(self).Coroutine();
UnitHelper.Save<NumericComponent>(unit).Coroutine();
}
public static void ResetFreeSkill(this UnitSkillComponent self)
{
2021-04-11 19:50:39 +08:00
Unit unit = self.GetParent<Unit>();
PlayerData data = self.Parent.GetComponent<PlayerData>();
KeyValuePair<int, int> kv = data.SkillPointKV;
2021-04-08 20:09:59 +08:00
data.SkillPointKV = KeyValuePair.Create(kv.Value, kv.Value);
2021-04-11 19:50:39 +08:00
Dictionary<int, UnitSkill> dic = self.SkillLearnedDic;
2021-04-08 20:09:59 +08:00
UnitSkill unitSkill = null;
2021-04-11 19:50:39 +08:00
foreach (KeyValuePair<int, UnitSkill> dicKV in dic)
2021-04-08 20:09:59 +08:00
{
try
{
if (dicKV.Key % 100000 == 1)
{
unitSkill = dicKV.Value;
continue;
}
dicKV.Value.Level = 0;
self.SkillUnLearnedDic.Add(dicKV.Key, dicKV.Value);
}
catch (Exception e)
{
Log.Error(e);
}
}
dic.Clear();
if (unitSkill != null)
{
dic.TryAdd(unitSkill.Id, unitSkill);
}
else
Log.Error($"skill == null where id = {unit.Id}");
UnitHelper.SaveComponenet(data).Coroutine();
UnitHelper.SaveComponenet(self).Coroutine();
UnitHelper.Save<NumericComponent>(unit).Coroutine();
}
public static void TransferJob(this UnitSkillComponent self, int job)
{
self.SkillLearnedDic.Clear();
self.SkillUnLearnedDic.Clear();
try
{
self.InitSkill((JobType)job);
}
catch (Exception e)
{
Log.Error(e);
}
2021-04-11 19:50:39 +08:00
PlayerData data = self.Parent.GetComponent<PlayerData>();
KeyValuePair<int, int> kv = data.SkillPointKV;
2021-04-08 20:09:59 +08:00
data.SkillPointKV = KeyValuePair.Create(kv.Value, kv.Value);
UnitHelper.SaveComponenet(data).Coroutine();
UnitHelper.SaveComponenet(self).Coroutine();
}
public static bool InitMonsterSkill(this UnitSkillComponent self, int skillId)
{
UnitSkill unitSkill = new UnitSkill { Id = skillId };
self.SkillUnLearnedDic.TryAdd(skillId, unitSkill);
return true;
}
public static void LearnMonsterSkill(this UnitSkillComponent self, int skillId)
{
2021-04-11 19:50:39 +08:00
UnitSkill unitSkill = self.GetUnlearnedSkill(skillId);
2021-04-08 20:09:59 +08:00
if (unitSkill == UnitSkill.Null)
{
Log.Error($"未找到技能Id为{skillId}");
return;
}
unitSkill.Level = 1;
//unitSkill.UpdateSkillLevel(self.GetParent<Unit>());
self.SkillLearnedDic.TryAdd(skillId, unitSkill);
self.SkillUnLearnedDic.Remove(skillId);
}
public static string LearnSkill(this UnitSkillComponent self, int skillId, int level)
{
//var unitSkill = self.GetSkill(skillId);
//if (unitSkill == null)
//{
// return "技能书使用错误";
//}
//var ret = unitSkill.UpdateSkillLevel(self.GetParent<Unit>(), level);
//if (!ret.Equals(string.Empty))
//{
// return ret;
//}
//if (level == 1)
//{
// self.SkillLearnedDic.Add(skillId, unitSkill);
// self.SkillUnLearnedDic.Remove(skillId);
//}
//return string.Empty;
return "系统错误";
}
public static string LearnSkill(this UnitSkillComponent self, int skillId)
{
2021-04-11 19:50:39 +08:00
UnitSkill unitSkill = self.GetSkill(skillId);
2021-04-08 20:09:59 +08:00
if (unitSkill == UnitSkill.Null)
{
Log.Error($"unitSkill == null where id = {skillId}");
return "系统错误";
}
SkillConfig skillConfig = DataTableHelper.Get<SkillConfig>(skillId * 100);
if (skillConfig == null)
{
Log.Error($"skillConfig == null where id = {skillId}");
return "系统错误";
}
int maxLevel = skillConfig.MaxLevel;
if (unitSkill.Level == maxLevel)
{
return "等级达到最大级";
}
2021-04-11 19:50:39 +08:00
NumericComponent num = self.Parent.GetComponent<NumericComponent>();
2021-04-08 20:09:59 +08:00
int nextLevel = unitSkill.Level + 1;
int nextSkillId = skillId * 100 + unitSkill.Level + 1;
SkillConfig skillConfig_Level = DataTableHelper.Get<SkillConfig>(nextSkillId);
if (skillConfig_Level == null)
{
Log.Error($"skillConfig_Level == null where id = {nextSkillId}");
return "系统错误";
}
if (skillConfig_Level.LearnLevel > num.GetAsInt(NumericType.Level))
{
return "等级不足";
}
2021-04-11 19:50:39 +08:00
PlayerData data = self.Parent.GetComponent<PlayerData>();
2021-04-08 20:09:59 +08:00
int currPoint = data.SkillPointKV.Key;
int totalPoint = data.SkillPointKV.Value;
if (currPoint <= 0)
{
return "技能点不足";
}
//!判断前置
if (skillConfig.PreSkillId != 0)
{
SkillConfig skillConfig_PreSkill = DataTableHelper.Get<SkillConfig>(skillConfig.PreSkillId * 100);
if (skillConfig_PreSkill == null)
{
Log.Error($"skillConfig_PreSkill == null where id = {skillConfig.PreSkillId}");
return "系统错误";
}
int maxPreLevel = skillConfig_PreSkill.MaxLevel;
2021-04-11 19:50:39 +08:00
UnitSkill unitPreSkill = self.GetSkill(skillConfig.PreSkillId);
2021-04-08 20:09:59 +08:00
if (unitPreSkill == UnitSkill.Null)
{
Log.Error($"unitPreSkill == null where id = {skillConfig.PreSkillId}");
return "系统错误";
}
if (unitPreSkill.Level < maxPreLevel)
{
return $"前置技能{skillConfig_PreSkill.Name}未完全掌握!";
}
}
SkillLearn skillLearn = SkillLearnCategory.Instance.Get(nextSkillId);
2021-04-11 19:50:39 +08:00
Unit unit = self.GetParent<Unit>();
Bag bag = unit.GetComponent<Bag>();
foreach (SkillLearn.Material needMaterial in skillLearn.MaterialArr)
2021-04-08 20:09:59 +08:00
{
if (!BagHelper.HasItem(bag, needMaterial._Id, needMaterial.Count))
{
return $"材料不足:{BagHelper.GetName(needMaterial._Id)} X {needMaterial.Count}";
}
}
2021-04-11 19:50:39 +08:00
foreach (SkillLearn.Material needMaterial in skillLearn.MaterialArr)
2021-04-08 20:09:59 +08:00
{
BagHelper.DeleteItem(bag, needMaterial._Id, needMaterial.Count);
}
currPoint--;
data.SkillPointKV = new KeyValuePair<int, int>(currPoint, totalPoint);
unitSkill.Level++;
unitSkill.IsPassive = skillConfig.SkillType == 1;
if (unitSkill.Level == 1)
{
self.SkillLearnedDic.Add(skillId, unitSkill);
self.SkillUnLearnedDic.Remove(skillId);
}
UnitHelper.SaveComponenet(data).Coroutine();
UnitHelper.SaveComponenet(self).Coroutine();
return null;
}
public static UnitSkill GetLearnedSkill(this UnitSkillComponent self, int skillId)
{
2021-04-11 19:50:39 +08:00
self.SkillLearnedDic.TryGetValue(skillId, out UnitSkill unitSkill);
2021-04-08 20:09:59 +08:00
return unitSkill;
}
public static IEnumerable<UnitSkill> GetLearnedSkills(this UnitSkillComponent self)
{
return self.SkillLearnedDic.Values;
}
public static UnitSkill GetSkill(this UnitSkillComponent self, int skillId)
{
2021-04-11 19:50:39 +08:00
if (!self.SkillLearnedDic.TryGetValue(skillId, out UnitSkill unitSkill))
2021-04-08 20:09:59 +08:00
{
self.SkillUnLearnedDic.TryGetValue(skillId, out unitSkill);
}
return unitSkill;
}
public static UnitSkill GetUnlearnedSkill(this UnitSkillComponent self, int skillId)
{
2021-04-11 19:50:39 +08:00
self.SkillUnLearnedDic.TryGetValue(skillId, out UnitSkill unitSkill);
2021-04-08 20:09:59 +08:00
return unitSkill;
}
public static UnitSkill GetFirstUnlearnedSkill(this UnitSkillComponent self)
{
2021-04-11 19:50:39 +08:00
UnitSkill[] arr = self.SkillUnLearnedDic.Values.ToArray();
2021-04-08 20:09:59 +08:00
return arr[0];
}
public static IEnumerable<UnitSkill> GetUnlearnedSkills(this UnitSkillComponent self)
{
return self.SkillUnLearnedDic.Values;
}
}
}