CTT/Server/Hotfix/Game/System/Battle/BattleComponentSystem.cs

289 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Cal;
using System;
namespace ET
{
public class BattleComponentAwakeSystem : AwakeSystem<BattleComponent>
{
public override void Awake(BattleComponent self)
{
self.unit = self.GetParent<Unit>();
}
}
public static class BattleComponentSystem
{
public static void Damage(this BattleComponent self, BallisticData data, ISkillSender skillSender)
{
try
{
var unit = self.GetParent<Unit>();
if (unit.IsAlive && data.value > 0)
{
var attackComponent = unit.GetComponent<AttackComponent>();
var attacker = attackComponent.attacker;
var num = unit.GetComponent<NumericComponent>();
int value = MathHelper.RoundToInt(data.value);
var modifierContainer = unit.GetComponent<ModifierContainerComponent>();
var attackerModifierContainer = attacker.GetComponent<ModifierContainerComponent>();
if (attackComponent.isFirstAtk)
{
var (optionList, modifierLogic) = modifierContainer.GetSkillOptionBaseArr(ModifierEventCondition.modifier);
if (optionList != null)
foreach (var item in optionList)
{
var skillOptionLogicBase = SkillOptionFactory.AcquireSkillOptionLogic(item);
skillSender.skillLogic.skillOptionLogics.Add(skillOptionLogicBase);
skillOptionLogicBase.HandleEvent(new ModifierSkillSender
{
caster = attacker,
target = unit,
skillLogic = modifierLogic.skillLogic,
modifierLogic = modifierLogic
});
}
}
if (modifierContainer.HasState(ModifierStateType.))
return;
if (modifierContainer.HasState(ModifierStateType.))
return;
foreach (var modifierLogic in modifierContainer.modifierDic.Values)
{
var shield = modifierLogic.shield;
if (shield <= 0)
continue;
if (shield <= value)
{
value -= shield;
modifierLogic.shield = 0;
modifierContainer.RemoveModifier(modifierLogic);
if(AppConfig.inst.showBattleDamageInfo)
Log.Info($"【护盾】已破buff消失,受到伤害 = {value}");
}
else
{
modifierLogic.shield -= value;
value = 0;
if (AppConfig.inst.showBattleDamageInfo)
Log.Info($"【护盾】未破 = {modifierLogic.shield}");
}
}
if (value <= 0) return;
if (attackComponent.isFirstAtk)
{
{
var (optionList, modifierLogic) = modifierContainer.GetSkillOptionBaseArr(ModifierEventCondition.modifier);
if (optionList != null)
foreach (var item in optionList)
{
var skillOptionLogicBase = SkillOptionFactory.AcquireSkillOptionLogic(item);
skillSender.skillLogic.skillOptionLogics.Add(skillOptionLogicBase);
skillOptionLogicBase.HandleEvent(new ModifierSkillSender
{
caster = attacker,
target = unit,
skillLogic = modifierLogic.skillLogic,
modifierLogic = modifierLogic
});
}
}
{
var (optionList, modifierLogic) = attackerModifierContainer.GetSkillOptionBaseArr(ModifierEventCondition.modifier);
if (optionList != null)
foreach (var item in optionList)
{
var skillOptionLogicBase = SkillOptionFactory.AcquireSkillOptionLogic(item);
skillSender.skillLogic.skillOptionLogics.Add(skillOptionLogicBase);
skillOptionLogicBase.HandleEvent(new ModifierSkillSender
{
caster = attacker,
target = unit,
skillLogic = modifierLogic.skillLogic,
modifierLogic = modifierLogic
});
}
}
}
//吸血
var attNum = attacker.GetComponent<NumericComponent>();
if (MathHelper.IsHit(attNum.Get(NumericType.SuckR)))
{
int treatValue = (int)(attNum.Get(NumericType.SuckV) * value);
if (treatValue > 0)
{
attacker.GetComponent<AttackComponent>()?.TreatTarget(attacker, new BallisticData
{
isCrit=false,
value=treatValue
}, null);
}
}
if (attacker.UnitType == UnitType.Player)
Game.EventSystem.Publish(new ET.EventType.DamageEvent
{
attacker = attacker,
damage = value
}).Coroutine();
bool isDead = num.GetAsInt(NumericType.Hp) <= value;
Game.EventSystem.Publish(new ET.EventType.BattleSkillRet
{
targetUnit = unit,
HpValue = -value,
IsCrit = data.isCrit,
}).Coroutine();
if (isDead)
{
if (modifierContainer.HasState(ModifierStateType.))
return;
if (modifierContainer.HasState(ModifierStateType.))
{
unit.DeadWillLive();
//!添加复活buff
Revival(modifierContainer, attacker, 6000).Coroutine();
return;
}
unit.Dead(num);
var attackerTargerComponent = attacker.GetComponent<TargetableUnitComponent>();
if (attackerTargerComponent.selectedEnermy?.Id == unit.Id)
{
attackerTargerComponent.selectedEnermy = null;
}
{
var (optionList, modifierLogic) = attackerModifierContainer.GetSkillOptionBaseArr(ModifierEventCondition.modifier);
if (optionList != null)
foreach (var item in optionList)
{
var skillOptionLogicBase = SkillOptionFactory.AcquireSkillOptionLogic(item);
skillSender.skillLogic.skillOptionLogics.Add(skillOptionLogicBase);
skillOptionLogicBase.HandleEvent(new ModifierSkillSender
{
caster = attacker,
target = unit,
skillLogic = modifierLogic.skillLogic,
modifierLogic = modifierLogic,
});
}
}
{
var (optionList, modifierLogic) = modifierContainer.GetSkillOptionBaseArr(ModifierEventCondition.modifier);
if (optionList != null)
foreach (var item in optionList)
{
var skillOptionLogicBase = SkillOptionFactory.AcquireSkillOptionLogic(item);
skillSender.skillLogic.skillOptionLogics.Add(skillOptionLogicBase);
skillOptionLogicBase.HandleEvent(new ModifierSkillSender
{
caster = attacker,
target = unit,
skillLogic = modifierLogic.skillLogic,
modifierLogic = modifierLogic,
});
}
}
BattleMgrCompnent.Instance.NotifyUnitDead(unit);
}
else
{
num.ReduceSet(NumericType.Hp, value);
}
}
}
catch (Exception e)
{
Log.Error(e);
}
}
private static async ETVoid Revival(ModifierContainerComponent modifierContainer, Unit attacker, int time)
{
await TimerComponent.Instance.WaitAsync(time);
var (optionList, modifierLogic) = modifierContainer.GetSkillOptionBaseArr(ModifierEventCondition.modifier);
if (optionList != null)
foreach (var item in optionList)
{
var skillOptionLogicBase = SkillOptionFactory.AcquireSkillOptionLogic(item);
modifierLogic.skillLogic.skillOptionLogics.Add(skillOptionLogicBase);
skillOptionLogicBase.HandleEvent(new ModifierSkillSender
{
caster = attacker,
target = modifierContainer.GetParent<Unit>(),
skillLogic = modifierLogic.skillLogic,
modifierLogic = modifierLogic,
});
}
}
public static void Treat(this BattleComponent self, BallisticData data, ISkillSender skillSender)
{
try
{
var unit = self.GetParent<Unit>();
if (unit.IsAlive && data.value > 0)
{
var caster = unit.GetComponent<AttackComponent>().attacker;
var num = self.unit.GetComponent<NumericComponent>();
int value = MathHelper.RoundToInt(data.value);
var modifierContainer = unit.GetComponent<ModifierContainerComponent>();
if(skillSender!=null)
{
var (optionList, modifierLogic) = modifierContainer.GetSkillOptionBaseArr(ModifierEventCondition.modifier);
if (optionList != null)
foreach (var item in optionList)
{
var skillOptionLogicBase = SkillOptionFactory.AcquireSkillOptionLogic(item);
skillSender.skillLogic.skillOptionLogics.Add(skillOptionLogicBase);
skillOptionLogicBase.HandleEvent(new ModifierSkillSender
{
caster = caster,
target = unit,
skillLogic = modifierLogic.skillLogic,
modifierLogic = modifierLogic
});
}
}
if (caster.UnitType == UnitType.Player)
Game.EventSystem.Publish(new ET.EventType.TreatEvent
{
attacker = caster,
treat = value
}).Coroutine();
num.AddSet(NumericType.Hp, value);
Game.EventSystem.Publish(new ET.EventType.BattleSkillRet
{
targetUnit = unit,
HpValue = value,
IsCrit = data.isCrit,
}).Coroutine();
}
}
catch (Exception e)
{
Log.Error(e);
}
}
public static string SelectedEnermy(this BattleComponent self, long unitId, TeamType teamType)
{
var unit = self.GetParent<Unit>();
var battleBase = BattleMgrCompnent.Instance.GetBattle(unit);
if (battleBase == null)
{
Log.Error($"【{ UserComponent.Instance.Get(unit.Id)?.NickName} ({ unit.Id})】 battleBase == null");
return "系统错误";
}
string ret = BattleHelper.SelectFixedTarget(battleBase, unit, unitId, battleBase.targetTeam, teamType);
return ret;
}
}
}