WoE варпер / и расширенная команда pl

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

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

Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Так хочеццо ж малой кровью. :crazy:
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

гы делаем такую процедуру и команда pl дополняется новыми возможностями
pl выводит список игроков рядом + их кол-во
pl g выводит список игроков твоей гильдии рядом + их кол-во + общее кол-во игроков рядом
pl p выводит список игроков твоей пати рядом + их кол-во + общее кол-во игроков рядом
pl имя или bindID выводит инфо о плеере

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

sub cmdPlayerList {
	my (undef, $args) = @_;
	my $msg;

	if ($args eq "g") {
	my $maxpl;
	my $maxplg=0;
	$msg =  T("-----------Player List-----------\n" .
		"#    Name                                Sex   Lv  Job         Dist  Coord\n");
	foreach my $player (@{$playersList->getItems()}) {
		my ($name, $dist, $pos);
		$name = $player->name;

		if ($char->{guild}{name} eq ($player->{guild}{name})) {

		if ($player->{guild} && %{$player->{guild}}) {
			$name .= " [$player->{guild}{name}]";
		}
		$dist = distance($char->{pos_to}, $player->{pos_to});
		$dist = sprintf("%.1f", $dist) if (index ($dist, '.') > -1);
		$pos = '(' . $player->{pos_to}{x} . ', ' . $player->{pos_to}{y} . ')';
		
		$maxpl = @{$playersList->getItems()};
		$maxplg = $maxplg+1;

		$msg .= swrite(
			"@<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<< @<< @<<<<<<<<<< @<<<< @<<<<<<<<<<",
			[$player->{binID}, $name, $sex_lut{$player->{sex}}, $player->{lv}, $player->job, $dist, $pos]);
	}
}
	$msg .= "Total guild players $maxplg \n";
	$msg .= "Total players $maxpl \n";
	$msg .= "---------------------------------\n";
	message($msg, "list");
	return;
}

	if ($args eq "p") {
	my $maxpl;
	my $maxplp=0;
	$msg =  T("-----------Player List-----------\n" .
		"#    Name                                Sex   Lv  Job         Dist  Coord\n");
	foreach my $player (@{$playersList->getItems()}) {
		my ($name, $dist, $pos);
		$name = $player->name;

		if ($char->{party}{name} eq ($player->{party}{name})) {

		if ($player->{guild} && %{$player->{guild}}) {
			$name .= " [$player->{guild}{name}]";
		}
		$dist = distance($char->{pos_to}, $player->{pos_to});
		$dist = sprintf("%.1f", $dist) if (index ($dist, '.') > -1);
		$pos = '(' . $player->{pos_to}{x} . ', ' . $player->{pos_to}{y} . ')';
		
		$maxpl = @{$playersList->getItems()};
		$maxplp = $maxplp+1;

		$msg .= swrite(
			"@<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<< @<< @<<<<<<<<<< @<<<< @<<<<<<<<<<",
			[$player->{binID}, $name, $sex_lut{$player->{sex}}, $player->{lv}, $player->job, $dist, $pos]);
	}
}
	$msg .= "Total party players $maxplp \n";
	$msg .= "Total players $maxpl \n";
	$msg .= "---------------------------------\n";
	message($msg, "list");
	return;
}

	if ($args ne "") {
		my $player = Match::player($args);
		if (!$player) {
			error TF("Player \"%s\" does not exist.\n", $args);
			return;
		}

		my $ID = $player->{ID};
		my $body = $player->{look}{body} % 8;
		my $head = $player->{look}{head};
		if ($head == 0) {
			$head = $body;
		} elsif ($head == 1) {
			$head = $body - 1;
		} else {
			$head = $body + 1;
		}

		my $pos = calcPosition($player);
		my $mypos = calcPosition($char);
		my $dist = sprintf("%.1f", distance($pos, $mypos));
		$dist =~ s/\.0$//;

		my %vecPlayerToYou;
		my %vecYouToPlayer;
		getVector(\%vecPlayerToYou, $mypos, $pos);
		getVector(\%vecYouToPlayer, $pos, $mypos);
		my $degPlayerToYou = vectorToDegree(\%vecPlayerToYou);
		my $degYouToPlayer = vectorToDegree(\%vecYouToPlayer);
		my $hex = getHex($ID);
		my $playerToYou = int(sprintf("%.0f", (360 - $degPlayerToYou) / 45)) % 8;
		my $youToPlayer = int(sprintf("%.0f", (360 - $degYouToPlayer) / 45)) % 8;
		my $headTop = headgearName($player->{headgear}{top});
		my $headMid = headgearName($player->{headgear}{mid});
		my $headLow = headgearName($player->{headgear}{low});

		$msg = TF("------------------ Player Info ------------------\n" .
			"%s (%d)\n" .
			"Account ID: %s (Hex: %s)\n" .
			"Party: %s\n" .
			"Guild: %s\n" .
			"Position: %s, %s (%s of you: %s degrees)\n" .
			"Level: %-7d Distance: %-17s\n" .
			"Sex: %-6s    Class: %s\n" .
			"-------------------------------------------------\n" .
			"Body direction: %-19s Head direction:  %-19s\n" .
			"Weapon: %s\n" .
			"Shield: %s\n" .
			"Shoes : %s\n" .
			"Upper headgear: %-19s Middle headgear: %-19s\n" .
			"Lower headgear: %-19s Hair color:      %-19s\n" .
			"Walk speed: %s secs per block\n", 
		$player->name, $player->{binID}, $player->{nameID}, $hex, 
		($player->{party} && $player->{party}{name} ne '') ? $player->{party}{name} : '',
		($player->{guild}) ? $player->{guild}{name} : '',
		$pos->{x}, $pos->{y}, $directions_lut{$youToPlayer}, int($degYouToPlayer),
		$player->{lv}, $dist, $sex_lut{$player->{sex}}, $jobs_lut{$player->{jobID}},
		"$directions_lut{$body} ($body)", "$directions_lut{$head} ($head)",
		itemName({nameID => $player->{weapon}}),
		itemName({nameID => $player->{shield}}),
		itemName({nameID => $player->{shoes}}), $headTop, $headMid, 
			  $headLow, "$haircolors{$player->{hair_color}} ($player->{hair_color})",
			  $player->{walk_speed});
		if ($player->{dead}) {
			$msg .= T("Player is dead.\n");
		} elsif ($player->{sitting}) {
			$msg .= T("Player is sitting.\n");
		}

		if ($degPlayerToYou >= $head * 45 - 29 && $degPlayerToYou <= $head * 45 + 29) {
			$msg .= T("Player is facing towards you.\n");
		}

		$msg .= "-------------------------------------------------\n";
		message $msg, "info";
		return;
	}
	my $maxpl;
	$msg =  T("-----------Player List-----------\n" .
		"#    Name                                Sex   Lv  Job         Dist  Coord\n");
	foreach my $player (@{$playersList->getItems()}) {
		my ($name, $dist, $pos);
		$name = $player->name;

		if ($player->{guild} && %{$player->{guild}}) {
			$name .= " [$player->{guild}{name}]";
		}
		$dist = distance($char->{pos_to}, $player->{pos_to});
		$dist = sprintf("%.1f", $dist) if (index ($dist, '.') > -1);
		$pos = '(' . $player->{pos_to}{x} . ', ' . $player->{pos_to}{y} . ')';
		
		$maxpl = @{$playersList->getItems()};

		$msg .= swrite(
			"@<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<< @<< @<<<<<<<<<< @<<<< @<<<<<<<<<<",
			[$player->{binID}, $name, $sex_lut{$player->{sex}}, $player->{lv}, $player->job, $dist, $pos]);
	}

	$msg .= "Total players $maxpl \n";
	$msg .= "---------------------------------\n";
	message($msg, "list");
}
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Два соображения.
Во-первых, это стоит загнать в плагин.
Во-вторых, прежде это стоит объединить с... короче кажется в "идеях" лежит плагин, показывающий статусы на игроках - вот его начинку к этому стоит добавить.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

дык, ща будет
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

готово, протестил.
Вложения
cmd_pl.zip
pl - players list + total
pl g - Guild players list + total
pl p - Party players list + total
pl NAME or bindID - player info &amp; statuses
(2.02 КБ) 320 скачиваний
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Бугога, а это еще не всё. :P
Как насчет в этот же плагин встроить нечто, что можно будет вызвать из макроса, ы? ;)
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

не сделаешь. ты же не будешь добавлять глобальных переменных?
макросом выдерай из консоли
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Я не уверен, что это работает.... :(
_pl.pl line 62.
Use of uninitialized value in string eq a
_pl.pl line 62.
Use of uninitialized value in string eq a
_pl.pl line 62.
Use of uninitialized value in string eq a
_pl.pl line 62.
Use of uninitialized value in string eq a
_pl.pl line 62.
-----------Player List-----------
# Name
1 shibinowa []
3 Wazeyomo
7 Unknown #5099899
Total guild players 3
Total players 9
---------------------------------
ЗЫ: Если хочешь сильно изголиццо, можешь еще вот так изобразить:
pl g "MyFukedGuild" (только тех, кто в гильде такой-то)(я б не стал)
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

pl g "MyFukedGuild" на счет этого думал, но не хочу - лень) если комуто уж приспичит пипец то можно
62 строка if ($char->{guild}{name} eq ($player->{guild}{name})) {

у меня ошибок не даёт никаких этот плагин

нуно узнать у других

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

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

Описание:
Прист варпает в 1 точку (пока). Схема такая:
1. Рядом с пристом (в радиусе 10 клеток) в общий чат пишут слово варп (можно не переключать раскладку и написать dfhg, кстати можно написать и ВаРп - тоже поймёт).
2. бот анализирует кто это, дальше
а) если этот засранец (автор слов) не из наших гильдий, то молчим
б) если же - свой чувак, то смотрим сколько игроков вокруг приста собралось
- если игроков меньше 10, то мы даём 1 варп
- если собралось дофига игроков, то открываем 2 варпа (мало?)

