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

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

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

Святой Инквизитор
Грамотный
Сообщения: 235
Зарегистрирован: Вт сен 07, 2010 2:24 pm
Сервер RO:: Никакого
Discord: Mortimal#5416
Откуда: от верблюда
Контактная информация:

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

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

Суть макроса в том что если перс стоит на одном месте более 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);
		}
	}
}
Буду признателен за помощь...
Изображение
Ну не работает у тебя бот.... и чё теперь надо всем про это рассказать что ли?
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

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

Сообщение 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]
Вроде в момент загрузки плагина конфиг (да и вообще всё остальное) ещё не загружен.
Святой Инквизитор
Грамотный
Сообщения: 235
Зарегистрирован: Вт сен 07, 2010 2:24 pm
Сервер RO:: Никакого
Discord: Mortimal#5416
Откуда: от верблюда
Контактная информация:

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

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

Ок.... спс.... буду сидеть думать над всем сказанным))) В скорости ждите новый вариант...)))


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

Добавлено спустя 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 секунд:
Я думаю что в теории оно должно при смене карты заново запускать функцию правильно? Это как рас то что мне нужно...
Изображение
Ну не работает у тебя бот.... и чё теперь надо всем про это рассказать что ли?
EternalHarvest
Разработчик
Сообщения: 819
Зарегистрирован: Пн окт 27, 2008 9:49 pm

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

Сообщение 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 тоже рулит.
Святой Инквизитор
Грамотный
Сообщения: 235
Зарегистрирован: Вт сен 07, 2010 2:24 pm
Сервер RO:: Никакого
Discord: Mortimal#5416
Откуда: от верблюда
Контактная информация:

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

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

ЫыыыЫЫЫЫыыыы не называйте диблом! но вот

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

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 - не знаю откуда это но люди им вроде пользуются о_О

Получаем фиксацию точки после варпа и её проверку через некоторый период времени... Вот только в чём проверяется время минутах секундах часах я не знаю... (Пусть это будут секунды пожалуйста!!!)
Изображение
Ну не работает у тебя бот.... и чё теперь надо всем про это рассказать что ли?
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

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

Сообщение kLabMouse »

В коре есть фигнюлина которая генерирует документацию.
Скупая дока, но хоть что-то по АПИ.

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

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

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

а я почему-то проверку таймаута и статусов вешал на хук "AI_pre", что грамотнее?
что значит "динамическая регистрация хука"? можно пример
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

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

Сообщение kLabMouse »

4epT
Вызывать
Plugins::addHook
Можно не только из основного тела.
Святой Инквизитор
Грамотный
Сообщения: 235
Зарегистрирован: Вт сен 07, 2010 2:24 pm
Сервер RO:: Никакого
Discord: Mortimal#5416
Откуда: от верблюда
Контактная информация:

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

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

Мне не нужны такие дебри.... Я написал как должно быть:
1) Был варп? Да! Записали точку.
2) Пауза n секунд. Проверили точку. Та же? Да! Выполняем команду!
Вот только то что я написал не работает а мне оч нужно что бы работало. помогите найти ошибку... оч прошу я перле полный 0...
Изображение
Ну не работает у тебя бот.... и чё теперь надо всем про это рассказать что ли?
Святой Инквизитор
Грамотный
Сообщения: 235
Зарегистрирован: Вт сен 07, 2010 2:24 pm
Сервер RO:: Никакого
Discord: Mortimal#5416
Откуда: от верблюда
Контактная информация:

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

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

Народ тема актуальна.
Это я написал в теори должно работать но не работает, и я не могу найти ошибку. Помогите пож очеь нужно бот ужасно тупит из-за постоянных варпов.

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

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;
Изображение
Ну не работает у тебя бот.... и чё теперь надо всем про это рассказать что ли?
Ответить