НПЦ / Incomplete NPC info found in npcs.txt
Модератор: 4epT
Правила форума
Все вопросы по OK не касающиеся плагинов и макросов публикуются в этом разделе.
Перед тем как что то писать, пожалуйста, удостоверьтесь что данная тема не поднималась, вы полностью изучили мануалы по конфигурационным файлам бота и не нашли там решения.
Все вопросы по OK не касающиеся плагинов и макросов публикуются в этом разделе.
Перед тем как что то писать, пожалуйста, удостоверьтесь что данная тема не поднималась, вы полностью изучили мануалы по конфигурационным файлам бота и не нашли там решения.
- piroJOKE
- Модератор
- Сообщения: 8205
- Зарегистрирован: Сб ноя 04, 2006 2:20 am
- Сервер RO:: localhost
- Откуда: Molvania
Было бы неплохо точно идентифицировать ошибку. Т.е., посмотреть, что "видит" Кора. Само это сообщение об ошибке вызывается из модуля /src/Misc.pm. (Ну, это может любой найти обычным поиском по файлам).
Вот как это выглядит:
Добавлено спустя 3 минуты 28 секунд:
Я так понимаю, эта процедура должна возвращать ссылку на элемент хэша, "актера" (actor) рядом с персонажем. Т.е. мы засылаем ей вопрос - "верни плз идентификатор нпц, который находится где-то рядом со мной, вот в таких-то координатах". После этого другой модуль, используя идентификатор нпц, будет с ним "разговаривать". Однако, в нужных координатах почему-то никто не находится.
Стоит посмотреть список npc, стоя в той же точке, что и Кора при покупке; командой nl ? Ы?
Добавлено спустя 6 минут 47 секунд:
Сама эта процедура вызывается в нескольких местах из /src/AI/CoreLogic.pm. Примерно вот так выглядит вызов:
Ага, кое-что проясняется. Вот нашел в архиве ОК 1.6.1, там наша процедура выглядела так:
Счас попробую найти вариант еще древнее...
* * *
В оригинальной Kore этой процедуры не было совсем, но npcs.txt был.
Посмотрим, как он обрабатываеццо...
* * *
Хм. В оригинале это было просто, как палка. Все обращения к нпц из конфига шли только по IDу. Существовал хэш %npcs_lut, в который просто добавлялись все встреченные НПЦ. Т.е., в конфиге было написано: "подойти к нпц c ID 48943209243" - и Кора просто открывала эту табличку, читала из нее название карты и координаты (встреченного ранее нпц), и шла к этой точке - т.е. с точностью до наоборот с тем, как работает ОК сейчас. Соответственно, если нужного IDа старая Кора не знала, она просто говорила Unknown ID (?), и выкидывала действие из очереди команд (?). Стало быть, надо рыть дальше, в юные годы OpenKore...
* * *
Ага, в старой ОК, то же самое. Просто сообщение об ошибке не такое, как сейчас:
Добавлено спустя 7 минут 36 секунд:
Т.е., поясняю, это сообщение об ошибке ОШИБОЧНОЕ.
В оригинале оно было так, еще раз:
Ошибка: или "Incomplete NPC info", или "ID not found in npcs.txt".
Ну так вот, мужики перестали искать координаты по IDу,
а и теперь ищут только ID по координатам, и но криво обрезали сообщение об ошибке.
Сейчас оно должно звучать так:
"Incomplete NPC info", и всё. IMHO, так.
Вот как это выглядит:
Но как это трактовать, я не знаю.Код: Выделить всё
# fill in a hash of NPC information either based on location ("map x y") sub getNPCInfo { my $id = shift; <----- id на входе? зачем? О_о что за id? my $return_hash = shift; <--- что за хэш, тоже непонятно. undef %{$return_hash}; my ($map, $x, $y) = split(/ +/, $id, 3); <-- это просто строка разрезается на 3 отдельных элемента - карта, х, у; $$return_hash{map} = $map; $$return_hash{pos}{x} = $x; $$return_hash{pos}{y} = $y; if (defined($$return_hash{map}) && defined($$return_hash{pos}{x}) && defined($$return_hash{pos}{y})) { $$return_hash{ok} = 1; } else { error T("Incomplete NPC info found in npcs.txt\n"); } }
Добавлено спустя 3 минуты 28 секунд:
Я так понимаю, эта процедура должна возвращать ссылку на элемент хэша, "актера" (actor) рядом с персонажем. Т.е. мы засылаем ей вопрос - "верни плз идентификатор нпц, который находится где-то рядом со мной, вот в таких-то координатах". После этого другой модуль, используя идентификатор нпц, будет с ним "разговаривать". Однако, в нужных координатах почему-то никто не находится.
Стоит посмотреть список npc, стоя в той же точке, что и Кора при покупке; командой nl ? Ы?
Добавлено спустя 6 минут 47 секунд:
Сама эта процедура вызывается в нескольких местах из /src/AI/CoreLogic.pm. Примерно вот так выглядит вызов:
Добавлено спустя 17 минут 18 секунд:Код: Выделить всё
if (!$config{storageAuto_useChatCommand}) { # Stop if the specified NPC is invalid $args->{npc} = {}; getNPCInfo($config{'storageAuto_npc'}, $args->{npc}); if (!defined($args->{npc}{ok})) { $args->{done} = 1; return; } ...
Ага, кое-что проясняется. Вот нашел в архиве ОК 1.6.1, там наша процедура выглядела так:
Разница в том, что можно было обратиться к НПЦ по IDу, т.к. еще не была введена строгость насчет обращения только с использованием координат.Код: Выделить всё
# fill in a hash of NPC information either base on ID or location ("map x y") sub getNPCInfo { my $id = shift; my $return_hash = shift; undef %{$return_hash}; if ($id =~ /^\d+$/) { if (%{$npcs_lut{$id}}) { $$return_hash{id} = $id; $$return_hash{map} = $npcs_lut{$id}{map}; $$return_hash{pos}{x} = $npcs_lut{$id}{pos}{x}; $$return_hash{pos}{y} = $npcs_lut{$id}{pos}{y}; } } else { my ($map, $x, $y) = split(/ +/, $id, 3); $$return_hash{map} = $map; $$return_hash{pos}{x} = $x; $$return_hash{pos}{y} = $y; } if (defined($$return_hash{map}) && defined($$return_hash{pos}{x}) && defined($$return_hash{pos}{y})) { $$return_hash{ok} = 1; } else { error "Incomplete NPC info or ID not found in npcs.txt\n"; } }
Счас попробую найти вариант еще древнее...
* * *
В оригинальной Kore этой процедуры не было совсем, но npcs.txt был.
Посмотрим, как он обрабатываеццо...
* * *
Хм. В оригинале это было просто, как палка. Все обращения к нпц из конфига шли только по IDу. Существовал хэш %npcs_lut, в который просто добавлялись все встреченные НПЦ. Т.е., в конфиге было написано: "подойти к нпц c ID 48943209243" - и Кора просто открывала эту табличку, читала из нее название карты и координаты (встреченного ранее нпц), и шла к этой точке - т.е. с точностью до наоборот с тем, как работает ОК сейчас. Соответственно, если нужного IDа старая Кора не знала, она просто говорила Unknown ID (?), и выкидывала действие из очереди команд (?). Стало быть, надо рыть дальше, в юные годы OpenKore...
* * *
Ага, в старой ОК, то же самое. Просто сообщение об ошибке не такое, как сейчас:
Ну я тогда хз.error "Incomplete NPC info or ID not found in npcs.txt\n";
Добавлено спустя 7 минут 36 секунд:
Т.е., поясняю, это сообщение об ошибке ОШИБОЧНОЕ.
В оригинале оно было так, еще раз:
Ошибка: или "Incomplete NPC info", или "ID not found in npcs.txt".
Ну так вот, мужики перестали искать координаты по IDу,
а и теперь ищут только ID по координатам, и но криво обрезали сообщение об ошибке.
Сейчас оно должно звучать так:
"Incomplete NPC info", и всё. IMHO, так.
- piroJOKE
- Модератор
- Сообщения: 8205
- Зарегистрирован: Сб ноя 04, 2006 2:20 am
- Сервер RO:: localhost
- Откуда: Molvania
amba
Предполагаю, что это нечто лаго-подобное. Ну, например... Подбежал, данные о нпц еще не успели приехать (?!?!?), кора смотрит: "хопа, а нпц-то нет?" - "ошибка, г-да товарищи!".
Хе-хе. А ну как паузу воткнуть перед вызовом getNPCInfo? Только там такая пауза нужна... не обычный sleep, а чтобы main loop крутился.
Предполагаю, что это нечто лаго-подобное. Ну, например... Подбежал, данные о нпц еще не успели приехать (?!?!?), кора смотрит: "хопа, а нпц-то нет?" - "ошибка, г-да товарищи!".
Хе-хе. А ну как паузу воткнуть перед вызовом getNPCInfo? Только там такая пауза нужна... не обычный sleep, а чтобы main loop крутился.