private static String buildBotProfile(NeuroBot bot, String message) {
Player player = bot.getPlayer();
StringBuilder sb = new StringBuilder();
// Основная информация
sb.append("Я — ").append(player.getName()).append(", игрок в Lineage 2. ")
.append("Мой класс: ").append(player.getTemplate().getClassName()).append(", ")
.append("уровень: ").append(player.getStatus().getLevel()).append(". ");
// Клан
Clan clan = player.getClan();
if (clan != null) {
sb.append("Я состою в клане ").append(clan.getName()).append(", лидер: ").append(clan.getLeaderName()).append(". ");
} else {
sb.append("Я не в клане. ");
}
// Группа
Party party = player.getParty();
if (party != null) {
sb.append("Я в группе, лидер: ").append(party.getLeader().getName()).append(". ");
List<String> members = new ArrayList<>();
for (Player member : party.getMembers()) {
if (!member.equals(player)) {
members.add(member.getName());
}
}
if (!members.isEmpty()) {
sb.append("Участники группы: ").append(String.join(", ", members)).append(". ");
}
} else {
sb.append("Я не в группе. ");
}
// Снаряжение
StringBuilder outfit = new StringBuilder();
if (player.getInventory() != null && player.getInventory().getPaperdollItems() != null) {
for (ItemInstance item : player.getInventory().getPaperdollItems()) {
String slotName = getSlotName(item.getItem().getBodyPart());
String itemName = item.getItemName();
outfit.append(slotName).append(": ").append(itemName);
if (item.getEnchantLevel() > 0) {
outfit.append(" +").append(item.getEnchantLevel());
}
outfit.append(". ");
}
}
if (player.getWeaponSkinOption() > 0) {
outfit.append("Скин оружия: ID ").append(player.getWeaponSkinOption()).append(". ");
}
if (player.getArmorSkinOption() > 0) {
outfit.append("Скин брони: ID ").append(player.getArmorSkinOption()).append(". ");
}
if (outfit.length() > 0) {
sb.append("Моё снаряжение: ").append(outfit.toString().trim()).append(". ");
}
// Баффы, денсы, сонги
StringBuilder effects = new StringBuilder();
if (player.getAllEffects() != null && player.getAllEffects().length > 0) {
for (AbstractEffect effect : player.getAllEffects()) {
if (effect != null && effect.getSkill() != null && effect.getInUse()) {
String effectName = effect.getSkill().getName();
String effectType;
if (effect.getSkill().isDance()) {
effectType = "Денс";
} else if (effect.getSkill().getSkillType() == SkillType.BUFF) {
effectType = "Сонг";
} else if (effect.getSkill().getSkillType() == SkillType.BUFF ||
effect.getSkill().getSkillType() == SkillType.COMBATPOINTHEAL ||
effect.getSkill().getSkillType() == SkillType.REFLECT ||
effect.getSkill().getSkillType() == SkillType.HEAL_PERCENT ||
effect.getSkill().getSkillType() == SkillType.HEAL_STATIC ||
effect.getSkill().getSkillType() == SkillType.MANAHEAL_PERCENT) {
effectType = "Бафф";
} else {
continue;
}
effects.append(effectType).append(": ").append(effectName).append(". ");
}
}
}
if (effects.length() > 0) {
sb.append("Мои баффы, денсы, сонги: ").append(effects.toString().trim()).append(". ");
}
// Характеристики
sb.append("Мои характеристики: ")
.append("HP=").append((int) player.getStatus().getMaxHp()).append(", ")
.append("MP=").append((int) player.getStatus().getMaxMp()).append(", ")
.append("P.Atk=").append((int) player.getStatus().getPAtk(null)).append(", ")
.append("M.Atk=").append((int) player.getStatus().getMAtk(null, null)).append(", ")
.append("Скорость атаки=").append(player.getStatus().getPAtkSpd()).append(", ")
.append("Скорость каста=").append(player.getStatus().getMAtkSpd()).append(", ")
.append("Скорость передвижения=").append(player.getStatus().getMoveSpeed()).append(". ");
// Роль бота
if (bot.isTrader()) {
sb.append("Я занимаюсь торговлей. ");
} else if (bot.isHired() && bot.getLeader() != null) {
sb.append("Я нанят игроком ").append(bot.getLeader().getName()).append(" и помогаю ему. ");
} else if (bot.getCommittedTarget() != null && !bot.getCommittedTarget().isDead()) {
sb.append("Я в бою. ");
} else {
sb.append("Я свободно играю. ");
}
// Инструкции для ИИ
sb.append("\nИнструкции: ")
.append("1) Отвечай от первого лица (я, мне, мой), как реальный человек, без ролевого отыгрыша и юмора. ")
.append("2) Если вопрос касается моего оружия, отвечай только названием оружия (например, 'Кинжал и Название'), без упоминания слота 'Правая рука' или 'Обе руки'. ")
.append("3) Если вопрос касается меня, используй предоставленные данные о моем персонаже (класс, уровень, снаряжение, баффы, клан, группа, роль). ")
.append("4) Не упоминая ИИ, интернет или игровую механику. ")
.append("5) Отвечай кратко, 1–2 предложения, без ссылок и форматирования. ")
.append("6) Учитывай контекст сообщения игрока: \"" + safe(message) + "\".");
sb.append("7) Учитывай мой класс (").append(player.getTemplate().getClassName())
.append(") при ответе. ");
sb.append("8) Если вопрос общий, отвечай с точки зрения моего персонажа. ");
return sb.toString();
}