Перейти к содержанию
Авторизация  
BORDIR

Отключить Слова Npc

Рекомендуемые сообщения

Всем привет.

 

Уже несколько недель работаю над исходным кодом High Five, над FT в данный момент.Столкнулся с очень сложной для меня недоработкой. Совершенно не знаю даже, куда копать.

 

Итак. В High Five в настройках чата (в клиенте) появилась такая функция, как "Отключить слова NPC", которая отключает все автоматические диалоги, выдаваемые НПЦ (Адептов, всяких "Лулу!" и так далее).

 

Так вот на FT, если установить галочку на данной настройке, ничего не меняется. НПЦ продолжают дальше ходить и разговаривать сами с собой. Долго искал, какой класс вообще отвечает за слова, вроде бы нашел. Но написать настройку (которая в клиенте?) с нуля для меня сейчас просто нереально :) Поэтому пошел копаться в других исходниках.

 

В l2jserver все работает правильно, стал копать там код, но так и не нашел проверки на включение данной опции, хотя потратил довольно много времени.

 

Итак :) Я не прошу Вас за меня исправить данную недоработку, прошу помочь найти в каком направлении дальше двигаться. Дальше сам как-нибудь допишу.

 

Всем, кто осилил текст, уже заранее спасибо. Есть идеи? :)

Изменено пользователем BORDIR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или же, если нету идей, сообщите мне, пожалуйста, о том, что это нереально сложно и проще забить :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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)
{
}

 

 

Или нужно именно вывод в конфиг сделать?

Изменено пользователем BrainEater

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня ни на одних, ни на других исходниках отдельных Адептов нету. А сама речь (на l2j) запрятана немного в другое место :)

 

Но не в этом суть. Вы привели код. Подскажите, пожалуйста, где в нем проверка на опцию отключения слов? Именно это я и ищу.

 

Данная опция находится в клиенте и ее включает игрок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поэтому пока я в полном заблуждении, где ее искать... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это суперкласс адептов с FT. Запуск происходит здесь

@Override
protected void onEvtArrived()
{
startMoveTask();
if(Rnd.chance(30))
{
sayRndMsg();
}
super.onEvtArrived();
}

 

а метод sayRndMsg чуть ниже по коду.

Про то,что игроки могут вкл/выкл это в клиенте первый раз слышу. А вот серверной частью запретить адептам говорить крайне легко, поставив условие в приведенном мной коде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это суперкласс адептов с FT. Запуск происходит здесь

@Override
protected void onEvtArrived()
{
startMoveTask();
if(Rnd.chance(30))
{
sayRndMsg();
}
super.onEvtArrived();
}

 

а метод sayRndMsg чуть ниже по коду.

Про то,что игроки могут вкл/выкл это в клиенте первый раз слышу. А вот серверной частью запретить адептам говорить крайне легко, поставив условие в приведенном мной коде.

 

Понял Вас. Вы мне про Датапак говорите.

 

К сожалению, проблема не в этом, и я не случайно создал тему в разделе "Ядро" и написал, что она на самом деле непростая.

 

Но все равно спасибо за попытку помочь.

 

Если есть еще идеи, пожалуйста, перечитайте мой первый пост.

 

Вот, что меня интересует:

 

http://s005.radikal....aa121d2cd2f.jpg

 

Данная функция не работает на FT. На L2jserver все отлично, вот только проверку так найти я и не смог...

 

Так что теме ап)

Изменено пользователем BORDIR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть ли у кого-нибудь исходы l2emu на компьютере? Проверьте, пожалуйста, там работоспособность данной фичи. Быть может там будет проще найти решение.

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуй взять L2Phx, зайти и посмотреть, шлёт ли клиент что-либо при постановке/снятии галочки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуй взять L2Phx, зайти и посмотреть, шлёт ли клиент что-либо при постановке/снятии галочки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

просто надо слать слова нпс в отдельном канале чата (chat type по другому), тогда и будет отключаться показ сообщений нпс в клиенте при включении опции "Отключить слова NPC".

в ГоД это канал с ид 22, в хф скорее всего тоже, но не факт - возможно этот канал уже в ГоД ввели, хотя наличие опции, о которой говорилось выше, свидетельствует что все же отдельный канал должен существовать - если не под тем же ид, то под другим.

Изменено пользователем Gaikotsu
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуй взять L2Phx, зайти и посмотреть, шлёт ли клиент что-либо при постановке/снятии галочки.

нет, ничего клиент при этом не шлет - это чисто фильтрация на стороне клиента, методом отсеивания сообщений, приходящих в определенный тип чата - вобщем так же как и все остальные типы сообщений в чат отсеиваются при выставлении/снятии галочек в настройках чата на тему показа разных типов сообщений.
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

