talknpc макрос

Всё, что касается макро-плагина.

Модератор: 4epT

Правила форума
В форуме макросы "Макросы" разрешено только задавать вопросы по уже существующим макросам и просить помощь по недоработанным своим. При этом таким считается тот макрос который готов не менее чем на 2/3.
Если вы хотите попросить участников сообщества написать вам макрос, это можно сделать в разделе "сервис".
Аватара пользователя
ProTuningBot
Энтузиаст
Сообщения: 108
Зарегистрирован: Пн авг 18, 2008 2:03 pm

talknpc макрос

Сообщение ProTuningBot »

Всем доброго времени суток. Снова надолго завязывал с ОК и игрой, но теперь хочу снова повозиться.
Абсолютно точно помню, что макрос talknpс, что раньше писал работал, а теперь у меня с ним проблемы. Пробовал переписать, сидел пол ночи, но так и не смог справиться, вроде бы с элементарной вещью.

Раньше нужны были const-ы (c), end-ы (n) и прочее прочее, а теперь их уже я так понял не надо, ОК автоматом продолжает разговор и т.д.

Код: Выделить всё

macro talk {
do talknpc "x" "y" "ID"
#вот тут проблема, он не хочет давать респонс и тупо ждет чего-то. И происходит таймаут на мап сервере и дисконнект. Тут 2 вопроса, почему не делает респонс и 2-й - почему происходит таймаут на мапсервере и дисконнект, если он ничего не отвечает в течении примерно 3-4 секунд? Самое забавное, что если я напишу из консоли 'talk resp 0' то все в порядке и он дальше отвечает, делает респонсы и выполняет макрос. А без моего вмешательства стопорится.
do const
do talk resp 0
do const
do talk resp 1
do const
do talk resp 2
do n
}
Или такой вариант, тоже стопорится на первом респонсе:

Код: Выделить всё

macro talk {
do talknpc "x" "y" "ID" r0 r1 r2
}
Чувствую себя полным нубом, ведь раньше для меня такое было как семечки... но хочу снова понять и поэтому прошу помощи.

P.S. Кора свеже-проапдейтенная, не ищите в этом причин. Вообще как ни странно кажется раньше кора была более стабильная, может функционал был меньше, но и багов было также меньше и проблем. Может быть мне так только кажется.
diazzz
Энтузиаст
Сообщения: 133
Зарегистрирован: Чт июл 16, 2009 10:57 am
Сервер RO:: MOTR

Re: talknpc макрос

Сообщение diazzz »

do talknpc "x" "y" "ID" r0 r1 r2
ID лишнее, я обычно его не пишу и все норм
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: talknpc макрос

Сообщение EternalHarvest »

В talknpc не указывается никаких ID: http://openkore.com/index.php/talknpc
Аватара пользователя
ProTuningBot
Энтузиаст
Сообщения: 108
Зарегистрирован: Пн авг 18, 2008 2:03 pm

Re: talknpc макрос

Сообщение ProTuningBot »

Вот черт... так я жестко затупил, сам охреневаю. Разобрался во всем. Спасибо, ребят. Я вот этот <npc talk codes> принял за ID Нпсишника. Соотв. вот он и сторопирлся, он думал, что этот ID это talk code. Такая элементарная штука. Чуял я, все так и оказалось просто. Не в в том направлении копал столько времени, искал причину в более сложных вещах. Вот оно как бывает =)


Для тех кто наткнется на похожую проблему:

Верный макрос должен выглядеть так:

macro "Ваше название макроса" {
do talknpc <координата x> <координата y> <talk codes>
}

