• Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
    Ручное создание новых тем невозможно.
l2jMobius Fafurion AI system

l2jMobius Fafurion AI system 1.3

Нет прав для скачивания
  • Автор темы Автор темы Shakaho
  • Дата начала Дата начала
Mine appears like this, and I can't disable this option!
Странно, попробуйте включить ее, принять изменения.
После чего, отключить ее.

П.с. у патча(system) бывают проблемы, когда версия обновления клиента не отвечает обновлению самого system, или system - вовсе с региона другой страны (NA - USA),
К примеру, RU - system будет верно работать, а другие версии нет (потому что не подходят под обнову).
Тут или перепроверять или искать новый клиент + system с EU/En - переводом.
 
Странно, попробуйте включить ее, принять изменения.
После чего, отключить ее.

П.с. у патча(system) бывают проблемы, когда версия обновления клиента не отвечает обновлению самого system, или system - вовсе с региона другой страны (NA - USA),
К примеру, RU - system будет верно работать, а другие версии нет (потому что не подходят под обнову).
Тут или перепроверять или искать новый клиент + system с EU/En - переводом.
Yes, I understand. I'll look for another client, because according to the post, the author didn't make any other settings that modify the client, right? So I can download another normal client that will work!

Do you have geodata and pathnode for this project?
 
Да, клиентом я не занимаюсь.
 
Now I understand!
So, if I want to have 5 people at the party, I should open 5 l2 windows and so on, right?
Do you have geodata and pathnode for the project?
Нету Геодаты у него (нужно искать в сети ее, где то - ее сливали в шару или может кто сольет).
Верно, открываете 5 оккон Л2, создаете персонажей, собираете пати, активируете каждого Aiassistetnta в каждом окне Л2, используете далее команды что описани в FAQ или же файле README (это писалось, Автором много раз в этой теме, возможно Вы пропустили).

Автор нписал, что пока что, все 3 профы им "реализованы": Вл, Хил, Ис (ждем новых обновлений и улучшений).

Так же может быть проблема при стартовой настройке/подключении Аи, может понадобиться несколько раз перезагрузить сервер.
 
Shakaho обновил(а) ресурс l2jMobius Fafurion AI system новой записью:

Крупное обновление

Доработаны 4 профы (кроме танка)
Полная ветка Артэи
Пересобран класс ИСов
Доработаны якоря: теперь нормально держится ИИ на месте привязки
Для классов добавлены обработки специфичных проф скилов

Узнать больше об этом обновлении...
 

Bankir

Баллов: 10
Забустим!
Shakaho обновил(а) ресурс l2jMobius Fafurion AI system новой записью:

Маленькое обновление

Теперь, что бы постоянно не вносить в конфиг API ключ, его можно задать в переменной среде как
openrouter.api_key. Инструкции по переменным средам есть в интернете.

Так же если включен дебаг(в конфиге сейчас по умолчанию), то при входе в игру вылетает окно с помощью по активации ИИ. Ру или Ен в зависимости от клиента.

Обновил реадми.

Узнать больше об этом обновлении...

Did you leave the settings and messages in two languages? In Russian and English?
совершенно верно. доступно два языка.
 
Shakaho обновил(а) ресурс l2jMobius Fafurion AI system новой записью:

Небольшое дополнение

- Просили включить автофарм - сделано. Команда .play персонажем в обычном чате
- Включил чемпионов до 99 для развлечения.
- Система автокача корректно работает параллельно с AI

Узнать больше об этом обновлении...
 
А в чем "ИИ-шность" ваших ботов кроме использования LLM через апи для ответов в чат? У вас там обученая RL модель на борту? Или может вы каким-то образом используете возможности LLM для выполнения тех или иных действий через структурированые промты (кроме ответов в чат)? Или это просто "if (partyMember.getHp() < 1000) useHeal(partyMember); follow(partyMember)"?
 
Мне что-ли структуру расписывать или это проходящий мимо троллинг?
 
Скорее это вопрос на волне того, что сейчас, очень популярны Боты/ИИ - с "ебейшей" эмитацией игроков.
Т.е. Боты лучше чем всякие там запилы за тонны Килобаксов, и все кто не "силен (как я)" в этом, ищут где бы и что бы подобного найти, раскрутить и прикрутить/посмотреть.
А в целом, когда то помню первых ботов на серверах без защиты - которые подобное делали (с привязкой к окну, ибо баферы не понимали что ты хочешь без привязки, и тем ботам еще далеко до подобного)).
А в целом же, можно автономность докрутить.
 
Не могли бы вы перезалить клиент? Ссылка уже мертва.
 
я не смотрел еще компил. как реализованы? абстрактнные классы для AI как сделаны просто у меня? или что то интересное с обучаловкой?
P.S. Глянул ядро. все понял. вопросов нет.


 
Последнее редактирование:

Bankir

Баллов: 10
ХОРОШ!
Код:
package org.l2jmobius.gameserver.aiassistant;

