[решено] Как проверить LOS в макросах

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

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

Правила форума
В форуме макросы "Макросы" разрешено только задавать вопросы по уже существующим макросам и просить помощь по недоработанным своим. При этом таким считается тот макрос который готов не менее чем на 2/3.
Если вы хотите попросить участников сообщества написать вам макрос, это можно сделать в разделе "сервис".
Аватара пользователя
4epT
macro-маньячина
Сообщения: 2792
Зарегистрирован: Чт дек 21, 2006 1:23 pm
Сервер RO:: 4game
Discord: ya4ept#8494
Контактная информация:

Re: Как проверить LOS в макросах.

Сообщение 4epT »

а ты найди их в коде коры и ниже пропиши что-то типо:

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

message "myPos = $myPos, pos = $pos\n";
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: Как проверить LOS в макросах.

Сообщение EternalHarvest »

Макро-плагин, похоже, некорректно обрабатывает скобки внутри структур вида @(...), а конкретно - в eval.

plugins/macro/Parser.pm:

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

+use Text::Balanced qw/extract_bracketed/;

sub parseKw {
-	my @pair = $_[0] =~ /@($macroKeywords)s*(s*(.*?)s*)/i;

+	my @full = $_[0] =~ /@($macroKeywords)s*((s*(.*?)s*).*)$/i;
+	my @pair = ($full[0]);
+	my ($bracketed) = extract_bracketed ($full[1], '()');
+	return unless $bracketed;
+	push @pair, substr ($bracketed, 1, -1);
	
	return unless @pair;
	if ($pair[0] eq 'arg') {
		return $_[0] =~ /@(arg)s*(s*(".*?",s*d+)s*)/
	} elsif ($pair[0] eq 'random') {
		return $_[0] =~ /@(random)s*(s*(".*?")s*)/
	}
	while ($pair[1] =~ /@($macroKeywords)s*(/) {
-		@pair = $pair[1] =~ /@($macroKeywords)s*((.*)/

+		@pair = parseKw ($pair[1])
	}
	return @pair
}
macros.txt:

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

macro testlos {
	$x1 = ...
	$y1 = ...
	$x2 = ...
	$y2 = ...
	log @eval (Misc::checkLineSnipable ({x => $x1, y => $y1}, {x => $x2, y => $y2}))
}
Теперь работает :twisted:

Добавлено спустя 3 минуты 54 секунды:
P.S. "@pair = $pair[1] =~ /\@($macroKeywords)\s*\((.*)/" - вообще сильная жесть :D
Последний раз редактировалось EternalHarvest Пн дек 08, 2008 9:47 pm, всего редактировалось 1 раз.
Аватара пользователя
Святой Инквизитор
Грамотный
Сообщения: 455
Зарегистрирован: Вт окт 28, 2008 3:57 am
Сервер RO:: DarkRO
Откуда: Далёкая и тёмная страна Украина
Контактная информация:

Re: Как проверить LOS в макросах.

Сообщение Святой Инквизитор »

умирает на этой строчке:

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

Died at this line:
  	my @pair = ($full[0]);
* 	my ($bracketed) = extract_bracketed ($full[1], '()');
  	return unless $bracketed;
Вот полный лог ошибки:

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

OpenKore version what-will-become-2.0.6 (SVN version)
@ai_seq = macro
Network state = 5
Network handler = Network::DirectConnection
SVN revision: unknown
Loaded plugins:
  plugins/alertsound.pl (alertsound)
  plugins/craft.pl (craft)
  plugins/handsFree.pl (handsFree)
  plugins/likehuman.pl (likehuman)
  plugins/macro.pl (macro)

Error message:
Undefined subroutine &Macro::Parser::extract_bracketed called at plugins/Macro/Parser.pm line 135.

Stack trace:
Undefined subroutine &Macro::Parser::extract_bracketed called at plugins/Macro/Parser.pm line 135.
 at plugins/Macro/Parser.pm line 135
	Macro::Parser::parseKw('c @autolootitem 607') called at plugins/Macro/Parser.pm line 184
	Macro::Parser::parseCmd('c @autolootitem 607') called at plugins/Macro/Script.pm line 344
	Macro::Script::next('Macro::Script=HASH(0x2d986a8)') called at plugins/Macro/Utilities.pm line 340
	Macro::Utilities::callMacro() called at plugins/Macro/Automacro.pm line 482
	Macro::Automacro::automacroCheck('AI_pre', 'undef', 'undef') called at src/Plugins.pm line 440
	Plugins::callHook('AI_pre') called at src/AI/CoreLogic.pm line 112
	AI::CoreLogic::iterate() called at src/functions.pl line 593
	main::mainLoop_initialized() called at src/functions.pl line 70
	main::mainLoop() called at src/Interface.pm line 75
	Interface::mainLoop('Interface::Console::Win32=HASH(0x21b1f18)') called at openkore.pl line 96
	main::__start() called at start.pl line 119

Died at this line:
  	my @pair = ($full[0]);
* 	my ($bracketed) = extract_bracketed ($full[1], '()');
  	return unless $bracketed;
Вот то что я сделал в plugins/macro/Parser.pm:

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

sub parseKw {

	my @full = $_[0] =~ /@($macroKeywords)s*((s*(.*?)s*).*$)/i;
	my @pair = ($full[0]);
	my ($bracketed) = extract_bracketed ($full[1], '()');
	return unless $bracketed;
	push @pair, substr ($bracketed, 1, -1);

	return unless @pair;
	if ($pair[0] eq 'arg') {
		return $_[0] =~ /\@(arg)\s*\(\s*(".*?",\s*\d+)\s*\)/
	} elsif ($pair[0] eq 'random') {
		return $_[0] =~ /\@(random)\s*\(\s*(".*?")\s*\)/
	}
	while ($pair[1] =~ /\@($macroKeywords)\s*\(/) {
		@pair = parseKw ($pair[1])
	}
	return @pair
}
Изображение Изображение
Настрою конфиг, напишу макрос - не дорого.
Стучать в асю (есть в профиле).
Аватара пользователя
4epT
macro-маньячина
Сообщения: 2792
Зарегистрирован: Чт дек 21, 2006 1:23 pm
Сервер RO:: 4game
Discord: ya4ept#8494
Контактная информация:

Re: Как проверить LOS в макросах.

Сообщение 4epT »

EternalHarvest, посмотри про обработку скобок тут, может что придумаешь
нужно чтобы корректно обрабатывалось 2 варианта скобок, рассуждения пиши там
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: Как проверить LOS в макросах.

Сообщение EternalHarvest »

Святой Инквизитор, установи модуль перла Text::Balanced.
Или же такой вариант (работает без изменения макро-плагина):

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

@eval (Misc::checkLineSnipable {x => $x1, y => $y1}, {x => $x2, y => $y2})
4epT, угу.
Вы не можете отправить следующее сообщение сразу после предыдущего. Пожалуйста, попробуйте чуть позже.
Oo
Аватара пользователя
Святой Инквизитор
Грамотный
Сообщения: 455
Зарегистрирован: Вт окт 28, 2008 3:57 am
Сервер RO:: DarkRO
Откуда: Далёкая и тёмная страна Украина
Контактная информация:

Re: Как проверить LOS в макросах.

Сообщение Святой Инквизитор »

ВНИМАНИЕ ПРОБЛЕМА РЕШЕНА:

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

@eval (Misc::checkLineSnipable ({x => $myx, y => $myy}, {x => $mobx, y => $moby}))
EternalHarvest СПАСИБО ОГРОМНОЕ!!!

Добавлено спустя 28 минут 51 секунду:
Покажу своё творение..))))

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

automacro yggbeat1 {

	map prt_maze03
	notMonster Baphomet Jr
	run-once 1
	priority 5
	call beat1
}

macro beat1 {
		pause @rand(1,2)
		do free sl 79 ~ 10
		pause 1
		do c @warp prt_maze03
		release yggbeat1
		release yggbeat2
}

automacro yggbeat2 {

	map prt_maze03
	monster Baphomet Jr
	run-once 1
	priority 5
	call beat2
}

macro beat2  {
		pause 1
		$mobx = @arg ("$.lastMonsterPos", 1)
		$moby = @arg ("$.lastMonsterPos", 2)
		$myx = @eval($::char->{pos}{x})
		$myy = @eval($::char->{pos}{y})
		$bool = @eval (Misc::checkLineSnipable ({x => $myx, y => $myy}, {x => $mobx, y => $moby}))

		if ($bool != 1) goto nextstep
		do sl 79 $mobx $moby 10
		pause 1
		goto warp
:nextstep
		log NO LOS!
		do free sl 79 ~ 10
		pause 1
:warp
		do c @warp prt_maze03
		release yggbeat1
		release yggbeat2
}
Изображение Изображение
Настрою конфиг, напишу макрос - не дорого.
Стучать в асю (есть в профиле).
Ответить