Страница 1 из 1

[help] Помогите до/написать плагин...

Добавлено: Сб сен 26, 2009 3:33 pm
Святой Инквизитор
Суть макроса в том что если перс стоит на одном месте более 15 секунд то желается команда....

Вот моя попытка(Перл не знаю вообще...)

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

package noStand;

use strict;
use Plugins;
use Globals;
use Utils;
use Log qw(message);

# Это правильно?
my $time = $config{'noStand_maxTime'};
my $wtd = $config{'noStand_WhatToDo'};

Plugins::register('noStand', 'Warping when standing too long on 1 spot', \&Unload); 

sub unload {
# чё писать в дужках ниже?
        Plugins::register();
}
# Насколько я понял функции вызываются сами по себе...
sub count{

# Это по ходу так в перле переменные оглашаются о_О
	my $x;
	my $y;
	my $x1;
	my $y1;

# проверка не вырублен ли плагин в конфише, так?
	return if (!$config{'noStand'});

# Я подумал раз плагин вызывается сам по себе то он вызывается много раз и цикл не нужен....?
# Тут проверка не сэйв мап ли это...
	if ($field{name} != $config{'saveMap'}) {
# Записываем позицию...
		$x = $char->{pos}{x};
		$y = $char->{pos}{y};
# по ходу в перле пауза именно такая
		sleep($time);
#  записываем новою позицию
		$x1 = $char->{pos}{x};
		$y1 = $char->{pos}{y};
# проверка совпадения ????
		if ($x eq $x1 && $y eq $y1) {
#  месаг в консоль и выполнение команды или я дурак?
			message "To long standing on 1 spot!";
			Commands::run($wtd);
		}
	}
}
Буду признателен за помощь...

Re: [help] Помогите до/написать плагин...

Добавлено: Сб сен 26, 2009 5:37 pm
EternalHarvest
Plugins::register ($plugin_name, [$plugin_description, [&unload_callback, [&reload_callback]]]);

Код вне функций выполняется один раз при загрузке плагина, функции только "объявляются". Для вызовов функций корой надо ставить хуки через Plugins::addHooks или Commands::register.

В макро или других плагинах можно посмотреть, как сделано.

Posted after 37 minutes 46 seconds:
Святой Инквизитор писал(а):

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

# Это правильно?
my $time = $config{'noStand_maxTime'};
my $wtd = $config{'noStand_WhatToDo'};[/quote]
Вроде в момент загрузки плагина конфиг (да и вообще всё остальное) ещё не загружен.

Re: [help] Помогите до/написать плагин...

Добавлено: Сб сен 26, 2009 8:42 pm
Святой Инквизитор
Ок.... спс.... буду сидеть думать над всем сказанным))) В скорости ждите новый вариант...)))


З.Ы.: У меня айпи сменился и разбанили на любимом серве так что решил вернутся)))

Добавлено спустя 2 часа 45 минут 20 секунд:
воть попітка номер 2

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

package noStand;

# Что тут не нужно? Знаю есть лишнее!
use strict;
use Plugins;
use Globals;
use Utils;
use Log qw(message);

# Я походу понял систему:
Plugins::register('noStand', 'Warping when standing too long on 1 spot', <тут слэш>&unload, <и тут>&reload);
my $hook = Plugins::addHook('Packet::map_changes', <тут тоже слэш>&map);
# "&" - это понятно, а что делает этот грёбаный "<слэш>" ??? (для общего развития :) )

# Тут вроде сообразил:
sub unload {
        Plugins::delHook($hook);
}

# А это я где-то увидел :Р
sub reload {
	&unload;
}

sub map {

	my $x;
	my $y;
	my $x1;
	my $y1;

#перенёс вовнутрь...
	my $time = $config{'noStand_maxTime'};
	my $warp = $config{'noStand_WhatToDo'};

	return if (!$config{'noStand'});

	if ($field{name} != $config{'saveMap'}) {
		$x = $char->{pos}{x};
		$y = $char->{pos}{y};
		sleep($time);
		$x1 = $char->{pos}{x};
		$y1 = $char->{pos}{y};
		if ($x eq $x1 && $y eq $y1) {
# А будет ли работать это вы так и не ответили )))
			message "===== To long standing on 1 spot! =====n";
			Commands::run($warp);
		}
	}
}

1;
Добавлено спустя 12 минут 28 секунд:
Я думаю что в теории оно должно при смене карты заново запускать функцию правильно? Это как рас то что мне нужно...

Re: [help] Помогите до/написать плагин...

Добавлено: Сб сен 26, 2009 10:32 pm
EternalHarvest
strict - надо всегда, остальное - импорты в текущий package (namespace этого плагина) ссылок на функции из соответсвующих модулей коры:
* Plugins - работа с плагинами
* Globals - глобальные переменные типа config, char
* Utils - разные функции
* Log qw(message) - функция message из модуля Log
В принципе, можно оставить только strict (так как все модули самой корой уже подгружены), но тогда ко всем переменным и функциям из них надо обращаться по полному имени: $Globals::char, Log::message (так как ссылок на них больше нет в текущем package). Разницы особой вроде нет, с импортами короче всякие вызовы и обращения к переменным.

Слэш - получение указателя. $, @, %, &, "->" - обратная операция.

