Страница 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;