Задача №18: Выводить статусы на других игроках [решено]

Разработка новых функций.

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

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

Задача №18: Выводить статусы на других игроках [решено]

Сообщение piroJOKE »

Задача №18: Выводить список статусов на других игроках, по команде pl #.
Последний раз редактировалось piroJOKE Пт май 25, 2007 4:16 pm, всего редактировалось 4 раза.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Eddga
Энтузиаст
Сообщения: 88
Зарегистрирован: Ср ноя 15, 2006 3:05 am

Сообщение Eddga »

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

Идею понял. Хорошая. Надо покопаться в различии статусов вешающих самой корой и видимых. Думаю реализуема. На днях посижу покопаюсь.

Офтоп:
piroJOKE ты с OpenKore Field Editor разобрался?
viewtopic.php?t=941
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

(ап!)(решил апнуть интересные темы)
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Eddga
Энтузиаст
Сообщения: 88
Зарегистрирован: Ср ноя 15, 2006 3:05 am

Сообщение Eddga »

Пирожок я конечно Лентяй. Но ща сделаю... Это ведь то что даже такое ньюб как я могу сделать - не дергаю ptica.
Eddga
Энтузиаст
Сообщения: 88
Зарегистрирован: Ср ноя 15, 2006 3:05 am

Сообщение Eddga »

Eddga писал(а):Пирожок я конечно Лентяй. Но ща сделаю...
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

(это типо повторение - мать учения?)
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Eddga
Энтузиаст
Сообщения: 88
Зарегистрирован: Ср ноя 15, 2006 3:05 am

Сообщение Eddga »

Нажал вместо правку цитату. Собирался убрать
Это ведь то что даже такое ньюб как я могу сделать - не дергаю ptica.
Слишком уж не скромно звучит...

Плагин готов. Использовать командой pl # на игрока.
____

(pJ: удалил атач; см. ниже более "продвинутую" версию)
Eddga
Энтузиаст
Сообщения: 88
Зарегистрирован: Ср ноя 15, 2006 3:05 am

Сообщение Eddga »

Да кстате Пирожок. Там выдернут код из двух мест файла commands.pm и все. Вообще работы для пионера :)
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

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

Сообщение piroJOKE »

Отлично, буду сматреть!

ЗЫ: Может наедем на OpenKore'оффцев, чтоб встроили внутрь штатной pl # ?
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Eddga
Энтузиаст
Сообщения: 88
Зарегистрирован: Ср ноя 15, 2006 3:05 am

Сообщение Eddga »

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

Сообщение piroJOKE »

Это патаму что еще не испытывалъ. :(
/me посывает главу пепломъ. :(
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Это я рано начал радоваться... проехали:
Хе-хе-хе, вот какая я хитрая задница:

-my $cmds = Commands::register(
- ['pl_st', "command plugin", \&cmds_1],
-);


+my $cmds = Commands::register(
+ ['pl', "command plugin", \&cmds_1],
+);

(Угодайте, што случилось?) :Yahoo!:
* * *

А вот это вариант работает так, как надо! -

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

package cmds;

use lib "c:/Perl/lib/";
use lib $Plugins::current_plugin_folder;
 
use strict;

use warnings;
use Time::HiRes qw(time);
use encoding 'utf8';

use Globals;
use Plugins;
use Utils;
use Misc;
use AI;
use Commands;
use AI;
use Log qw(message warning error debug);
use Utils;
use Utils::Win32;
use Match;
use Translation;


my %self = (
     name => 'commands',
);

Plugins::register("commands", "Commands plugin by Eddga", \&onUnload);

my $cmds = Commands::register(
	['pl', "command plugin", \&cmds_1],
);

sub onUnload {
	message("[$self{name}] Unloaded!\n", "system");
	Commands::unregister($cmds);
}
 

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

	if ($args) {
		my Actor::Player $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";
#############################################################
#Statuses
#############################################################
		my $statuses = 'none';
		if (defined $player->{statuses} && %{$player->{statuses}}) {
			$statuses = join(", ", keys %{$player->{statuses}});
		}
		$msg .= TF("Statuses: %s \n", $statuses);
		$msg .= "-------------------------------------------------\n";
		message $msg, "info";
		return;

	}

#---------------

	{

		$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} . ')';
	
			$msg .= swrite(
				"@<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<< @<< @<<<<<<<<<< @<<<< @<<<<<<<<<<",
				[$player->{binID}, $name, $sex_lut{$player->{sex}}, $player->{lv}, $player->job, $dist, $pos]);
		}
		$msg .= "---------------------------------\n";
		message($msg, "list");
	}

}
(Смысл операции - плагин просто заменяет собой команду pl / pl #. Типо получается просто "расширенная" pl-команда. Вот теперь решено. Афтар плагина - респект. :) Будем бессовестно использовать!)

ЗЫ: Ерр.... правда оно матюкалось, когда рядом никого небыло, поэтому я заменил if ($args ne "") ---> if ($args), вроде стало окей.... :x

* * *

Позже! А вот несколько усовершенствованный, измененный вариант этого плагина (он новее, чем тот, что тут лежит в атаче):
viewtopic.php?p=28193 (by Click)
Вложения
cmd_pl.zip
отредактированный вариант плагина, который просто заменяет команду pl # на ее &quot;расширенную&quot; альтернативу
v 0.9.4
(1.8 КБ) 192 скачивания
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Ответить