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