Загрузка данных


using System;
using System.Linq;
using System.Threading;

public class BDAssistMedusaAdvanced : ScriptBase
{
    // ================= НАСТРОЙКИ =================
    private string AssistTargetName = "МЕСТЬ";       // Ник персонажа для ассиста
    private string PriorityTargetName = "БИША";   // Ник приоритетного врага под медузу

    private int MedusaSkillId = 367;          // Dance of Medusa
    private int MedusaAoeRadius = 250;        // Радиус поражения медузы (AoE вокруг чара)
    private int MinEnemiesForSelfMedusa = 1;  // Медуза под себя срабатывает от 1 врага
    private int MaxApproachDistance = 500;    // Лимит дистанции для сближения с приоритетом (500)
    private int PriorityApproachStopDist = 180; // Дистанция остановки перед кастом в цель

    private long _lastMedusaCastTime = 0;
    private readonly int _medusaBaseCooldown = 15000; // Кулдаун для внутреннего таймера (мс)
    private readonly Random _rand = new Random();

    public override void OnRun()
    {
        while (IsRunning)
        {
            try
            {
                if (Me.IsDead || Me.IsCasting || Me.IsStunned || Me.IsParalyzed)
                {
                    SleepHuman(120, 200);
                    continue;
                }

                // 1. Поиск приоритетной цели
                var priorityEnemy = World.GetPlayers()
                    .FirstOrDefault(x => x.IsEnemy && 
                                         !x.IsDead && 
                                         x.Name.Equals(PriorityTargetName, StringComparison.OrdinalIgnoreCase));

                bool isMedusaReady = (Environment.TickCount - _lastMedusaCastTime > _medusaBaseCooldown) && (Me.CurrentMp >= 120);

                // 2. ВЕТКА 1: Работа по ПРИОРИТЕТНОЙ цели (Сближение в пределах 500 + Медуза)
                if (isMedusaReady && priorityEnemy != null)
                {
                    double distToPriority = Me.DistanceTo(priorityEnemy);

                    if (distToPriority <= MaxApproachDistance)
                    {
                        if (Me.Target == null || Me.Target.ObjectId != priorityEnemy.ObjectId)
                        {
                            Target(priorityEnemy);
                            SleepHuman(80, 140);
                        }

                        // Подбегаем в упор, если дистанция больше радиуса срабатывания
                        if (distToPriority > PriorityApproachStopDist)
                        {
                            MoveTo(priorityEnemy.X, priorityEnemy.Y, priorityEnemy.Z);
                            SleepHuman(150, 250);
                            continue;
                        }

                        // Каст медузы в приоритет
                        UseSkill(MedusaSkillId);
                        _lastMedusaCastTime = Environment.TickCount;
                        SleepHuman(600, 800);
                        continue;
                    }
                }

                // 3. ВЕТКА 2: Медуза "под себя" (срабатывает от 1 врага рядом)
                if (isMedusaReady)
                {
                    int nearbyEnemiesCount = World.GetPlayers()
                        .Count(x => x.IsEnemy && !x.IsDead && Me.DistanceTo(x) <= MedusaAoeRadius);

                    if (nearbyEnemiesCount >= MinEnemiesForSelfMedusa)
                    {
                        UseSkill(MedusaSkillId);
                        _lastMedusaCastTime = Environment.TickCount;
                        SleepHuman(600, 800);
                        continue;
                    }
                }

                // 4. ВЕТКА 3: Обычная работа по ассисту
                var assistLead = World.GetPlayers()
                    .FirstOrDefault(x => x.Name.Equals(AssistTargetName, StringComparison.OrdinalIgnoreCase) && !x.IsDead);

                if (assistLead != null && assistLead.Target != null && !assistLead.Target.IsDead && assistLead.Target.IsEnemy)
                {
                    var assistTarget = assistLead.Target;

                    if (Me.Target == null || Me.Target.ObjectId != assistTarget.ObjectId)
                    {
                        Target(assistTarget);
                        SleepHuman(100, 180);
                    }

                    if (!Me.IsAttacking)
                    {
                        Attack();
                    }
                }
            }
            catch
            {
                // Игнорирование ошибок в цикле
            }

            SleepHuman(120, 180);
        }
    }

    private void SleepHuman(int minMs, int maxMs)
    {
        Thread.Sleep(_rand.Next(minMs, maxMs + 1));
    }
}