import java.io.File;
import java.io.FileInputStream;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.enums.player.PlayerClass;
import org.l2jmobius.gameserver.model.skill.Skill;

public class AiSkillResolver {
  private static final String CONFIG_PATH_RUNTIME = "config/aiassistant_skills.properties";
 
  private static final String CONFIG_PATH_DIST = "dist/game/config/aiassistant_skills.properties";
 
  private static final Object OVERRIDES_LOCK = new Object();
 
  private static volatile Properties OVERRIDES = new Properties();
 
  private static volatile long OVERRIDES_LAST_MODIFIED = -1L;
 
  public static class AiSkills {
    public int singleHealId;
   
    public int partyHealId;
   
    public int bigHealId;
   
    public int cleanseId;
   
    public int balanceId;
   
    public int[] buffBaseIds;
   
    public int[] buffSongIds;
   
    public int harmonyTankId;
   
    public int harmonyMageId;
   
    public int harmonyPhysicalId;
   
    public String singleHealSource;
   
    public String partyHealSource;
   
    public String bigHealSource;
   
    public String cleanseSource;
   
    public String balanceSource;
  }
 
  public AiSkillResolver() {
    ensureOverridesLoaded();
  }
 
  public AiSkills resolve(Player owner, AiSession session) {
    ensureOverridesLoaded();
    AiSkills s = new AiSkills();
    PlayerClass pc = owner.getPlayerClass();
    applyOverridesForClassChain(s, pc);
    for (Map.Entry<Integer, Skill> e : (Iterable<Map.Entry<Integer, Skill>>)owner.getSkills().entrySet()) {
      Skill sk = e.getValue();
      String n = (sk.getName() != null) ? sk.getName().toLowerCase(Locale.ROOT) : "";
      boolean hasHeal = (n.contains("heal") || n.contains(") || n.contains("));
      boolean isPartyLike = (n.contains("party") || n.contains("group") || n.contains("mass") || n.contains("area") || n.contains("allies") || n.contains("ally") || n.contains("clan") || n.contains(") || n.contains(") || n.contains(") || n.contains("));
      boolean isBigLike = (n.contains("major") || n.contains("greater") || n.contains("big") || n.contains("great") || n.contains("advanced") || n.contains("enhanced") || n.contains(") || n.contains(") || n.contains(") || n.contains("));
      if (s.balanceId == 0 && (n.contains("balance") || n.contains("))) {
        s.balanceId = ((Integer)e.getKey()).intValue();
        s.balanceSource = "heuristic:name";
      }
      if (s.cleanseId == 0 && (n.contains("cleanse") || n.contains("purify") || n.contains("purification") || n.contains("dispel") || n.contains("cure") || n.contains("remove debuff") || n.contains(") || n.contains(") || n.contains(") || n.contains(") || n.contains(") || n.contains(")) && !hasHeal) {
        s.cleanseId = ((Integer)e.getKey()).intValue();
        s.cleanseSource = "heuristic:name";
      }
      if (s.partyHealId == 0 && hasHeal && isPartyLike) {
        s.partyHealId = ((Integer)e.getKey()).intValue();
        s.partyHealSource = "heuristic:name";
      }
      if (s.bigHealId == 0 && hasHeal && !isPartyLike && isBigLike) {
        s.bigHealId = ((Integer)e.getKey()).intValue();
        s.bigHealSource = "heuristic:name";
      }
      if (s.singleHealId == 0 && hasHeal && !isPartyLike && !isBigLike) {
        s.singleHealId = ((Integer)e.getKey()).intValue();
        s.singleHealSource = "heuristic:name";
      }
    }
    return s;
  }
 
  private void applyOverridesForClassChain(AiSkills s, PlayerClass pc) {
    PlayerClass cur = pc;
    while (cur != null) {
      applyOverridesForKeyPrefix(s, cur.name());
      String n = cur.name();
      int idx = n.indexOf('_');
      if (idx > 0)
        applyOverridesForKeyPrefix(s, n.substring(0, idx));
      cur = cur.getParent();
    }
    applyOverridesForKeyPrefix(s, "GLOBAL");
  }
 
  private void applyOverridesForKeyPrefix(AiSkills s, String prefix) {
    if (prefix == null || prefix.isEmpty())
      return;
    if (s.singleHealId == 0) {
      int v = getIntOverride(prefix + ".single_heal_id", 0);
      if (v > 0) {
        s.singleHealId = v;
        s.singleHealSource = prefix;
      }
    }
    if (s.partyHealId == 0) {
      int v = getIntOverride(prefix + ".party_heal_id", 0);
      if (v > 0) {
        s.partyHealId = v;
        s.partyHealSource = prefix;
      }
    }
    if (s.bigHealId == 0) {
      int v = getIntOverride(prefix + ".big_heal_id", 0);
      if (v > 0) {
        s.bigHealId = v;
        s.bigHealSource = prefix;
      }
    }
    if (s.cleanseId == 0) {
      int v = getIntOverride(prefix + ".cleanse_id", 0);
      if (v > 0) {
        s.cleanseId = v;
        s.cleanseSource = prefix;
      }
    }
    if (s.balanceId == 0) {
      int v = getIntOverride(prefix + ".balance_id", 0);
      if (v > 0) {
        s.balanceId = v;
        s.balanceSource = prefix;
      }
    }
    if (s.buffBaseIds == null) {
      int[] v = getIntListOverride(prefix + ".buff_base_ids");
      if (v != null)
        s.buffBaseIds = v;
    }
    if (s.buffSongIds == null) {
      int[] v = getIntListOverride(prefix + ".buff_song_ids");
      if (v != null)
        s.buffSongIds = v;
    }
    if (s.harmonyTankId == 0) {
      int v = getIntOverride(prefix + ".harmony_tank_id", 0);
      if (v > 0)
        s.harmonyTankId = v;
    }
    if (s.harmonyMageId == 0) {
      int v = getIntOverride(prefix + ".harmony_mage_id", 0);
      if (v > 0)
        s.harmonyMageId = v;
    }
    if (s.harmonyPhysicalId == 0) {
      int v = getIntOverride(prefix + ".harmony_physical_id", 0);
      if (v > 0)
        s.harmonyPhysicalId = v;
    }
  }
 
  private int getIntOverride(String key, int def) {
    try {
      return Integer.parseInt(OVERRIDES.getProperty(key, String.valueOf(def)).trim());
    } catch (Exception e) {
      return def;
    }
  }
 
  private int[] getIntListOverride(String key) {
    try {
      String raw = OVERRIDES.getProperty(key, "");
      if (raw == null)
        return null;
      String s = raw.trim();
      if (s.isEmpty() || s.equals("0"))
        return null;
      String[] parts = s.split("[\\s,]+");
      int[] out = new int[parts.length];
      int n = 0;
      for (String p : parts) {
        if (p != null) {
          String t = p.trim();
          if (!t.isEmpty()) {
            int v = Integer.parseInt(t);
            if (v > 0)
              out[n++] = v;
          }
        }
      }
      if (n <= 0)
        return null;
      if (n != out.length) {
        int[] trimmed = new int[n];
        System.arraycopy(out, 0, trimmed, 0, n);
        out = trimmed;
      }
      return out;
    } catch (Exception ignored) {
      return null;
    }
  }
 
  private void ensureOverridesLoaded() {
    try {
      File f = resolveConfigFile();
      long lm = f.isFile() ? f.lastModified() : -1L;
      if (lm == OVERRIDES_LAST_MODIFIED)
        return;
      synchronized (OVERRIDES_LOCK) {
        File f2 = resolveConfigFile();
        long lm2 = f2.isFile() ? f2.lastModified() : -1L;
        if (lm2 == OVERRIDES_LAST_MODIFIED)
          return;
        Properties p = new Properties();
        if (f2.isFile()) {
          FileInputStream fis = new FileInputStream(f2);
          try {
            p.load(fis);
            fis.close();
          } catch (Throwable throwable) {
            try {
              fis.close();
            } catch (Throwable throwable1) {
              throwable.addSuppressed(throwable1);
            }
            throw throwable;
          }
        }
        OVERRIDES = p;
        OVERRIDES_LAST_MODIFIED = lm2;
      }
    } catch (Exception exception) {}
  }
 
  private File resolveConfigFile() {
    File runtime = new File("config/aiassistant_skills.properties");
    if (runtime.isFile())
      return runtime;
    File dist = new File("dist/game/config/aiassistant_skills.properties");
    if (dist.isFile())
      return dist;
    return runtime;
  }
}
я не смотрел еще компил. как реализованы? абстрактнные классы для AI как сделаны просто у меня? или что то интересное с обучаловкой?

кто то видел. у меня примерно все классы работают на 90%

а подключить API это очень просто сделать и создать им промт в коде чтобы отвечали как ты хочешь.


сам нашел просто из конфига юзает
Первый пошел.
батла)
 
Мне что-ли структуру расписывать или это проходящий мимо троллинг?
Я задаю вопросы, проявляя интерес к вашей теме, а вы мне про какой то тролинг.
Вы написали про "ИИ", я вот и интересуюсь, чтобы вы подробнее рассказали про реализацию, т.к сам увлекаюсь этим.
 
Я задаю вопросы, проявляя интерес к вашей теме, а вы мне про какой то тролинг.
Вы написали про "ИИ", я вот и интересуюсь, чтобы вы подробнее рассказали про реализацию, т.к сам увлекаюсь этим.
декомпилируй ядро и чекни + в конфиге есть список скиллов.
 
Тут пака все простенько. Сейчас организовал сбор логов по активации .ai on. Пытаюсь обучать. Но это кропотливый процесс.
 
Назад
Сверху Снизу