BORDIR 62 Опубликовано 7 июля, 2013 (изменено) Всем привет. Уже несколько недель работаю над исходным кодом High Five, над FT в данный момент.Столкнулся с очень сложной для меня недоработкой. Совершенно не знаю даже, куда копать. Итак. В High Five в настройках чата (в клиенте) появилась такая функция, как "Отключить слова NPC", которая отключает все автоматические диалоги, выдаваемые НПЦ (Адептов, всяких "Лулу!" и так далее). Так вот на FT, если установить галочку на данной настройке, ничего не меняется. НПЦ продолжают дальше ходить и разговаривать сами с собой. Долго искал, какой класс вообще отвечает за слова, вроде бы нашел. Но написать настройку (которая в клиенте?) с нуля для меня сейчас просто нереально Поэтому пошел копаться в других исходниках. В l2jserver все работает правильно, стал копать там код, но так и не нашел проверки на включение данной опции, хотя потратил довольно много времени. Итак Я не прошу Вас за меня исправить данную недоработку, прошу помочь найти в каком направлении дальше двигаться. Дальше сам как-нибудь допишу. Всем, кто осилил текст, уже заранее спасибо. Есть идеи? Изменено 7 июля, 2013 пользователем BORDIR Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 7 июля, 2013 Или же, если нету идей, сообщите мне, пожалуйста, о том, что это нереально сложно и проще забить Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BrainEater 217 Опубликовано 7 июля, 2013 AI, у адептов и Рэми точно там. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BrainEater 217 Опубликовано 7 июля, 2013 (изменено) public class Adept extends DefaultAI { protected Location[] _points; private int _lastPoint = 0; public Adept(NpcInstance actor) { super(actor); } @Override public boolean isGlobalAI() { return true; } @Override protected boolean thinkActive() { if(!_def_think) { startMoveTask(); } return true; } @Override protected void onEvtArrived() { startMoveTask(); if(Rnd.chance(30)) { sayRndMsg(); } super.onEvtArrived(); } private void startMoveTask() { _lastPoint++; if(_lastPoint >= _points.length) { _lastPoint = 0; } addTaskMove(_points[_lastPoint], false); doTask(); } private void sayRndMsg() { NpcInstance actor = getActor(); if(actor == null) { return; } NpcString ns; switch(Rnd.get(7)) { case 1: ns = NpcString.CLOUDS_OF_BLOOD_ARE_GATHERING_SOON_IT_WILL_START_TO_RAIN_THE_RAIN_OF_CRIMSON_BLOOD; break; case 2: ns = NpcString.WHILE_THE_FOOLISH_LIGHT_WAS_ASLEEP_THE_DARKNESS_WILL_AWAKEN_FIRST_UH; break; case 3: ns = NpcString.IT_IS_THE_DEEPEST_DARKNESS_WITH_ITS_ARRIVAL_THE_WORLD_WILL_SOON_DIE; break; case 4: ns = NpcString.DEATH_IS_JUST_A_NEW_BEGINNING_HUHU_FEAR_NOT; break; case 5: ns = NpcString.AHH_BEAUTIFUL_GODDES_OF_DEATH_COVER_OVER_THE_FILTH_OF_THOS_WORLD_YOUR_DARKNESS; break; case 6: ns = NpcString.THE_GODDESS_RESURRECTION_HAS_ALREADY_BEGUN_HUHU_INSIGNIFICANT_CREATURES_LIKE_YOU_CAN_DO_NOTHING; break; default: ns = NpcString.A_BLACK_MOON_NOW_DO_YOU_UNDERSTAND_THAT_HE_HAS_OPENED_HIS_EYES; break; } Functions.npcSay(actor, ns); } @Override protected void onEvtAttacked(Creature attacker, int damage) { } @Override protected void onEvtAggression(Creature target, int aggro) { } Или нужно именно вывод в конфиг сделать? Изменено 7 июля, 2013 пользователем BrainEater Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 7 июля, 2013 У меня ни на одних, ни на других исходниках отдельных Адептов нету. А сама речь (на l2j) запрятана немного в другое место Но не в этом суть. Вы привели код. Подскажите, пожалуйста, где в нем проверка на опцию отключения слов? Именно это я и ищу. Данная опция находится в клиенте и ее включает игрок. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 7 июля, 2013 Поэтому пока я в полном заблуждении, где ее искать... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BrainEater 217 Опубликовано 7 июля, 2013 Это суперкласс адептов с FT. Запуск происходит здесь @Override protected void onEvtArrived() { startMoveTask(); if(Rnd.chance(30)) { sayRndMsg(); } super.onEvtArrived(); } а метод sayRndMsg чуть ниже по коду. Про то,что игроки могут вкл/выкл это в клиенте первый раз слышу. А вот серверной частью запретить адептам говорить крайне легко, поставив условие в приведенном мной коде. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 7 июля, 2013 (изменено) Это суперкласс адептов с FT. Запуск происходит здесь @Override protected void onEvtArrived() { startMoveTask(); if(Rnd.chance(30)) { sayRndMsg(); } super.onEvtArrived(); } а метод sayRndMsg чуть ниже по коду. Про то,что игроки могут вкл/выкл это в клиенте первый раз слышу. А вот серверной частью запретить адептам говорить крайне легко, поставив условие в приведенном мной коде. Понял Вас. Вы мне про Датапак говорите. К сожалению, проблема не в этом, и я не случайно создал тему в разделе "Ядро" и написал, что она на самом деле непростая. Но все равно спасибо за попытку помочь. Если есть еще идеи, пожалуйста, перечитайте мой первый пост. Вот, что меня интересует: http://s005.radikal....aa121d2cd2f.jpg Данная функция не работает на FT. На L2jserver все отлично, вот только проверку так найти я и не смог... Так что теме ап) Изменено 7 июля, 2013 пользователем BORDIR Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 7 июля, 2013 Есть ли у кого-нибудь исходы l2emu на компьютере? Проверьте, пожалуйста, там работоспособность данной фичи. Быть может там будет проще найти решение. Спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BrainEater 217 Опубликовано 7 июля, 2013 Попробуй взять L2Phx, зайти и посмотреть, шлёт ли клиент что-либо при постановке/снятии галочки. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BrainEater 217 Опубликовано 7 июля, 2013 Попробуй взять L2Phx, зайти и посмотреть, шлёт ли клиент что-либо при постановке/снятии галочки. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 7 июля, 2013 (изменено) просто надо слать слова нпс в отдельном канале чата (chat type по другому), тогда и будет отключаться показ сообщений нпс в клиенте при включении опции "Отключить слова NPC". в ГоД это канал с ид 22, в хф скорее всего тоже, но не факт - возможно этот канал уже в ГоД ввели, хотя наличие опции, о которой говорилось выше, свидетельствует что все же отдельный канал должен существовать - если не под тем же ид, то под другим. Изменено 7 июля, 2013 пользователем Gaikotsu 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 7 июля, 2013 Попробуй взять L2Phx, зайти и посмотреть, шлёт ли клиент что-либо при постановке/снятии галочки. нет, ничего клиент при этом не шлет - это чисто фильтрация на стороне клиента, методом отсеивания сообщений, приходящих в определенный тип чата - вобщем так же как и все остальные типы сообщений в чат отсеиваются при выставлении/снятии галочек в настройках чата на тему показа разных типов сообщений. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 7 июля, 2013 (изменено) просто надо слать слова нпс в отдельном канале чата (chat type по другому), тогда и будет отключаться показ сообщений нпс в клиенте при включении опции "Отключить слова NPC". в ГоД это канал с ид 22, в хф скорее всего тоже, но не факт - возможно этот канал уже в ГоД ввели, хотя наличие опции, о которой говорилось выше, свидетельствует что все же отдельный канал должен существовать - если не под тем же ид, то под другим. нет, ничего клиент при этом не шлет - это чисто фильтрация на стороне клиента, методом отсеивания сообщений, приходящих в определенный тип чата - вобщем так же как и все остальные типы сообщений в чат отсеиваются при выставлении/снятии галочек в настройках чата на тему показа разных типов сообщений. Спасибо большое. Вы действительно правы (сравнил с l2j). Чат 22 существует и работает на ура. В First Team чат 22 реализован на... 0%. Но по аналогии с другими чатами и l2j думаю, что смогу написать. То есть фактически я просто создаю новый чат тайп 22 и задаю ему различные параметры и клиент сам догадается, что необходимо привязать опцию отключения слов к данному чату? Еще раз спасибо. Изменено 7 июля, 2013 пользователем BORDIR Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 7 июля, 2013 Нет, все же это будет очень непросто написать, но буду думать. Ибо интересно уже даже Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 7 июля, 2013 Еще немного полазил по коду. На FT привязки к цифровым обозначениям чата нету. Соответственно реализация совершенно другая, чем у l2j. Поэтому либо писать все чаты с нуля, и то неизвестно как, либо искать другие исходники, где похожая реализация. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 7 июля, 2013 Ну так ладно. На данный момент мне такую работу не осилить. В связи с этим новый вопрос: Я просто даже не могу представить, как все это работает? А именно на L2j? Попробуйте, пожалуйста, объяснить на пальцах К примеру чат тайп NPC_SHOUT. Все, что мы о нем имеем в исходниках это: public static final int NPC_SHOUT = 23; И все. Как серверная и клиентская часть определяют, что это действительно NPC_SHOUT и что его нужно писать именно в данном типе чата? Совершенно не могу этого понять... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BrainEater 217 Опубликовано 7 июля, 2013 L2j и FT это 2 абсолютно разные основы. Пробей поиском ChatType по сурсам и по идее это немного прояснит ситуацию. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 7 июля, 2013 (изменено) L2j и FT это 2 абсолютно разные основы. Пробей поиском ChatType по сурсам и по идее это немного прояснит ситуацию. В l2j там я уже пришел в тупик, дошел до хэндлеров и вызова функций с... "неба") Вот это и есть для меня край. Откуда они уже берутся, мне не ясно. Да, может быть, для такого глубоко погружения в java действительно стоило бы почитать книжки А на FT значительно проще. Там я уже давно нашел, где и как какой чат описывается. Изменено 7 июля, 2013 пользователем BORDIR Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 8 июля, 2013 В лыже тоже все предельно просто. NpcSay ns = new NpcSay(getObjectId(), Say2.NPC_SHOUT, getNpcId(), npcString); if (npcString.getParamCount() == 1) { ns.addStringParameter(attacker.getName()); } broadcastPacket(ns); Создаем объект NpcSay с параметрами к какому чату он принадлежит. Далее, по приведённому коду, добавляем ник атакующего и отсылаем пакет. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 8 июля, 2013 В лыже тоже все предельно просто. NpcSay ns = new NpcSay(getObjectId(), Say2.NPC_SHOUT, getNpcId(), npcString); if (npcString.getParamCount() == 1) { ns.addStringParameter(attacker.getName()); } broadcastPacket(ns); Создаем объект NpcSay с параметрами к какому чату он принадлежит. Далее, по приведённому коду, добавляем ник атакующего и отсылаем пакет. Вы просто ответили на последнее сообщение, не читая темы?) Я знаю, что в лыже все работает. Но я с лыжой не занимаюсь, меня интересует реализация npc_shout на ft, не более) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 8 июля, 2013 Вы просто ответили на последнее сообщение, не читая темы?) Я знаю, что в лыже все работает. Но я с лыжой не занимаюсь, меня интересует реализация npc_shout на ft, не более) Так вы сами тогда определитесь, что вы делаете. Вы смотрели реализацию на лыже, так вот она. Что вас останавливает сделать её на ФТ? 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 8 июля, 2013 В ChatType добавьте нужный тип чата и реализуйте через пакет NpcSay. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 8 июля, 2013 В ChatType добавьте нужный тип чата и реализуйте через пакет NpcSay. Уже писал в теме, что в FT нету привязки к id чатам. Соответственно реализация совершенно другая. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 8 июля, 2013 Там привязка только к названиям. А для названий расписаны отдельные условия. Как и какой чат существует. В лыже подобного не находил, там просто id и все отлично работает. А у FT, например для шаута: private static void shout(Player activeChar, Say2 cs) { int rx = MapUtils.regionX(activeChar); int ry = MapUtils.regionY(activeChar); int offset = Config.SHOUT_OFFSET; for(Player player : GameObjectsStorage.getAllPlayersForIterate()) { if(player == activeChar || activeChar.getReflection() != player.getReflection() || player.isBlockAll() || player.isInBlockList(activeChar)) continue; int tx = MapUtils.regionX(player); int ty = MapUtils.regionY(player); if(tx >= rx - offset && tx <= rx + offset && ty >= ry - offset && ty <= ry + offset || activeChar.isInRangeZ(player, Config.CHAT_RANGE)) player.sendPacket(cs); } } На лыже такого не нашел, ибо мне кажется, что там этого нету. Но тогда я не понимаю, как оно там работает О чем я тоже уже писал. Если сможете найти, буду очень благодарен. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты