handsFree - свободные клетки (для портала итд)

Дополнения к OpenKore, расширяющиее её функциональность, называются плагинами.

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

EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

handsFree - свободные клетки (для портала итд)

Сообщение EternalHarvest »

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

# free выполняет команду, подставляя вместо ~ случайные координаты свободной клетки вокруг бота
do free sl 27 ~
pause 1
do warp 1
# freer подставляет последние использованные координаты
do freer move ~
handsFree.pl:

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

package handsFree;
use strict;

#########################################################################
# handsFree OpenKore plugin v1.0 by EternalHarvest
#########################################################################

use Globals;
use Log qw(message);
use Commands;

use constant DEFAULT_SPREAD => 7;

my $spread = defined $::config{'handsFree_spread'} ? $::config{'handsFree_spread'} : DEFAULT_SPREAD;

Plugins::register ('handsFree', 'Find free cell', \&unload);
my $cmds = Commands::register (
["free", "Perform command at free cell", \&handsFree],
["freer", "Perform command on last free cell", \&handsFreeRepeat]
);
sub unload {
Commands::unregister ($cmds);
}

my ($lastX, $lastY);

sub handsFreeAction {
my (@reach, @dead, $x, $y, $a, $b, $m, $n);
my $s;
my $count = ($spread*2+1) ** 2 - 1;

for ($x = $char->{pos}{x}-$spread; $x <= $char->{pos}{x}+$spread; $x++) {
for ($y = $char->{pos}{y}-$spread; $y <= $char->{pos}{y}+$spread; $y++) {
$count -= !($reach[$x][$y] = $field->isWalkable ($x, $y));
}
}

for ($m = -1; $m < 2; $m += 2) {
for ($n = -1; $n < 2; $n += 2) {
for ($x = 0; $x <= $spread; $x++) {
for ($y = 0; $y <= $spread; $y++) {
next if $dead[$char->{pos}{x} + $x*$m][$char->{pos}{y} + $y*$n] || $reach[$char->{pos}{x} + $x*$m][$char->{pos}{y} + $y*$n];
for ($a = $x; $a <= $spread; $a++) {
for ($b = $y; $b <= $spread; $b++) {
$count -= $reach[$char->{pos}{x} + $a*$m][$char->{pos}{y} + $b*$n];
$reach[$char->{pos}{x} + $a*$m][$char->{pos}{y} + $b*$n] = 0;
$dead[$char->{pos}{x} + $a*$m][$char->{pos}{y} + $b*$n] = 1;
}
}
}
}
}
}

foreach my $actor (
@{$monstersList->getItems ()},
@{$playersList->getItems ()},
@{$petsList->getItems ()},
@{$npcsList->getItems ()}
) {
$count -= $reach[$actor->{pos}{x}][$actor->{pos}{y}];
$reach[$actor->{pos}{x}][$actor->{pos}{y}] = 0;
}

$reach[$char->{pos}{x}][$char->{pos}{y}] = 0;

if ($count > 0) {
until ($reach[$x][$y]) {
$x = $char->{pos}{x} + int (rand ($spread*2 + 1)) - $spread;
$y = $char->{pos}{y} + int (rand ($spread*2 + 1)) - $spread;
}
} else {
$x = 0; $y = 0;
message "handsFree: no available cells!\n";
}

$lastX = $x; $lastY = $y;
}

sub handsFree {
shift;
my $params = shift;

handsFreeAction ();

if ($params && $lastX) {
$params =~ s/~/$lastX $lastY/;
Commands::run ($params);
}
}

sub handsFreeRepeat {
shift;
my $params = shift;

if ($params && $lastX) {
$params =~ s/~/$lastX $lastY/;
Commands::run ($params);
}
}

1;
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Re: handsFree - свободные клетки (для портала итд)

Сообщение kLabMouse »

:)
Неплохо.
Но курс начинающего Плагинописателя здан на 3-ечку.
Нихарашо делать кучу вложеных цыклов. Ибо любой язык програмирования, на любой платформе таким боком тормознёш по полной.