List of known NPC talk codes. Code Description
c Continue talking to the NPC. This is the same as pressing the Next buttom.
r(<response #>) Send a response to the NPC. The response number is the index of the responses in the displayed response list . This is the same as selecting a response when you talk to an NPC.
w(<seconds>) Wait for the specified number of seconds before continuing to talk to the NPC.
d(<number>) Send a number to the NPC. Use this if the NPC asks you to enter an amount.
t=(<string>) Send a text to the NPC. Use this if the NPC asks you to enter some text.
s Go to sell list. This is the same as pressing the sell button when you talk to a buy/sell NPC.
b Go to the store list. This is the same as pressing the buy button when you talk to a buy/sell NPC.
b(<store item #>),(<amount>) Buy an item from the NPC. See similar buy. Note that the amount is not optional.
n Ends and cancel conversation with the NPC. This is the same as pressing the close or cancel button when talking to an NPC.
e Wait until the NPC says "Done talking". Use this after the s or b talk code when talking to a buy/sell NPC.
a=(<string>) Run a console command.
x Initiate NPC conversation.

теги talknpc macro problem макро проблема с нпц разговором

Добавлено спустя 33 минуты 7 секунд:
Но осталась еще кое-какая проблемка косвенно связанная с этим. Чтобы новую тему не открывать давайте здесь обсудим. А именно дисконнект при разгороре с npc. Если не даешь респонс то буквально через 3-5 секунд следует вылет. Посмотрите прикрепленное изображение, все сразу станет ясно.

Изображение

С чем это связано? Как это исправить?

Добавлено спустя 1 час 14 минут 12 секунд:
Поговорили с 4ертом и пришли к выводу, что talknpc не пригодна к не полному разговору. Для обычного разговора используййте команду talk. Если разговор не полный, а вы используете talknpc, то скорее всего кора пытается отослать нулевой ответ или что либо еще... сервер этого не понимает и выдаёт ошибку (дисконнектит как вариант в данном случае).
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: talknpc макрос

Сообщение EternalHarvest »

talknpc просто ждёт ответа от NPC, и посылает отмену диалога если не дожидается. Попробуй в конце последовательности вставить "e".

Код: Выделить всё

		} elsif ( $step =~ /e/i ) {
			# ? Pretend like the conversation was stopped by the NPC?
Аватара пользователя
ProTuningBot
Энтузиаст
Сообщения: 108
Зарегистрирован: Пн авг 18, 2008 2:03 pm

Re: talknpc макрос

Сообщение ProTuningBot »

просто ждёт ответа от NPC, и посылает отмену диалога если не дожидается.
Да, но почему тогда ОК дисконнектается?
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: talknpc макрос

Сообщение EternalHarvest »

sendTalkCancel:

Код: Выделить всё

	} elsif (timeOut($self->{time}, $timeResponse)) {
		# If NPC does not respond before timing out, then by default, it's
		# a failure.
		$messageSender->sendTalkCancel($self->{ID});
Аватара пользователя
ProTuningBot
Энтузиаст
Сообщения: 108
Зарегистрирован: Пн авг 18, 2008 2:03 pm

Re: talknpc макрос

Сообщение ProTuningBot »

Это все конечно здорово. Спасибо, EternalHarvest. Но почему кора дисконектится при вышеизложенных фактах, сможете объяснить? =)
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: talknpc макрос

Сообщение EternalHarvest »

Но почему кора дисконектится при вышеизложенных фактах, сможете объяснить?
В состоянии выбора из предложенных NPC вариантов для отмены диалога используется другой пакет, это прекрасно видно в Task::TalkNPC::cancelTalk.

Ответы на остальные вопросы в духе "что конкретно происходит при обработке разных вариантов заданного диалога" в src/Task/TalkNPC.pm, он не такой уж большой и особого знания Perl не требует для понимания логики работы.
Аватара пользователя
ProTuningBot
Энтузиаст
Сообщения: 108
Зарегистрирован: Пн авг 18, 2008 2:03 pm

Re: talknpc макрос

Сообщение ProTuningBot »

EternalHarvest, спасибо большое за ответы и объяснение, хоть и не подробное. Порылся в TalkNPC.pm, нашел некоторые причины, но не нашел ничего конкретно про дисконнект. Таймауты да...

Код: Выделить всё

} elsif (timeOut($self->{time}, $timeResponse)) {
		# If NPC does not respond before timing out, then by default, it's
		# a failure.
		$messageSender->sendTalkCancel($self->{ID});
		$self->setError(NPC_NO_RESPONSE, T("The NPC did not respond."));
но все равно немного не понимаю как это связывается с дисконнектом. Неужели так трудно подробно объяснить, если вы понимаете?

Конкретно говорится про дисконнект только в одном случае, но он не подпадает под описанный выше обычный разговор с нпц. Вот:

Код: Выделить всё

} elsif ($self->{mapChanged} || ($ai_v{npc_talk}{talk} eq 'close' && $self->{steps}[0] !~ /x/i)) {
		# Cancel conversation only if NPC is still around; otherwise
		# we could get disconnected.
У меня есть одно простое логичное объяснение. Раз ОК принимает это за failure или за ошибку, поэтому он и дисконектится. Верно? Но я не вижу этой логики именно в TalkNPC.pm. Возможно есть еще где-то код, связанный с этим.
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: talknpc макрос

Сообщение EternalHarvest »

Таймаут срабатывает, когда заданная последовательность закончилась, а диалог ещё не завершён.
$messageSender->sendTalkCancel посылает пакет.
Видимо, сервер при получении этого пакета в такой момент, когда его вообще не может быть, выкидывает.

Возможно на этом месте надо заменить это на $self->cancelTalk, в котором выбирается корректный пакет для отмены диалога с NPC (только что будет, если таймаут сработает сразу после выбора из предложенных вариантов?).
gyrdin
Новичок
Сообщения: 10
Зарегистрирован: Вт авг 14, 2007 12:31 pm
Контактная информация:

Re: talknpc макрос

Сообщение gyrdin »

Принялся за написание подобного макроса, который бы брал берри из гильдовой кафры в обычную. Наброски кода:

Код: Выделить всё

Macro Berry {
	do log getting berries
	do talknpc 132 130 c r4 n
		getAuto Yggdrasil Berry{
		MinAmount 0
		MaxAmount 8
		passive 0
		dcOnEmpty 1
		}
	do n
	do log got berries
	do talknpc 132 130 c r3 n
		storage Yggdrasil berry{
		MinAmount 0
		MaxAmount 30000
		passive 0
		dcOnEmpty 0
		}
        do n
	do log stored berries
	}
После завершения макроса надо его или как-то отнести в начало (чтобы повторять до тех пор, пока не останется ничего в гильд кафре и бот не дисконектнится), или рестартить. Какую команду можно для этого использовать?

P.S.: если найдёте какие-либо ошибки в макросе, буду очень признателен.
учусь-учусь
Ответить