Для работы макроса вам необходимо установить плагин cmd_pl.

Навтройка макроса:
$guild = непобедимые,xaos
сюда прописываем имена "своих в доску" гильдий. Имена не чувствительны к РеГиСтРу. После запятой пробела быть не должно!
$warp = 0
вместо 0 ставим тот портал который нужен (их всего четыре: 0, 1, 2, 3)

Достоинства макроса:
1. Прист не привязан к координатам, может стоять в любом городе, почти в любом месте.Почему почти? Читай далее.
2. Прист варпает в рандомные координаты. Причём всегда выше себя. Варпы могут быть левее и правее приста.
3. Если гемов нету, то макрос срабатывать не будет

Недостатки макроса:
А кто же о них пишет? :D
1. Нет оповещения о том, что кончились гемы (кому нада сами прикрутите, или настроете, чтоб бот сам брал гемы)
2. Прист не кидает санки (кому нада сам допишет)
3. Необходимость установки дополнительного плагина (а куда без него?)

Сам макрос:

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

automacro warp {
inventory "Blue Gemstone" > 0
pubm /варп|dfhg/i,10
run-once 1
call {
$guild = непобедимые,xaos
$i = @player ($.lastpub)
$g = @eval (exists $::players{$::playersID[$i]}->{guild} ? $::players{$::playersID[$i]}->{guild}{name} : 'null')
if ($g ~ $guild) goto ok
goto end
:ok
do pl
:end
release pl
release warp
}
}
automacro pl {
console /Total players (\d+)/
run-once 1
exclusive 1
call {
$warp = 0
if ($.lastMatch1 > 9) goto da
goto net
:da
$x = @eval($::char->{pos}{x})
$y = @eval($::char->{pos}{y})
do sl 27 @eval($x + @rand(-5, 0)) @eval($y + @rand(2, 7))
pause 1
do warp $warp
pause 3
:net
do sl 27 @eval($x + @rand(0, 5)) @eval($y + @rand(2, 7))
pause 1
do warp $warp
pause 3
:end
release warp
}
}
Внимание, т.к макрос содержит русские слова (варп и имена гильдий), но файл macros.txt необходимо сохранить в кодировке UTF-8 и закомментировать 1-ю строчку (значком #)
Последний раз редактировалось 4epT Пн июн 25, 2007 4:45 pm, всего редактировалось 3 раза.
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
Аватара пользователя
miniBot
Грамотный
Сообщения: 429
Зарегистрирован: Вс ноя 05, 2006 8:48 am
Откуда: Москва
Контактная информация:

Сообщение miniBot »

4epT
а разьве переменные передаются из макроса в макрос?
Я имею в виду переменную $warp, которой в макросе warp присваивается значение 0. И она-же используется в макросе pl.
Если я правильно понял ход твоей мысли, то если автомакро pl прерывает макро warp, то значение переменной сохраняется?
Click писал(а):не сделаешь. ты же не будешь добавлять глобальных переменных?
а почему-бы и нет. Плагин может добавить глобальную переменную?
помощь только тем у кого включен параметр - mozgEnable 1

БОТАТЬ, БОТАТЬ, И ЕЩЕ РАЗ БОТАТЬ, КАК ЗАВЕЩАЛ ВЕЛИКИЙ ЛЕНИН
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

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

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

блин Click сбил меня со своим плагином :)
макрос временно не работает :)

добавил позже:
Всё исправил, так даже прикольнее получилось.

На счёт замечания по поводу переменной $warp. По идеи значение переменной таким образом не передаётся от макроса к саросу, но если бот хоть раз бы использовал варп с первого автомакроса, то она бы передалась на второй, у меня при тестах так и было, поэтому решил не добавлять. Но щас исправил, теперь точно всё по грамотному :)
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
Блэйз
Энтузиаст
Сообщения: 91
Зарегистрирован: Ср дек 13, 2006 6:55 pm

Сообщение Блэйз »

будет ли пахать макрос если в название Ги - пробелы??
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

добавлено отображение приписке в гильде по мотивам asasa
viewtopic.php?t=5001
Вложения
cmd_pl.zip
pl - players list + total
pl g - Guild players list + total
pl p - Party players list + total
pl NAME or bindID - player info &amp; statuses &amp; Guild title
(2.08 КБ) 276 скачиваний
Ответить