А так, браво!!! :Bravo:
Аватара пользователя
Cooot
Грамотный
Сообщения: 306
Зарегистрирован: Пт апр 25, 2008 8:02 am

Re: handsFree - свободные клетки (для портала итд)

Сообщение Cooot »

Спасибо за плагин, думаю он может оказаться очень полезен.
Клетка выбирается одна из 8 смежных или и более дальние?
И что будет, если занято все ну прямо битком, как утром в трамвае?
И еще хотелось бы подробнее про вторую команду узнать. Что будет если просто написать:

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

do freer move ~
не используя до этого первую команду?
Изображение
Аватара пользователя
Святой Инквизитор
Грамотный
Сообщения: 455
Зарегистрирован: Вт окт 28, 2008 3:57 am
Сервер RO:: DarkRO
Откуда: Далёкая и тёмная страна Украина
Контактная информация:

Re: handsFree - свободные клетки (для портала итд)

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

Ух всё работает на отличненько автору ОГРОМНОЕ СПАСИБО!
Изображение Изображение
Настрою конфиг, напишу макрос - не дорого.
Стучать в асю (есть в профиле).
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

Re: handsFree - свободные клетки (для портала итд)

Сообщение EternalHarvest »

kLabMouse писал(а)::)
Нихарашо делать кучу вложеных цыклов. Ибо любой язык програмирования, на любой платформе таким боком тормознёш по полной.
В курсе... Но всё работает и функция на практике вызывается нечасто.
Cooot писал(а):Клетка выбирается одна из 8 смежных или и более дальние?
По умолчанию - квадрат "радиусом" 7 клеток. Можно задать в конфиге параметром handsFree_spread.
Cooot писал(а):И что будет, если занято все ну прямо битком, как утром в трамвае?
Ничего не будет, только сообщение в консоль что всё занято.
Cooot писал(а):И еще хотелось бы подробнее про вторую команду узнать. Что будет если просто написать:

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

do freer move ~
не используя до этого первую команду?
Ничего полезного не будет. Первая команда - "генератор" координат. Вторая нужна при для их повторного использования (зайти в открытый портал, например).
Аватара пользователя
Святой Инквизитор
Грамотный
Сообщения: 455
Зарегистрирован: Вт окт 28, 2008 3:57 am
Сервер RO:: DarkRO
Откуда: Далёкая и тёмная страна Украина
Контактная информация:

Re: handsFree - свободные клетки (для портала итд)

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

Нашёл одну не доработку... оно не проверяет LOS к той точке из-за чего иногда скилы туда не достают. Возможно ли туда ка нибудь вмонтировать эту проверку?

Добавлено спустя 12 минут 42 секунды:
А вот вам и первая ошибка:

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

Stack trace:
Modification of non-creatable array value attempted, subscript -2 at K:/Downloads/??????/BOT (Yggdrasill berry) Priest/plugins/handsFree.pl line 34.
 at K:/Downloads/??????/BOT (Yggdrasill berry) Priest/plugins/handsFree.pl line 34
	handsFree::handsFreeAction() called at K:/Downloads/??????/BOT (Yggdrasill berry) Priest/plugins/handsFree.pl line 84
	handsFree::handsFree('free', 'sl 79 ~ 10') called at src/Commands.pm line 252
	Commands::run('free sl 79 ~ 10') called at plugins/Macro/Utilities.pm line 316
	Macro::Utilities::processCmd('free sl 79 ~ 10') called at plugins/Macro/Utilities.pm line 347
	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(0x2272140)') called at openkore.pl line 96
	main::__start() called at start.pl line 119

Died at this line:
        for ($y = $char->{pos}{y}-$spread; $y <= $char->{pos}{y}+$spread; $y++) {
*          $count -= !($reach[$x][$y] = $field->isWalkable ($x, $y));
        }
Изображение Изображение
Настрою конфиг, напишу макрос - не дорого.
Стучать в асю (есть в профиле).
Ответить