private static IEnumerable <(YiObj, int)> GetTargets(YiObj player, Vector2 loc, MagicTypeEnum magicType) { var targetList = new List <(YiObj, int)>(); switch (MagicTypeHelper.ConvertTargetingType(magicType)) { case TargetingType.Single: Single(player, targetList); break; case TargetingType.Sector: Sector(player, loc, targetList); break; case TargetingType.Circle: Circle(player, targetList); break; case TargetingType.Self: targetList.Add((player, 0)); break; } return(targetList); }
public static void ExecuteAttack(Player player, Vector2 targetLocation) { if (!CostCovered(player)) { return; } var targets = GetTargets(player, targetLocation, player.CurrentSkill.Info.Type).ToArray(); foreach (var kvp in targets) { switch (MagicTypeHelper.Convert(player.CurrentSkill.Info.Type)) { case UseType.Damage: kvp.Item1.GetHit(player, kvp.Item2); break; case UseType.Heal: kvp.Item1.GetHealed(player, kvp.Item2); break; case UseType.Buff: if (!ScriptEngine.Scripts.TryGetValue(ScriptType.SkillUsage, out var script)) { continue; } if (script.Execute(kvp.Item1, player.CurrentSkill)) { kvp.Item1.GetBuffed(player, 0); } else { Output.WriteLine($"Unknown Skill: {player.CurrentSkill.Id} | Lv: {player.CurrentSkill.Info.Level}"); } break; default: Message.SendTo(player, $"Magic Attack Fail: {player.CurrentSkill.Info.Type} -> {MagicTypeHelper.Convert(player.CurrentSkill.Info.Type)}", MsgTextType.Talk); break; } } foreach (var packet in MsgMagicEffect.Create(player, targets)) { ScreenSystem.Send(player, packet, true); } }