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


using System;
using System.Linq;
using System.Collections.Generic;
using NewWidget.Core;
using NewWidget.Core.Native;
using NewWidget.Core.Scripting;

public class Script : ScriptBase {

    // ================= НАСТРОЙКИ =================
    string AssistTargetName = "MainAssistNick";       // Ник сопартийца для ассиста
    string PriorityTargetName = "PriorityEnemyNick";   // Ник приоритетного врага под медузу

    int MedusaId = 367;           // ID скилла Dance of Medusa
    int MedusaAoeRadius = 250;    // Радиус срабатывания медузы под себя
    int MinEnemiesForSelf = 1;    // Медуза под себя срабатывает от 1 врага
    int MaxApproachDistance = 500;// Лимит поиска приоритета
    int PriorityStopDist = 180;   // Дистанция сближения перед кастом

    long _lastMedusaCastTime = 0; // Защита от спама и ложных перебежек

    public override void OnStart() {
        base.OnStart();
        CreateTimer(150, OnTimer);
    }

    void OnTimer() {
        if (Me == null || Me.IsDead || Me.IsDisabled)
            return;

        // Если только что дали медузу — ждем завершения анимации и не бежим никуда
        if (Environment.TickCount - _lastMedusaCastTime < 1200)
            return;

        bool isMedusaReady = Me.SkillCooltime(MedusaId) == 0;

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

        // 2. ВЕТКА 1: Работа по приоритету (Сближение + Остановка + Каст)
        if (isMedusaReady && priorityEnemy != null && priorityEnemy.DistanceToUser <= MaxApproachDistance) {
            if (Me.Target != priorityEnemy) {
                Client.SetTarget(priorityEnemy);
            }

            // Если не добежали — продолжаем бежать к цели
            if (priorityEnemy.DistanceToUser > PriorityStopDist) {
                Client.FMoveToLocation(priorityEnemy.Location);
                return;
            }

            // В упоре: СТОП движения -> Каст медузы -> Фиксация времени
            Client.FMoveToLocation(Me.Location);
            Client.UseSkill(MedusaId);
            _lastMedusaCastTime = Environment.TickCount;
            return;
        }

        // 3. ВЕТКА 2: Медуза под себя
        if (isMedusaReady) {
            int enemiesNearby = Players.Count(p => p != null && 
                                                   !p.IsDead && 
                                                   p.DistanceToUser <= MedusaAoeRadius && 
                                                   !PartyMembers.Any(pm => pm.Name.Equals(p.Name, StringComparison.OrdinalIgnoreCase)));

            if (enemiesNearby >= MinEnemiesForSelf) {
                Client.FMoveToLocation(Me.Location); // Остановка на месте
                Client.UseSkill(MedusaId);
                _lastMedusaCastTime = Environment.TickCount;
                return;
            }
        }

        // 4. ВЕТКА 3: Ассист и атака
        var assistLead = Client.PartyMembers.FindByName(AssistTargetName);
        if (assistLead != null && assistLead.Target != null && !assistLead.Target.IsDead) {
            var target = assistLead.Target;

            if (Me.Target != target) {
                Client.SetTarget(target);
            }

            if (Me.LastAttackTime > 500) {
                Client.Attack();
            }
        }
    }
}