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


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 = "МЕСТЬ";       // С кого брать ассист
    string PriorityTargetName = "";   // Приоритетная цель (бить и давать медузу)

    int MedusaId = 367;           // ID Dance of Medusa
    int MedusaAoeRadius = 300;    // Радиус срабатывания медузы под себя
    int MaxApproachDistance = 600;// Дистанция поиска приоритета
    int PriorityStopDist = 180;   // Дистанция перед кастом медузы

    long _lastMedusaCastTime = 0;
    int MedusaCooldownMs = 12000; // Кулдаун медузы (мс)

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

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

        // Проверка готовности медузы
        bool isMedusaReady = (Environment.TickCount - _lastMedusaCastTime > MedusaCooldownMs || _lastMedusaCastTime == 0) 
                             && Me.SkillCooltime(MedusaId) <= 0;

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

        // ================= ВЕТКА 1: РАБОТА ПО ПРИОРИТЕТНОЙ ЦЕЛИ =================
        // Если приоритет жив и рядом — фокусим только его (бьем автоатакой и даем медузу)
        if (priorityEnemy != null) {
            if (Me.Target != priorityEnemy) {
                Client.SetTarget(priorityEnemy);
            }

            // Если медуза готова — используем её
            if (isMedusaReady) {
                if (priorityEnemy.DistanceToUser > PriorityStopDist) {
                    Client.FMoveToLocation(priorityEnemy.Location);
                    return;
                }

                Client.UseSkill(MedusaId);
                _lastMedusaCastTime = Environment.TickCount;
                return;
            }

            // Пока медуза в откате — продолжаем бить приоритетную цель автоатакой
            Client.Attack();
            return;
        }

        // ================= ВЕТКА 2: МЕДУЗА ПОД СЕБЯ =================
        // Если приоритета нет/умер, но рядом есть чужой игрок — даем защитную медузу
        if (isMedusaReady) {
            bool hasEnemyNearby = Players.Any(p => p != null && 
                                                   !p.IsDead && 
                                                   p.DistanceToUser <= MedusaAoeRadius && 
                                                   p.ObjectId != Me.ObjectId &&
                                                   !Client.PartyMembers.Any(pm => pm.Name.Equals(p.Name, StringComparison.OrdinalIgnoreCase)));

            if (hasEnemyNearby) {
                Client.UseSkill(MedusaId);
                _lastMedusaCastTime = Environment.TickCount;
                return;
            }
        }

        // ================= ВЕТКА 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);
            }

            Client.Attack();
        }
    }
}