Загрузка данных
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));
}
}