просто надо слать слова нпс в отдельном канале чата (chat type по другому), тогда и будет отключаться показ сообщений нпс в клиенте при включении опции "Отключить слова NPC".

в ГоД это канал с ид 22, в хф скорее всего тоже, но не факт - возможно этот канал уже в ГоД ввели, хотя наличие опции, о которой говорилось выше, свидетельствует что все же отдельный канал должен существовать - если не под тем же ид, то под другим.

нет, ничего клиент при этом не шлет - это чисто фильтрация на стороне клиента, методом отсеивания сообщений, приходящих в определенный тип чата - вобщем так же как и все остальные типы сообщений в чат отсеиваются при выставлении/снятии галочек в настройках чата на тему показа разных типов сообщений.

 

Спасибо большое. Вы действительно правы (сравнил с l2j). Чат 22 существует и работает на ура.

 

В First Team чат 22 реализован на... 0%. Но по аналогии с другими чатами и l2j думаю, что смогу написать.

 

То есть фактически я просто создаю новый чат тайп 22 и задаю ему различные параметры и клиент сам догадается, что необходимо привязать опцию отключения слов к данному чату?

 

Еще раз спасибо.

Изменено пользователем BORDIR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, все же это будет очень непросто написать, но буду думать. Ибо интересно уже даже :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще немного полазил по коду. На FT привязки к цифровым обозначениям чата нету. Соответственно реализация совершенно другая, чем у l2j. Поэтому либо писать все чаты с нуля, и то неизвестно как, либо искать другие исходники, где похожая реализация.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так ладно. На данный момент мне такую работу не осилить.

 

В связи с этим новый вопрос:

 

Я просто даже не могу представить, как все это работает? А именно на L2j? Попробуйте, пожалуйста, объяснить на пальцах :)

 

К примеру чат тайп NPC_SHOUT. Все, что мы о нем имеем в исходниках это:

 

public static final int NPC_SHOUT = 23;

 

И все. Как серверная и клиентская часть определяют, что это действительно NPC_SHOUT и что его нужно писать именно в данном типе чата? Совершенно не могу этого понять...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

L2j и FT это 2 абсолютно разные основы. Пробей поиском ChatType по сурсам и по идее это немного прояснит ситуацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

L2j и FT это 2 абсолютно разные основы. Пробей поиском ChatType по сурсам и по идее это немного прояснит ситуацию.

 

В l2j там я уже пришел в тупик, дошел до хэндлеров и вызова функций с... "неба") Вот это и есть для меня край. Откуда они уже берутся, мне не ясно. Да, может быть, для такого глубоко погружения в java действительно стоило бы почитать книжки :)

 

А на FT значительно проще. Там я уже давно нашел, где и как какой чат описывается.

Изменено пользователем BORDIR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В лыже тоже все предельно просто.

 

NpcSay ns = new NpcSay(getObjectId(), Say2.NPC_SHOUT, getNpcId(), npcString);
if (npcString.getParamCount() == 1)
{
ns.addStringParameter(attacker.getName());
}

broadcastPacket(ns);

Создаем объект NpcSay с параметрами к какому чату он принадлежит. Далее, по приведённому коду, добавляем ник атакующего и отсылаем пакет.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В лыже тоже все предельно просто.

 

NpcSay ns = new NpcSay(getObjectId(), Say2.NPC_SHOUT, getNpcId(), npcString);
if (npcString.getParamCount() == 1)
{
ns.addStringParameter(attacker.getName());
}

broadcastPacket(ns);

Создаем объект NpcSay с параметрами к какому чату он принадлежит. Далее, по приведённому коду, добавляем ник атакующего и отсылаем пакет.

 

Вы просто ответили на последнее сообщение, не читая темы?) Я знаю, что в лыже все работает. Но я с лыжой не занимаюсь, меня интересует реализация npc_shout на ft, не более)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы просто ответили на последнее сообщение, не читая темы?) Я знаю, что в лыже все работает. Но я с лыжой не занимаюсь, меня интересует реализация npc_shout на ft, не более)

 

Так вы сами тогда определитесь, что вы делаете. Вы смотрели реализацию на лыже, так вот она. Что вас останавливает сделать её на ФТ?

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ChatType добавьте нужный тип чата и реализуйте через пакет NpcSay.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ChatType добавьте нужный тип чата и реализуйте через пакет NpcSay.

 

Уже писал в теме, что в FT нету привязки к id чатам. Соответственно реализация совершенно другая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там привязка только к названиям. А для названий расписаны отдельные условия. Как и какой чат существует. В лыже подобного не находил, там просто 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);
 }
}

 

На лыже такого не нашел, ибо мне кажется, что там этого нету. Но тогда я не понимаю, как оно там работает :) О чем я тоже уже писал.

 

Если сможете найти, буду очень благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...