Bots really play: shared understanding for headless bots, social layer (bot-to-bot talk, squads, invites), castle sieges, economy (sell/buy/professions/jewelry/buffs), telemetry, brain (loot, fight back, leash, spoil/sweep), 43 combat profiles, zones rebuilt from real spawns, tools (harness, data checks, zone fixer, build/deploy)

This commit is contained in:
2026-09-03 20:39:50 +02:00
parent dcbecd2843
commit 165820c041
40 changed files with 7634 additions and 2699 deletions
@@ -99,5 +99,35 @@ FakePlayerTradeChance = 30
#
# Headless players: real Player instances without a client. They can join
# real parties (invite them - they auto accept), share exp, fight beside you.
# Prototype: they farm near Giran. 0 = disabled.
# 0 = disabled.
FakePlayerHeadlessCount = 500
# Who answers first when a player talks to a bot: "seams" - the template engine
# (idiolect, memory, stance; the LLM is used only for messages no intent matched),
# "llm" - the LLM answers everything, templates are the fallback.
FakePlayerLlmPriority = seams
# Bots talk to each other (greetings, small talk, gossip) when a real player can see it.
FakePlayerBotDialogues = True
# Real economy: sell junk to the merchant, buy shots / arrows / potions with own adena.
FakePlayerEconomy = True
# Bots take their first / second / third profession at 20 / 40 / 76 like players.
FakePlayerProfessionChange = True
# Bot clans register for castle sieges and fight them (attackers break the gates,
# the clan leader engraves the artifact; defenders hold it).
FakePlayerSieges = True
# How many bot clans attack each castle siege.
FakePlayerSiegeAttackerClans = 2
# Also besiege castles owned by real players' clans.
FakePlayerSiegeAttackPlayerCastles = False
# Print bot activity totals (kills, exp, loot, trades, chat...) to the log every N minutes. 0 = off.
FakePlayerStatsLogMinutes = 10
# Write every line the bots say (channel, name, seam, text) to the server log.
FakePlayerChatLog = False
@@ -1157,6 +1157,20 @@
<line trait="eng">{player}, гг тогда было</line>
</seam>
<seam key="ambient">
<rule like="plan=siege:5">
<line>осада [идет], не до фарма</line>
<line>на осаде [сейчас], потом [поболтаем]</line>
<line>{castle} [сегодня] берем[, весь клан там]</line>
</rule>
<rule like="event=siege_finished:3">
<line>[только] с осады[, устал]</line>
<line>осада была [жесть][, еле выжил]</line>
<line>после осады [опять] на спот[, скучно]</line>
</rule>
<rule like="event=profession:2">
<line>профу [только] взял[, привыкаю к скиллам]</line>
<line>новые скиллы [после профы] [прям] огонь</line>
</rule>
<line>#smalltalk#</line>
<line>#grounded_talk#</line>
<line>кто спот застолбил тут</line>
@@ -1580,6 +1594,219 @@
<line>все на сегодня, бывай</line>
<line trait="old">бывай, братва, го дальше</line>
</seam>
<!-- ===== SPP 3: боты между собой, осады, профы, экономика ===== -->
<seam key="bot_talk">
<line>{player} как фарм[, идет]?</line>
<line>{player} [ты] давно тут [стоишь]?</line>
<line>{player} го (в пати|вместе)[, быстрее будет]</line>
<line>{player} дроп есть [какой-нибудь]?</line>
<line>{player} какой лвл [у тебя]?</line>
<line>{player} где рб видел[, не знаешь]?</line>
<line>слышь {player}, [а] ты (соло|один) [качаешься]?</line>
<line>{player} как дела[, что нового]?</line>
<line>{player} почем [сейчас] соски [берешь]?</line>
<line>{player} [ты] откуда [сам]?</line>
<line>{player} не видел [тут] пкшеров?</line>
<line>{player} сколько [еще] фармить будешь?</line>
<line>{player} где качаться [дальше] думаешь?</line>
<line>{player} #ask_back#</line>
<line>эй {player}, скучно [тут] одному[, поговорим]</line>
<line trait="mat">{player} бля, как оно [вообще]?</line>
<line trait="eng">{player} хай, как фарм гоес?</line>
<line trait="old">{player} здарова, как жизнь молодая?</line>
<rule like="event=levelup:3">
<line>{player} я {level} взял [только что][, кайф]</line>
<line>{player} видел? {level} [лвл] уже</line>
</rule>
<rule like="event=ganked:3">
<line>{player} тут пк ходит[, осторожно]</line>
<line>{player} меня [только что] гангнули[, видел кто]?</line>
</rule>
<rule like="plan=trade:2">
<line>{player} [а] ты не продаешь [ничего]?</line>
<line>{player} у меня лавка [стоит], зацени</line>
</rule>
</seam>
<seam key="reply_drop">
<line>[пока] пусто[, {player}]</line>
<line>{drop} [упал] [только что]</line>
<line>дроп так себе[, {drop} и все]</line>
<line>с {mob} ничего [толком] не падает</line>
<line>норм капает[, {drop} вот]</line>
<line>ничего [особенного], мусор [один]</line>
<line>{drop} только[, и то один]</line>
<line>ресы [в основном][, на продажу]</line>
<line>[да] ничего[, ты как]?</line>
<line>дроп есть, [но] не скажу [какой] ~lol~</line>
<line trait="mat">хрен [там] а не дроп</line>
</seam>
<seam key="siege_start">
<line>{clan} [идет] на {castle}[, всем сбор]</line>
<line>осада {castle}, [ну] погнали[, {clan}]</line>
<line>{castle} [сегодня] наш [будет]</line>
<line>{clan} у ворот {castle}[, готовьте печать]</line>
<line>на {castle}[, все] за мной</line>
<line>ворота {castle} [сейчас] ломаем</line>
<line>{castle}, [мы] пришли за тобой</line>
<line>{clan} на осаде[, го го]</line>
<line>кто держит {castle}, выходите [драться]</line>
<line>осада началась, {clan} [в деле]</line>
<line>ну что, {castle}, [сейчас] посмотрим кто сильнее</line>
<line trait="mat">{castle} наш, [нахрен] всех у ворот</line>
<line trait="eng">гоу гоу {castle}, {clan} атакует</line>
<line trait="old">за {clan}, братва, {castle} берем</line>
</seam>
<seam key="siege_defend">
<line>{castle} [никому] не отдадим</line>
<line>{clan} держит {castle}[, подходите]</line>
<line>защита {castle}[, все] к артефакту</line>
<line>ворота [пока] стоят, {castle} наш</line>
<line>кто [там] лезет на {castle}[, идите домой]</line>
<line>{clan} на стенах[, ждем гостей]</line>
<line>{castle} держим до конца</line>
<line>[все] к печати, [никого] не пускаем</line>
<line>осада {castle}, защищаем [свое]</line>
<line trait="mat">{castle} хрен [вам] а не замок</line>
<line trait="old">за {clan}, [пацаны], держим {castle}</line>
</seam>
<seam key="siege_gate">
<line>ворота [почти] лежат[, го дальше]</line>
<line>бьем ворота [все вместе]</line>
<line>ворота {castle} [сейчас] упадут</line>
<line>[все] по воротам, [не] отвлекаемся</line>
<line>дожимаем ворота[, потом печать]</line>
<line>ворота [еще] стоят[, бьем]</line>
<line>{clan} [все] на ворота</line>
<line>ломаем [и] заходим</line>
<line trait="mat">ворота [бля] крепкие, бьем [дальше]</line>
</seam>
<seam key="siege_engrave">
<line>печать [пошла], прикройте [меня]</line>
<line>кастую печать, [никого] не пускать</line>
<line>три минуты, держите [артефакт]</line>
<line>печать [на артефакте], {castle} [почти] наш</line>
<line>лидер кастует[, все] вокруг него</line>
<line>прикрываем печать[, {castle} наш]</line>
</seam>
<seam key="siege_win">
<line>{castle} наш[, гг]</line>
<line>{clan} взял {castle}[, красавцы]</line>
<line>гг [всем], {castle} [теперь] наш</line>
<line>[ну все], {castle} у {clan}</line>
<line>отстояли {castle}[, гг]</line>
<line>{castle} остается [за нами][, гг]</line>
<line>победа[, {castle}]</line>
<line>гг, [хорошая] осада</line>
<line trait="mat">{castle} наш [нахрен], гг</line>
<line trait="eng">изи, {castle} out[, гг]</line>
<line trait="old">{castle} наш, братва[, гг]</line>
</seam>
<seam key="siege_lose">
<line>[ну] не вышло [с {castle}]</line>
<line>{castle} не взяли[, в следующий раз]</line>
<line>гг, [слили] осаду</line>
<line>проиграли {castle}[, обидно]</line>
<line>[все], {castle} [пока] не наш</line>
<line>отдали {castle}[, позор]</line>
<line>гг [хоть] подрались</line>
<line>{castle} слили[, через две недели вернемся]</line>
<line trait="mat">{castle} [бля] слили[, гг]</line>
<line trait="eng">гг вп, {castle} лост</line>
</seam>
<seam key="profession">
<line>[все], профу взял[, теперь {class}]</line>
<line>{class} [теперь][, кайф]</line>
<line>профу [наконец] сделал</line>
<line>[ееее] я {class}[, го дальше]</line>
<line>квест на профу [наконец] закрыт</line>
<line>[ну вот], {class}[, теперь] качаемся дальше</line>
<line>профа [есть], скиллы новые[, зацените]</line>
<line>с профой [меня][, {class}]</line>
<line trait="mat">[бля] наконец профа, {class}</line>
<line trait="eng">гц ми, {class} нау</line>
</seam>
<seam key="died_mob">
<line>[ну и] {mob} [меня] сложил</line>
<line>помер [от] {mob}[, позор]</line>
<line>{mob} [это] что-то [с чем-то]</line>
<line>слился [от] {mob}[, не заметил]</line>
<line>{mob} [меня] вынес[, хилок не было]</line>
<line>[все], [я] труп[, {mob} сильный]</line>
<line>{mob} [нафармил] меня ~lol~</line>
<line>рес есть [у кого]? {mob} [меня] убил</line>
<line trait="mat">{mob} [сука] убил [меня]</line>
</seam>
<seam key="loot_brag">
<line>{drop} [упал][, зацените]</line>
<line>о, {drop}[, наконец]</line>
<line>{drop} [с {mob}][, повезло]</line>
<line>[ееее] {drop}</line>
<line>{drop} выбил[, продам]</line>
<line trait="mat">{drop} [бля] выпал[, наконец]</line>
</seam>
<seam key="reply_clan">
<line>[да], {clan}[, а что]</line>
<line>{clan} [у меня][, норм клан]</line>
<line>в {clan} состою[, {player}]</line>
<line>{clan}, [мы] тут все [стоим]</line>
<line>[ага], {clan}[, зайди к нам]</line>
<line>клан есть, {clan}[, а ты]?</line>
<line>без клана [пока][, ищу]</line>
<line>[пока] нет [клана][, зовут - не иду]</line>
<line>ищу клан[, если что]</line>
<line trait="mat">{clan} [бля], лучший клан</line>
<rule need="asker=clanmate">
<line>~lol~ [ты чего], мы ж в одном [клане]</line>
<line>{player}, [ты] в нашем клане [вообще-то]</line>
</rule>
</seam>
<seam key="reply_solo">
<line>соло[, да][, {player}]</line>
<line>[пока] один[, пати не нашел]</line>
<line>соло фармлю[, так быстрее]</line>
<line>один[, а что][, го вместе]?</line>
<line>с кланом [обычно], сейчас [вот] один</line>
<line>соло, [тут] пати не нужна</line>
<line>[ну] один, [и] что?</line>
<line>одному [тут] норм[, никто не мешает]</line>
<line>в пати [сейчас][, но народ афк]</line>
<line trait="mat">один [бля], [все] разбежались</line>
</seam>
<seam key="reply_long">
<line>[уже] пару часов [тут]</line>
<line>с утра [стою][, {player}]</line>
<line>[да] только пришел</line>
<line>[минут] сорок [примерно]</line>
<line>давно[, {level} тут взял]</line>
<line>с {level} [лвла] тут [фармлю]</line>
<line>[ну] час где-то</line>
<line>[уже] не помню[, долго]</line>
<line>недавно[, а что]?</line>
<line>[еще] пару лвлов [и] уйду [отсюда]</line>
</seam>
<seam key="reply_pk">
<line>[пока] тихо[, никого]</line>
<line>не видел [сегодня][, вроде чисто]</line>
<line>[был] один [красный], ушел [в сторону {zone}]</line>
<line>ходит [тут] кто-то[, осторожнее]</line>
<line>тут [всегда] спокойно[, фармь]</line>
<line>[вроде] чисто[, но ты] смотри [по сторонам]</line>
<line>пкшеры [обычно] вечером [приходят]</line>
<line>если что, [я] рядом[, кричи]</line>
<rule like="event=ganked:4">
<line>[только что] был[, меня и убил]</line>
<line>да[, меня] гангнули [только что][, {player}]</line>
<line>есть один [урод][, ищу его]</line>
</rule>
<rule like="personality=pkk:3">
<line>[если] увидишь - скажи[, я их ловлю]</line>
<line>[я] за этим и стою [тут]</line>
</rule>
<rule like="personality=ganker:3">
<line>[а] что, боишься? ~lol~</line>
<line>[тут] только я ~lol~</line>
</rule>
</seam>
<seam key="store_title">
<line>#store_goods#[85:, #store_price_word#][45:, #store_mood#]</line>
</seam>
@@ -2,95 +2,342 @@
<!--
Боевые наборы ботов. Правится без пересборки.
role - fighter | archer | mage | healer | support (влияет на дистанцию и приоритеты)
role - fighter | archer | mage | healer | support | spoiler (влияет на дистанцию и приоритеты;
spoiler ещё спойлит цель и свипает труп)
offensive - атакующий скилл. priority: меньше = важнее.
maxTargetHp - кастовать, только если у цели HP ниже этого % (добивание)
minMp - не кастовать, если своего MP меньше этого %
self - самобаф/усиление, вешается вне боя
heal - лечение: minHp = кастовать, если HP цели/своё ниже этого %
Скиллы, которых у бота нет по уровню, молча пропускаются.
Скиллы, которых у бота нет по уровню, молча пропускаются. Id сверены с stats/players/skillTrees.
Третьи профессии наследуют скиллы вторых, поэтому у них те же наборы.
-->
<combat>
<!-- ===== Бойцы ближнего боя ===== -->
<class id="1" role="fighter" name="Warrior">
<combat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/FakePlayerCombat.xsd">
<!-- ===== Базовые классы (1-19) ===== -->
<class id="0" role="fighter" name="Human Fighter">
<offensive id="16" priority="1" maxTargetHp="100" minMp="15" /> <!-- Mortal Blow -->
<offensive id="3" priority="2" maxTargetHp="100" minMp="15" /> <!-- Power Strike -->
<self id="139" /> <!-- War Cry -->
</class>
<class id="2" role="fighter" name="Gladiator">
<offensive id="261" priority="1" maxTargetHp="100" minMp="20" /> <!-- Triple Sonic Slash -->
<offensive id="6" priority="2" maxTargetHp="100" minMp="15" /> <!-- Sonic Blaster -->
<offensive id="1" priority="3" maxTargetHp="100" minMp="10" /> <!-- Triple Slash -->
<self id="8" /> <!-- Sonic Focus -->
<self id="139" />
<class id="18" role="fighter" name="Elven Fighter">
<offensive id="16" priority="1" maxTargetHp="100" minMp="15" />
<offensive id="3" priority="2" maxTargetHp="100" minMp="15" />
<heal id="58" priority="1" minHp="50" /> <!-- Elemental Heal -->
</class>
<class id="3" role="fighter" name="Warlord">
<offensive id="245" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="4" priority="2" maxTargetHp="100" minMp="15" />
<self id="139" />
<class id="31" role="fighter" name="Dark Fighter">
<offensive id="16" priority="1" maxTargetHp="100" minMp="15" />
<offensive id="3" priority="2" maxTargetHp="100" minMp="15" />
<offensive id="70" priority="3" maxTargetHp="100" minMp="20" /> <!-- Drain Health -->
</class>
<class id="4" role="fighter" name="Knight">
<offensive id="263" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="1" priority="2" maxTargetHp="100" minMp="10" />
<self id="98" /> <!-- Shield Fortress -->
<class id="44" role="fighter" name="Orc Fighter">
<offensive id="29" priority="1" maxTargetHp="100" minMp="15" /> <!-- Iron Punch -->
<offensive id="3" priority="2" maxTargetHp="100" minMp="15" />
</class>
<class id="7" role="fighter" name="Rogue">
<offensive id="30" priority="1" maxTargetHp="60" minMp="20" /> <!-- Backstab: добивание -->
<offensive id="16" priority="2" maxTargetHp="100" minMp="15" />
<self id="111" /> <!-- Rapid Shot -->
<class id="53" role="spoiler" name="Dwarven Fighter">
</class>
<class id="10" role="mage" name="Human Mystic">
<offensive id="1177" priority="2" maxTargetHp="100" minMp="10" /> <!-- Wind Strike -->
<offensive id="1184" priority="1" maxTargetHp="100" minMp="20" /> <!-- Ice Bolt -->
<heal id="1216" priority="1" minHp="55" /> <!-- Self Heal -->
<self id="1040" /> <!-- Shield -->
</class>
<class id="25" role="mage" name="Elven Mystic">
<offensive id="1177" priority="2" maxTargetHp="100" minMp="10" />
<offensive id="1184" priority="1" maxTargetHp="100" minMp="20" />
<heal id="1216" priority="1" minHp="55" />
<self id="1040" />
</class>
<class id="38" role="mage" name="Dark Mystic">
<offensive id="1177" priority="2" maxTargetHp="100" minMp="10" />
<offensive id="1184" priority="1" maxTargetHp="100" minMp="20" />
<heal id="1216" priority="1" minHp="55" />
<self id="1040" />
</class>
<!-- ===== Лучники ===== -->
<!-- ===== Первая профессия (20-39) ===== -->
<class id="1" role="fighter" name="Warrior">
<offensive id="100" priority="1" maxTargetHp="100" minMp="20" /> <!-- Stun Attack -->
<offensive id="255" priority="2" maxTargetHp="100" minMp="15" /> <!-- Power Smash -->
<offensive id="16" priority="3" maxTargetHp="100" minMp="15" />
<self id="78" /> <!-- War Cry -->
</class>
<class id="4" role="fighter" name="Knight">
<offensive id="92" priority="1" maxTargetHp="100" minMp="20" /> <!-- Shield Stun -->
<offensive id="70" priority="2" maxTargetHp="100" minMp="15" /> <!-- Drain Health -->
<offensive id="3" priority="3" maxTargetHp="100" minMp="10" />
<heal id="45" priority="1" minHp="50" /> <!-- Divine Heal -->
<self id="82" /> <!-- Majesty -->
</class>
<class id="7" role="fighter" name="Rogue">
<offensive id="16" priority="1" maxTargetHp="100" minMp="15" />
<offensive id="56" priority="2" maxTargetHp="100" minMp="15" /> <!-- Power Shot -->
<self id="312" /> <!-- Vicious Stance -->
</class>
<class id="11" role="mage" name="Wizard">
<offensive id="1220" priority="1" maxTargetHp="100" minMp="25" /> <!-- Blaze -->
<offensive id="1181" priority="2" maxTargetHp="100" minMp="20" /> <!-- Flame Strike -->
<offensive id="1184" priority="3" maxTargetHp="100" minMp="15" />
<offensive id="1177" priority="4" maxTargetHp="100" minMp="5" />
<heal id="1216" priority="1" minHp="50" />
<self id="1078" /> <!-- Concentration -->
</class>
<class id="15" role="healer" name="Cleric">
<heal id="1015" priority="1" minHp="45" /> <!-- Battle Heal -->
<heal id="1011" priority="2" minHp="65" /> <!-- Heal -->
<offensive id="1184" priority="4" maxTargetHp="100" minMp="30" />
<offensive id="1177" priority="5" maxTargetHp="100" minMp="20" />
<self id="1040" />
<self id="1068" /> <!-- Might -->
<self id="1204" /> <!-- Wind Walk -->
</class>
<class id="22" role="archer" name="Elven Scout">
<offensive id="101" priority="1" maxTargetHp="100" minMp="20" /> <!-- Stunning Shot -->
<offensive id="56" priority="2" maxTargetHp="100" minMp="15" /> <!-- Power Shot -->
<heal id="58" priority="1" minHp="50" />
<self id="312" />
<self id="99" /> <!-- Rapid Shot -->
</class>
<class id="26" role="mage" name="Elven Wizard">
<offensive id="1175" priority="1" maxTargetHp="100" minMp="25" /> <!-- Aqua Swirl -->
<offensive id="1181" priority="2" maxTargetHp="100" minMp="20" />
<offensive id="1184" priority="3" maxTargetHp="100" minMp="15" />
<offensive id="1177" priority="4" maxTargetHp="100" minMp="5" />
<heal id="1216" priority="1" minHp="50" />
<self id="1078" />
</class>
<class id="35" role="fighter" name="Assassin">
<offensive id="16" priority="1" maxTargetHp="100" minMp="15" />
<offensive id="223" priority="2" maxTargetHp="100" minMp="15" /> <!-- Sting -->
<offensive id="70" priority="3" maxTargetHp="100" minMp="15" />
<self id="312" />
</class>
<class id="39" role="mage" name="Dark Wizard">
<offensive id="1178" priority="1" maxTargetHp="100" minMp="25" /> <!-- Twister -->
<offensive id="1181" priority="2" maxTargetHp="100" minMp="20" />
<offensive id="1184" priority="3" maxTargetHp="100" minMp="15" />
<offensive id="1177" priority="4" maxTargetHp="100" minMp="5" />
<heal id="1216" priority="1" minHp="50" />
<self id="1078" />
</class>
<class id="45" role="fighter" name="Orc Raider">
<offensive id="100" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="255" priority="2" maxTargetHp="100" minMp="15" />
<offensive id="29" priority="3" maxTargetHp="100" minMp="15" />
<self id="94" /> <!-- Rage -->
<heal id="34" priority="1" minHp="40" /> <!-- Bandage -->
</class>
<class id="54" role="spoiler" name="Scavenger">
<offensive id="100" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="245" priority="2" maxTargetHp="100" minMp="15" /> <!-- Wild Sweep -->
<heal id="34" priority="1" minHp="40" />
</class>
<!-- ===== Вторая профессия (40+) и третья (76+) ===== -->
<class id="2" role="fighter" name="Gladiator">
<offensive id="261" priority="1" maxTargetHp="100" minMp="20" /> <!-- Triple Sonic Slash -->
<offensive id="5" priority="2" maxTargetHp="100" minMp="20" /> <!-- Double Sonic Slash -->
<offensive id="6" priority="3" maxTargetHp="100" minMp="15" /> <!-- Sonic Blaster -->
<offensive id="1" priority="4" maxTargetHp="100" minMp="10" /> <!-- Triple Slash -->
<offensive id="100" priority="5" maxTargetHp="100" minMp="10" />
<self id="8" /> <!-- Sonic Focus -->
<self id="78" />
</class>
<class id="88" role="fighter" name="Duelist">
<offensive id="261" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="5" priority="2" maxTargetHp="100" minMp="20" />
<offensive id="6" priority="3" maxTargetHp="100" minMp="15" />
<offensive id="1" priority="4" maxTargetHp="100" minMp="10" />
<self id="8" />
<self id="78" />
</class>
<class id="5" role="fighter" name="Paladin">
<offensive id="92" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="49" priority="2" maxTargetHp="100" minMp="20" /> <!-- Holy Strike -->
<offensive id="70" priority="3" maxTargetHp="100" minMp="15" />
<heal id="45" priority="1" minHp="50" />
<self id="196" /> <!-- Holy Blade -->
<self id="197" /> <!-- Holy Armor -->
<self id="82" />
</class>
<class id="90" role="fighter" name="Phoenix Knight">
<offensive id="92" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="49" priority="2" maxTargetHp="100" minMp="20" />
<offensive id="70" priority="3" maxTargetHp="100" minMp="15" />
<heal id="45" priority="1" minHp="50" />
<self id="196" />
<self id="197" />
<self id="82" />
</class>
<class id="8" role="fighter" name="Treasure Hunter">
<offensive id="30" priority="1" maxTargetHp="60" minMp="20" /> <!-- Backstab: добивание -->
<offensive id="263" priority="2" maxTargetHp="100" minMp="20" /> <!-- Deadly Blow -->
<offensive id="16" priority="3" maxTargetHp="100" minMp="15" />
<self id="312" />
<self id="137" /> <!-- Critical Chance -->
</class>
<class id="93" role="fighter" name="Adventurer">
<offensive id="30" priority="1" maxTargetHp="60" minMp="20" />
<offensive id="263" priority="2" maxTargetHp="100" minMp="20" />
<offensive id="16" priority="3" maxTargetHp="100" minMp="15" />
<self id="312" />
<self id="137" />
</class>
<class id="9" role="archer" name="Hawkeye">
<offensive id="101" priority="1" maxTargetHp="100" minMp="20" /> <!-- Stun Shot -->
<offensive id="343" priority="2" maxTargetHp="100" minMp="25" /> <!-- Double Shot -->
<self id="111" />
<offensive id="101" priority="1" maxTargetHp="100" minMp="20" /> <!-- Stunning Shot -->
<offensive id="19" priority="2" maxTargetHp="100" minMp="25" /> <!-- Double Shot -->
<offensive id="24" priority="3" maxTargetHp="100" minMp="25" /> <!-- Burst Shot -->
<offensive id="56" priority="4" maxTargetHp="100" minMp="10" />
<self id="312" />
<self id="99" /> <!-- Rapid Shot -->
</class>
<class id="92" role="archer" name="Sagittarius">
<offensive id="101" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="19" priority="2" maxTargetHp="100" minMp="25" />
<offensive id="24" priority="3" maxTargetHp="100" minMp="25" />
<offensive id="56" priority="4" maxTargetHp="100" minMp="10" />
<self id="312" />
<self id="99" />
</class>
<class id="12" role="mage" name="Sorcerer">
<offensive id="1230" priority="1" maxTargetHp="100" minMp="30" /> <!-- Prominence -->
<offensive id="1231" priority="2" maxTargetHp="100" minMp="25" /> <!-- Aura Flare -->
<offensive id="1220" priority="3" maxTargetHp="100" minMp="20" />
<offensive id="1177" priority="5" maxTargetHp="100" minMp="5" />
<heal id="1216" priority="1" minHp="50" />
<self id="1078" />
<self id="1232" /> <!-- Blazing Skin -->
</class>
<class id="94" role="mage" name="Archmage">
<offensive id="1230" priority="1" maxTargetHp="100" minMp="30" />
<offensive id="1231" priority="2" maxTargetHp="100" minMp="25" />
<offensive id="1220" priority="3" maxTargetHp="100" minMp="20" />
<offensive id="1177" priority="5" maxTargetHp="100" minMp="5" />
<heal id="1216" priority="1" minHp="50" />
<self id="1078" />
<self id="1232" />
</class>
<class id="16" role="healer" name="Bishop">
<heal id="1218" priority="1" minHp="45" /> <!-- Greater Battle Heal -->
<heal id="1217" priority="2" minHp="70" /> <!-- Greater Heal -->
<heal id="1015" priority="3" minHp="60" />
<offensive id="1028" priority="4" maxTargetHp="100" minMp="40" /> <!-- Might of Heaven -->
<offensive id="1184" priority="5" maxTargetHp="100" minMp="30" />
<self id="1040" />
<self id="1068" />
<self id="1204" />
<self id="1085" /> <!-- Acumen -->
</class>
<class id="97" role="healer" name="Cardinal">
<heal id="1218" priority="1" minHp="45" />
<heal id="1217" priority="2" minHp="70" />
<heal id="1015" priority="3" minHp="60" />
<offensive id="1028" priority="4" maxTargetHp="100" minMp="40" />
<offensive id="1184" priority="5" maxTargetHp="100" minMp="30" />
<self id="1040" />
<self id="1068" />
<self id="1204" />
<self id="1085" />
</class>
<class id="24" role="archer" name="Silver Ranger">
<offensive id="101" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="343" priority="2" maxTargetHp="100" minMp="25" />
<self id="111" />
<offensive id="19" priority="2" maxTargetHp="100" minMp="25" />
<offensive id="24" priority="3" maxTargetHp="100" minMp="25" />
<offensive id="56" priority="4" maxTargetHp="100" minMp="10" />
<heal id="58" priority="1" minHp="50" />
<self id="312" />
<self id="99" />
</class>
<!-- ===== Маги ===== -->
<class id="12" role="mage" name="Sorcerer">
<offensive id="1177" priority="3" maxTargetHp="100" minMp="10" /> <!-- Wind Strike -->
<offensive id="1230" priority="1" maxTargetHp="100" minMp="30" /> <!-- Prominence -->
<offensive id="1181" priority="2" maxTargetHp="100" minMp="20" />
<self id="1085" /> <!-- Acumen -->
</class>
<class id="13" role="mage" name="Necromancer">
<offensive id="1177" priority="3" maxTargetHp="100" minMp="10" />
<offensive id="1234" priority="1" maxTargetHp="100" minMp="30" />
<self id="1085" />
<class id="102" role="archer" name="Moonlight Sentinel">
<offensive id="101" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="19" priority="2" maxTargetHp="100" minMp="25" />
<offensive id="24" priority="3" maxTargetHp="100" minMp="25" />
<offensive id="56" priority="4" maxTargetHp="100" minMp="10" />
<heal id="58" priority="1" minHp="50" />
<self id="312" />
<self id="99" />
</class>
<class id="27" role="mage" name="Spellsinger">
<offensive id="1177" priority="3" maxTargetHp="100" minMp="10" />
<offensive id="1235" priority="1" maxTargetHp="100" minMp="30" /> <!-- Hydro Blast -->
<self id="1085" />
<offensive id="1231" priority="2" maxTargetHp="100" minMp="25" />
<offensive id="1175" priority="3" maxTargetHp="100" minMp="20" />
<offensive id="1177" priority="5" maxTargetHp="100" minMp="5" />
<heal id="1216" priority="1" minHp="50" />
<self id="1078" />
<self id="1238" /> <!-- Freezing Skin -->
</class>
<class id="34" role="mage" name="Spellhowler">
<offensive id="1177" priority="3" maxTargetHp="100" minMp="10" />
<class id="103" role="mage" name="Mystic Muse">
<offensive id="1235" priority="1" maxTargetHp="100" minMp="30" />
<offensive id="1231" priority="2" maxTargetHp="100" minMp="25" />
<offensive id="1175" priority="3" maxTargetHp="100" minMp="20" />
<offensive id="1177" priority="5" maxTargetHp="100" minMp="5" />
<heal id="1216" priority="1" minHp="50" />
<self id="1078" />
<self id="1238" />
</class>
<class id="36" role="fighter" name="Abyss Walker">
<offensive id="30" priority="1" maxTargetHp="60" minMp="20" />
<offensive id="263" priority="2" maxTargetHp="100" minMp="20" />
<offensive id="223" priority="3" maxTargetHp="100" minMp="15" />
<offensive id="16" priority="4" maxTargetHp="100" minMp="10" />
<self id="312" />
</class>
<class id="108" role="fighter" name="Ghost Hunter">
<offensive id="30" priority="1" maxTargetHp="60" minMp="20" />
<offensive id="263" priority="2" maxTargetHp="100" minMp="20" />
<offensive id="223" priority="3" maxTargetHp="100" minMp="15" />
<offensive id="16" priority="4" maxTargetHp="100" minMp="10" />
<self id="312" />
</class>
<class id="40" role="mage" name="Spellhowler">
<offensive id="1239" priority="1" maxTargetHp="100" minMp="30" /> <!-- Hurricane -->
<self id="1085" />
<offensive id="1234" priority="2" maxTargetHp="100" minMp="25" /> <!-- Vampiric Claw -->
<offensive id="1178" priority="3" maxTargetHp="100" minMp="20" />
<offensive id="1177" priority="5" maxTargetHp="100" minMp="5" />
<heal id="1216" priority="1" minHp="50" />
<self id="1078" />
</class>
<!-- ===== Лекари и саппорт ===== -->
<class id="15" role="healer" name="Cleric">
<heal id="1217" priority="1" minHp="70" /> <!-- Group Heal? нет - Heal -->
<heal id="1011" priority="2" minHp="55" /> <!-- Heal -->
<offensive id="1177" priority="5" maxTargetHp="100" minMp="40" />
<self id="1040" /> <!-- Shield -->
<class id="110" role="mage" name="Storm Screamer">
<offensive id="1239" priority="1" maxTargetHp="100" minMp="30" />
<offensive id="1234" priority="2" maxTargetHp="100" minMp="25" />
<offensive id="1178" priority="3" maxTargetHp="100" minMp="20" />
<offensive id="1177" priority="5" maxTargetHp="100" minMp="5" />
<heal id="1216" priority="1" minHp="50" />
<self id="1078" />
</class>
<class id="16" role="support" name="Prophet">
<self id="1040" />
<self id="1085" />
<offensive id="1177" priority="5" maxTargetHp="100" minMp="40" />
<class id="46" role="fighter" name="Destroyer">
<offensive id="190" priority="1" maxTargetHp="100" minMp="20" /> <!-- Fatal Strike -->
<offensive id="260" priority="2" maxTargetHp="100" minMp="20" /> <!-- Hammer Crush -->
<offensive id="36" priority="3" maxTargetHp="100" minMp="15" /> <!-- Whirlwind -->
<offensive id="100" priority="4" maxTargetHp="100" minMp="10" />
<self id="121" /> <!-- Battle Roar -->
<self id="139" /> <!-- Guts -->
<heal id="34" priority="1" minHp="40" />
</class>
<class id="113" role="fighter" name="Titan">
<offensive id="190" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="260" priority="2" maxTargetHp="100" minMp="20" />
<offensive id="36" priority="3" maxTargetHp="100" minMp="15" />
<offensive id="100" priority="4" maxTargetHp="100" minMp="10" />
<self id="121" />
<self id="139" />
<heal id="34" priority="1" minHp="40" />
</class>
<class id="55" role="spoiler" name="Bounty Hunter">
<offensive id="260" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="36" priority="2" maxTargetHp="100" minMp="15" />
<offensive id="100" priority="3" maxTargetHp="100" minMp="10" />
<heal id="34" priority="1" minHp="40" />
</class>
<class id="117" role="spoiler" name="Fortune Seeker">
<offensive id="260" priority="1" maxTargetHp="100" minMp="20" />
<offensive id="36" priority="2" maxTargetHp="100" minMp="15" />
<offensive id="100" priority="3" maxTargetHp="100" minMp="10" />
<heal id="34" priority="1" minHp="40" />
</class>
<!-- Значения по умолчанию, если класса нет в списке -->
<default role="fighter">
<offensive id="3" priority="1" maxTargetHp="100" minMp="15" />
<offensive id="1" priority="2" maxTargetHp="100" minMp="10" />
<offensive id="16" priority="2" maxTargetHp="100" minMp="15" />
<offensive id="1177" priority="3" maxTargetHp="100" minMp="10" />
</default>
</combat>
@@ -2,19 +2,24 @@
<!-- Intent lexicon: an intent matches when EVERY <m> group has at least one
alternative that prefix-matches a token of the normalized message.
maxTokens limits the intent to short messages. Order = priority. -->
<intents>
<intents xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/FakePlayerIntents.xsd">
<intent key="botcheck" seam="reply_botcheck"><m>бот|боты|скрипт|макрос|программ</m></intent>
<intent key="insult" seam=""><m>лох|лош|нуб|дурак|дура|дебил|идиот|туп|мусор|чмо|клоун|днище|бомж|крыса|слаб|отстой|пшел|пшла|заткни</m></intent>
<intent key="thanks" seam="reply_thanks"><m>спс|спасиб|пасиб|благодар|сенкс|thx|ty|респект|красав</m></intent>
<intent key="duel" seam="reply_duel"><m>дуэль|дюль|1в1|1x1|1х1|соло|выйдем|стыкнемся|пвп</m></intent>
<intent key="ask_help" seam=""><m>помо|хелп|помощ|хиль|отхил|хил|рес|ресни|спаси|выруч|бафни|баф|подсоб</m></intent>
<intent key="duel" seam="reply_duel"><m>дуэль|дюль|1в1|1x1|1х1|выйдем|стыкнемся|=пвп|=дуель</m></intent>
<intent key="ask_help" seam=""><m>помо|помг|помаг|памаг|хелп|хэлп|help|помощ|хиль|отхил|=хил|=рес|ресни|спаси|выруч|бафни|=баф|подсоб</m></intent>
<intent key="ask_party" seam="reply_party_no"><m>пати|парти|групп|пл|инвайт|прими|возьми</m></intent>
<intent key="ask_level" seam="reply_level"><m>какой|скок|сколько|че|чо</m><m>лвл|левел|уровен|лева</m></intent>
<intent key="ask_price" seam="reply_price"><m>почем|цена|цену|купи|продай|продаш|скупа|стоит|аден</m></intent>
<intent key="ask_rumors" seam="reply_rumor_none"><m>что|чо|че|какие|слыш</m><m>нов|слыш|происход|творится|интересн</m></intent>
<intent key="ask_price" seam="reply_price"><m>почем|цена|цену|купи|продай|продаш|скупа|=стоит|=стоят|аден|=цен</m></intent>
<intent key="ask_rumors" seam="reply_rumor_none"><m>что|чо|че|какие|слыхал|слышал|слышно|=есть</m><m>=нов|слух|происход|творится|интересн|расскаж|=новост</m></intent>
<intent key="ask_drop" seam="reply_drop"><m>дроп|падает|капает|выпал|выбил|лут</m></intent>
<intent key="ask_where" seam="reply_where"><m>где|куда|далеко</m></intent>
<intent key="ask_clan" seam="reply_clan"><m>клан|кланы|=кп|гильд</m></intent>
<intent key="ask_solo" seam="reply_solo" maxTokens="6"><m>=соло|один|одна|=сам|=сама|одиноч</m></intent>
<intent key="ask_long" seam="reply_long" maxTokens="6"><m>давно|=долго|сколько</m><m>=тут|=здесь|играешь|стоишь|фармишь|=на серв|качаешь</m></intent>
<intent key="ask_pk" seam="reply_pk" maxTokens="7"><m>=пк|пкшер|ганк|гангер|=красн|убийц|опасно</m></intent>
<intent key="bye" seam="reply_bye"><m>пока|бб|бай|досвид|бывай|споки|удачи</m></intent>
<intent key="how_are_you" seam="reply_how" maxTokens="5"><m>как|че|чо|что</m><m>дела|сам|оно|как|жизнь|делаешь|поживаешь|фарм|настрой</m></intent>
<intent key="greeting" seam="greeting" maxTokens="3"><m>привет|прив|хай|здаров|здоров|ку|йо|хелло|дратути|салют|даров</m></intent>
<intent key="greeting" seam="greeting" maxTokens="3"><m>привет|превет|прив|хай|здаров|здоров|здраст|=ку|=йо|хелло|дратути|салют|даров|дароу|=хи|hi|hello</m></intent>
<intent key="yes_ok" seam="reply_yes_ok" maxTokens="2"><m>да|ага|ок|окей|норм|пон|ясн|угу|лан|ладно</m></intent>
</intents>
@@ -6,7 +6,7 @@
Pool lookup tries "pool.personality" first, then "pool".
When a phrase key is missing here, the flat seam with the same key is used.
-->
<phrases>
<phrases xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/FakePlayerPhrases.xsd">
<phrase key="greeting">
<part pool="hello" chance="100" skip="ganker" />
<part pool="taunt" chance="70" only="ganker" />
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<pools>
<pools xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/FakePlayerPools.xsd">
<pool key="threat">
<line>#threat_verb#[ #threat_when#]</line>
<line>#threat_verb#[, #threat_when#]</line>
File diff suppressed because it is too large Load Diff
@@ -124,14 +124,10 @@ public class ChatGeneral implements IChatHandler
activeChar.sendPacket(cs);
// Headless bots nearby may react to general chat.
if (FakePlayersConfig.FAKE_PLAYERS_ENABLED && FakePlayersConfig.FAKE_PLAYER_CHAT && (Rnd.get(100) < FakePlayersConfig.FAKE_PLAYER_LOCAL_CHAT_REPLY_CHANCE))
// Headless bots nearby may react to general chat (one addressed by name always does).
if (FakePlayersConfig.FAKE_PLAYERS_ENABLED && FakePlayersConfig.FAKE_PLAYER_CHAT && !activeChar.isHeadlessBot())
{
final Player headless = World.getNearestVisibleObjectInRange(activeChar, Player.class, 1250, nearby -> nearby.isHeadlessBot() && !nearby.isDead());
if (headless != null)
{
org.l2jmobius.gameserver.managers.FakePlayerHeadlessManager.getInstance().onLocalChat(activeChar, headless, text);
}
org.l2jmobius.gameserver.managers.FakePlayerSocial.getInstance().onPlayerSaid(activeChar, text);
}
// Fake players may react to nearby general chat.
@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="fakePlayerChat" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="fpcName" use="required" />
<xs:attribute type="xs:string" name="searchMethod" use="required" />
<xs:attribute type="xs:string" name="searchText" use="required" />
<xs:attribute type="xs:string" name="answers" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Permissive schema: the file is validated for well-formedness only, the loader checks the content. -->
<xs:element name="combat">
<xs:complexType>
<xs:sequence>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute processContents="skip" />
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Permissive schema: the file is validated for well-formedness only, the loader checks the content. -->
<xs:element name="intents">
<xs:complexType>
<xs:sequence>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute processContents="skip" />
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Permissive schema: the file is validated for well-formedness only, the loader checks the content. -->
<xs:element name="phrases">
<xs:complexType>
<xs:sequence>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute processContents="skip" />
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Permissive schema: the file is validated for well-formedness only, the loader checks the content. -->
<xs:element name="pools">
<xs:complexType>
<xs:sequence>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute processContents="skip" />
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Permissive schema: the file is validated for well-formedness only, the loader checks the content. -->
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:anyAttribute processContents="skip" />
</xs:complexType>
</xs:element>
</xs:schema>