В плагинах нельзя использовать sleep, потому что сама кора выполняется в этом же потоке и тоже затормозится. В таком случае можно, например, использовать хук "mainLoop_pre", который вызывается постоянно, и в нём проверять координаты, а если они не меняются - то проверять интервал времени с последнего их изменения.

"eq neq ..." - сравнение строк, "== != < > ..." - сравнение чисел.

Да, а хуки на событие "после обработки пакета" имеют вид "packet/$handler->[0]", $handler->[0] смотреть в таблице в начале Network::Receive.

perldoc.perl.org тоже рулит.

Re: [help] Помогите до/написать плагин...

Добавлено: Вс сен 27, 2009 1:41 am
Святой Инквизитор
ЫыыыЫЫЫЫыыыы не называйте диблом! но вот

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

package noStand;

use strict;
use Plugins;
use Globals;
use Utils;
use Log qw(message);

   my $x;
   my $y;
   my $x1;
   my $y1;
   my $thetime;

Plugins::register('noStand', 'Warping when standing too long on 1 spot', <тут слэш>&unload, <и тут>&reload);
my $hook = Plugins::addHook(
            ['Packet::map_changes', <тут тоже слэш>&map],
            ['Bot::mainLoop::pre', <и тут тоже слэш>&com]
);

sub unload {
        Plugins::delHook($hook);
}
sub reload {
   &unload;
}

sub map {
   $thetime = time;
   $x = $char->{pos}{x};
   $y = $char->{pos}{y};
}

sub com {

   my $time = $config{'noStand_maxTime'};
   my $wtd = $config{'noStand_WhatToDo'};

   return if (!$config{'noStand'});

   if ($field{name} != $config{'saveMap'}) {
      if (timeOut($thetime, $time)){
         $x1 = $char->{pos}{x};
         $y1 = $char->{pos}{y};
         if ($x == $x1 && $y == $y1) {
            message "===== To long standing on 1 spot! =====<тут слэш>n";
            Commands::run($wtd);
         }
      }
   }
}

1;
timeOut - не знаю откуда это но люди им вроде пользуются о_О

Получаем фиксацию точки после варпа и её проверку через некоторый период времени... Вот только в чём проверяется время минутах секундах часах я не знаю... (Пусть это будут секунды пожалуйста!!!)

Re: [help] Помогите до/написать плагин...

Добавлено: Вт окт 06, 2009 11:53 pm
kLabMouse
В коре есть фигнюлина которая генерирует документацию.
Скупая дока, но хоть что-то по АПИ.

timeOut Проверяет вышло ли время. ТЕ в хуке на mainLoop_pre проеверятся вышло ли время, если да то выполняем нашу функцию, и снимаемся с регистрации хука на mainLoop_pre.
Сам же основной хук должен делать инициализацию таймаута, регистрицию хука на mainLoop_pre(динамическую), и несколько нужных проверок.

Re: [help] Помогите до/написать плагин...

Добавлено: Ср окт 07, 2009 12:54 am
4epT
а я почему-то проверку таймаута и статусов вешал на хук "AI_pre", что грамотнее?
что значит "динамическая регистрация хука"? можно пример

Re: [help] Помогите до/написать плагин...

Добавлено: Ср окт 07, 2009 2:27 am
kLabMouse
4epT
Вызывать
Plugins::addHook
Можно не только из основного тела.

Re: [help] Помогите до/написать плагин...

Добавлено: Пн окт 12, 2009 3:10 pm
Святой Инквизитор
Мне не нужны такие дебри.... Я написал как должно быть:
1) Был варп? Да! Записали точку.
2) Пауза n секунд. Проверили точку. Та же? Да! Выполняем команду!
Вот только то что я написал не работает а мне оч нужно что бы работало. помогите найти ошибку... оч прошу я перле полный 0...

Re: [help] Помогите до/написать плагин...

Добавлено: Пт окт 30, 2009 5:12 pm
Святой Инквизитор
Народ тема актуальна.
Это я написал в теори должно работать но не работает, и я не могу найти ошибку. Помогите пож очеь нужно бот ужасно тупит из-за постоянных варпов.

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

package noStand;

use strict;
use Plugins;
use Globals;
use Utils;
use Log qw(message);

   my $x;
   my $y;
   my $x1;
   my $y1;
   my $thetime;

Plugins::register('noStand', 'Warping when standing too long on 1 spot', \&unload, \&reload);
my $hook = Plugins::addHooks(
            ['Packet::map_changes', \&map],
            ['Bot::mainLoop::pre', \&com]
);

sub unload {
        Plugins::delHooks($hook);
}
sub reload {
   &unload;
}

sub map {
   $thetime = time;
   $x = $char->{pos}{x};
   $y = $char->{pos}{y};
}

sub com {

   my $time = $config{'noStand_maxTime'};
   my $wtd = $config{'noStand_WhatToDo'};

   return if (!$config{'noStand'});

   if ($field{name} != $config{'saveMap'}) {
      if (main::timeOut($thetime, $time)){
	 $x1 = $char->{pos}{x};
	 $y1 = $char->{pos}{y};
         if ($x == $x1 && $y == $y1) {
            message "===== To long standing on 1 spot! =====\n";
            Commands::run($wtd);
         }
      }
   }
}

1;