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


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

public class Script : ScriptBase {

    // === НАСТРОЙКИ ===
    private string MainAssistNick = "Nick1";  // Ник #1: Постоянный основной Ассист
    private string PriorityNick = "Nick2";    // Ник #2: Имя ВРАГА (бьем СРАЗУ при появлении)

    private int SkillIdToCast = 437;          // ID скилла для опрокидывания
    private int AttackInterval = 100;         // Задержка атаки (мс)
    private long lastAttackTime = 0;

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

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

        long now = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

        // 1. ПРОВЕРЯЕМ ПОЯВЛЕНИЕ ВРАГА (Ник #2) В ЗОНЕ ВИДИМОСТИ
        L2Live priorityEnemy = null;
        if (Client.Players != null) {
            priorityEnemy = Client.Players.FirstOrDefault(p => 
                p != null && p.Name.Equals(PriorityNick, StringComparison.OrdinalIgnoreCase) && IsValidAttackTarget(p));
        }

        // Если Ник #2 появился и валиден — бьем его
        if (priorityEnemy != null) {
            SwitchAndAttack(priorityEnemy, now);
            return;
        }

        // 2. ЕСЛИ НИКА #2 НЕТ — РАБОТАЕМ ПО ОСНОВНОМУ АССИСТУ (Ник #1)
        L2Live mainTarget = GetAssistTarget(MainAssistNick);

        if (mainTarget != null) {
            SwitchAndAttack(mainTarget, now);
            return;
        }
    }

    // Проверка цели на валидность (Не пати, не мирный, враг/флагнутый/ПК)
    private bool IsValidAttackTarget(L2Live target) {
        if (target == null || target.IsDead || target.ObjectId == Me.ObjectId)
            return false;

        // Игнорируем членов вашей пати
        if (Client.PartyMembers != null && Client.PartyMembers.Any(p => p != null && p.ObjectId == target.ObjectId))
            return false;

        // Если цель - игрок (L2Player), проверяем статус PVP / Карма / Враг
        var playerTarget = target as L2Player;
        if (playerTarget != null) {
            // Бьем ТОЛЬКО если игрок в PVP-флаге (IsPvp) или ПК (Karma > 0)
            bool isHostile = playerTarget.IsPvp || playerTarget.Karma > 0;
            
            if (!isHostile)
                return false; // Пропускаем белого/мирного игрока
        }

        return true;
    }

    // Вспомогательный метод для выбора/смены цели, каста скилла и авто-атаки
    private void SwitchAndAttack(L2Live target, long now) {
        var currentTarget = Me.Target as L2Live;

        // Переключаем таргет, если он изменился, и даем скилл 437
        if (currentTarget == null || currentTarget.ObjectId != target.ObjectId) {
            Client.SetTarget(target);
            
            Client.UseSkill(SkillIdToCast);
            Client.Attack();
            
            lastAttackTime = now;
            return;
        }

        // Зажимаем авто-атаку со срезкой
        if (now - lastAttackTime >= AttackInterval) {
            Client.Attack();
            if (Me.IsAttacking) {
                Client.Attack();
            }
            lastAttackTime = now;
        }
    }

    // Поиск таргета у основного ассист-лидера (Ник #1)
    private L2Live GetAssistTarget(string nick) {
        L2Player leader = null;

        if (Client.PartyMembers != null) {
            leader = Client.PartyMembers.FirstOrDefault(p => p != null && p.Name.Equals(nick, StringComparison.OrdinalIgnoreCase));
        }
        if (leader == null && Client.Players != null) {
            leader = Client.Players.FirstOrDefault(p => p != null && p.Name.Equals(nick, StringComparison.OrdinalIgnoreCase));
        }

        if (leader != null && leader.Target != null) {
            var target = leader.Target as L2Live;
            if (target != null && IsValidAttackTarget(target)) {
                return target;
            }
        }
        return null;
    }
}