Баг(и) кэширования имен?

BugTraq: обнаруженные ошибки и обсуждение их устранения.

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

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

Баг(и) кэширования имен?

Сообщение piroJOKE »

(короче чел жаловался, что он перезаходит вторым чаром с акка, а его ако продолжает его лечить, как будто это первый чар с акка)
viewtopic.php?p=50296#50296
piroJOKE писал(а):(...) Сервер изначально говорит "на экране плеер с такого-то аккаунта (не чар, а именно акк!), такой-то класс, такая-та одежда". Если ты на него наводишь курсор, клиент спрашивает "как звать этого придурка?". Сервер говорит "Васёк, из гильды ГромоДятлы". Так вот, я не знаю, кэширует ли клиент имена, но ОК их кеширует (см соотв опции в конфиге). Т.е., если ОК встречает любого плеера с аккаунта, которого она видела недавно, она не запрашивает его имя заново, и считает что это тот же самый чел, с тем же именем. :twisted: Однако, это можно отключить.

NB! Идея. Надо кешировать не акк:имя_чара, а скажем акк/класс:имя_чара.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
l00zEr
Начинающий
Сообщения: 41
Зарегистрирован: Ср апр 02, 2008 12:15 am

Сообщение l00zEr »

Раз уж тут про мою проблему, то можно я решение выложу?
Если не в тему, перенесите, куда надо =)

диффка для svn rev 6317:

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

diff -Naur openkore.orig/src/AI/CoreLogic.pm openkore/src/AI/CoreLogic.pm
--- openkore.orig/src/AI/CoreLogic.pm      2008-03-26 00:21:32.000000000 +0300
+++ openkore/src/AI/CoreLogic.pm  2008-04-06 03:34:56.000000000 +0400
@@ -2363,6 +2363,7 @@
                        foreach my $ID (@playersID) {
                                next if ($ID eq "");
                                next if ((!$char->{party} || !$char->{party}{users}{$ID}) && (!$char->{homunculus} || $char->{homunculus}{ID} ne $ID) && !$config{"partySkill_$i"."_notPartyOnly"});
+                               next if ($char->{party}{users}{$ID}->{name} ne $playersList->getByID($ID)->name);
                                my $player = Actor::get($ID);
                                next unless UNIVERSAL::isa($player, 'Actor::Player');
                                if (inRange(distance($char->{pos_to}, $players{$ID}{pos}), $config{partySkillDistance} || "1..8")
как видно, добавил только одну строчку.
быстро проверил на своих 2х чарах - вроде ок всё.

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

Сообщение Click »

piroJOKE кстати этот
и этот не плохие два фикса. на счёт фоллов вроде норм понятно. а вот партискилл .... надо протестить:
1. если у нас в пати несколько человек, а в конфиге прописан один.
2. если у нас в пати один человек, а в конфиге несколько разных.
3. если у нас в пати несколько человек и в конфиге несколько.

если таким макаром перезаходить, то не будет ли он терять остальных.
l00zEr
Начинающий
Сообщения: 41
Зарегистрирован: Ср апр 02, 2008 12:15 am

Сообщение l00zEr »

Ммм... ну по идее, есть у нас массив @playersID, добавленная строка тупо смотрит имя игрока для каждого ID и сравнивает с именем игрока в пати. То есть тут без разницы, что прописано в конфиге.

Я думаю, все 3 пункта относятся к условию:

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

(!$config{"partySkill_$i"."_target"} || existsInList($config{"partySkill_$i"."_target"}, $player->{name}))
то есть:
если не указан target, то проверку прошли; если указан, то смотрим, содержится ли player name в списке target`ов.
остаётся проверить только, чтобы мы получали реальный player name, а не из списка пати.

player name мы берём из $player = Actor::get($ID);
если копнуть глубже:

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

sub get {
.......
	} elsif ($items{$ID}) {
		return $items{$ID};
	} else {
		foreach my $list ($playersList, $monstersList, $npcsList, $petsList, $portalsList) {
			my $actor = $list->getByID($ID);
			if ($actor) {
				return $actor;
			}
.......
}
про items я не понял, а так получается, что player мы возьмём из $playersList. всё должно работать.

Единственное но: если юзать $player->{name}, то мы рискуем нарваться на пустую строку, я бы поменял на $player->name.

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

##
# String $Actor->{name}
#
# The name of the actor, e.g. "Joe", "Jane", "Poring", etc.
# This field is undefined if the name for this actor isn't known yet,
# so generally you use use $Actor->name() instead, which automatically
# takes care of actor objects that don't have a name yet.
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

svn 6333.
а на счёт $player->{name} пока затыканий вроде не наблюдалось? надо тестить.
Ответить