bugtraq:about - если вы нашли ошибку в OpenKore, то...

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

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

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

Сообщение Click »

CoreLogic.pm
строка примерно 1342 в свн 6263 по крайней мере.

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

$item{storage}{index} = findKeyString(\%storage, "name", $item{name});
$item{name} это то что мы берём из конфига, оно всегда маленькими буквами.
а вот этот пляпа массив %storage (так и не нашёл как он заполняется, наверное в ресив), этот массив уже и большими и маленькими.

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

надо сделать чтоб искалось не в %storage, а в новом уже переделанном в маленькие буквы массиве.
Аватара пользователя
Aib0
Бывалый
Сообщения: 961
Зарегистрирован: Чт ноя 16, 2006 12:50 am
Контактная информация:

Сообщение Aib0 »

Я так понимаю, что массив пишется тут:
Network\Receive.pm

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

sub storage_opened {
	my ($self, $args) = @_;
	$storage{items} = $args->{items};
	$storage{items_max} = $args->{items_max};

	$ai_v{temp}{storage_opened} = 1;
	if (!$storage{opened}) {
		$storage{opened} = 1;
		message T("Storage opened.\n"), "storage";
		Plugins::callHook('packet_storage_open');
	}
}
правда как убить регистр - хз

Хотя это не решит проблемы.. нужно переписать не при вводе, а при поиске... тут вроде б:

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

sub findKeyString {
	my $r_hash = shift;
	my $match = shift;
	my $ID = shift;
	foreach (keys %{$r_hash}) {
		if (ref($r_hash->{$_}) && $r_hash->{$_}{$match} eq $ID) {
			return $_;
		}
}
}
Wtf is "OpenKore"?

"What we're dealing with here is a total lack of respect for the law"
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

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

Сообщение Click »

не то (

Добавлено спустя 17 минут 36 секунд:

lc убирает регистр
вот так байауто реализовано и работает с разными регистрами

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

					# scan the entire items.txt file (this is slow)
					foreach (keys %items_lut) {
						if (lc($items_lut{$_}) eq lc($config{"buyAuto_$args->{index}"})) {
							$args->{itemID} = $_;
						}
					}
а вот так гетауто и не работает))

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

					my %item;
					my $itemName = $config{"getAuto_$args->{index}"};
					if (!$itemName) {
						$args->{index}++;
						next;
					}
					my $invItem = $char->inventory->getByName($itemName);
					$item{name} = $itemName;
					$item{inventory}{index} = $invItem ? $invItem->{invIndex} : undef;
					$item{inventory}{amount} = $invItem ? $invItem->{amount} : 0;
					$item{storage}{index} = findKeyString(\%storage, "name", $item{name});
					$item{storage}{amount} = ($item{storage}{index} ne "")? $storage{$item{storage}{index}}{amount} : 0;
					$item{max_amount} = $config{"getAuto_$args->{index}"."_maxAmount"};
					$item{amount_needed} = $item{max_amount} - $item{inventory}{amount};

					# Calculate the amount to get
					if ($item{amount_needed} > 0) {
						$item{amount_get} = ($item{storage}{amount} >= $item{amount_needed})? $item{amount_needed} : $item{storage}{amount};
					}
Добавлено спустя 36 минут 35 секунд:

вот так вот всё пашет :Yahoo!:

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

					my $invItem = $char->inventory->getByName($itemName);
					$item{name} = $itemName;
+						foreach (keys %items_lut) { 
+							if (lc($items_lut{$_}) eq lc($config{"getAuto_$args->{index}"})) {
+								$item{name} = $items_lut{$_};
+								} 
+							}
					$item{inventory}{index} = $invItem ? $invItem->{invIndex} : undef;
					$item{inventory}{amount} = $invItem ? $invItem->{amount} : 0;
Добавлено спустя 56 секунд:

это починили гетауто

Добавлено спустя 19 минут 18 секунд:

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

Сообщение Click »

6268 integrated doCommand plugin into openkore source
6270 пофиксил гетауто


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

Сообщение piroJOKE »

Нужно проверить работу блоков с настройками по умолчанию. Основание:
andrey1234 писал(а):
Stack писал(а):что заработало то?

вот так написал? :

useSelf_item Red Potion {
hp < 30%
inLockOnly 0
notWhileSitting 1
notInTown 1
timeout
disabled 0
inInventory
manualAI 0
}
Оооо спасибо....Теперь кушает поушены нормально)
Теперь объясните чем этот конфиг отличается вот от этого:
useSelf_item Red Potion {
hp < 30%
}
??????


Да, там нет таймаута, но всё равно через секунду-другую Кора должна была успокоиццо, однако этого по словам афтара не просходило, жрало поушены без остановки.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid »

Баг с использованием в блоке опций whenPermitSkill и whenNotPermitSkill
в Misc.pm

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

	if ($config{$prefix."_whenPermitSkill"}) {
		return 0 unless $char->{permitSkill} &&
			$char->{permitSkill}->name eq $config{$prefix."_whenPermitSkill"};
	}

	if ($config{$prefix."_whenNotPermitSkill"}) {
		return 0 if $char->{permitSkill} &&
			$char->{permitSkill}->name eq $config{$prefix."_whenNotPermitSkill"};
	}

а должно быть

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

	if ($config{$prefix."_whenPermitSkill"}) {
		return 0 unless $char->{permitSkill} &&
			$char->{permitSkill}->getName() eq $config{$prefix."_whenPermitSkill"};
	}

	if ($config{$prefix."_whenNotPermitSkill"}) {
		return 0 if $char->{permitSkill} &&
			$char->{permitSkill}->getName() eq $config{$prefix."_whenNotPermitSkill"};
	}

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

Сообщение piroJOKE »

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

Сообщение Click »

DInvalid писал(а):Баг с использованием в блоке опций whenPermitSkill и whenNotPermitSkill
в Misc.pm
svn 6332
DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid »

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

Сообщение Click »

исправляется так
commands.pm
- } elsif ($arg1 eq "desc") {
+ } elsif ($arg1 eq "desc" && $arg2 ne "") {
DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid »

баг это или фича я хз.
Ситуация: бот решил атаковать моба но еще не атаковал (ждет условия блока скиллов, идет к нему, и т.п.),
если в этот момент на моба кто-либо скастует заклинание не наносящее урон (!), то он откажется от атаки, вякнув про киллстил.
При этом не важно, находится ли кастующий с нами в пати или в списке танков; распространенный случай - каст пристом Lex Aeterna.

Это происходит из за логики проверки на КС - если по мобу не нанесено дамага/он сам не нанес дамага, проверяется количество игроков, скастовавших что либо на моба:

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

	 && scalar(keys %{$monster->{castOnByPlayer}})   == 0
естественно, если наш собственный сопартиец-прист кастанул на него
Lex Aeterna или еще что то, то условие не срабатывает и моб считается "нечистым", и атака отменяется.

Я вижу 2 способа это исправить:
1) вообще выкинуть эту проверку, так как то что на моба кто то кинул аги даун, атерну, молчанку не означает что мы его не можем бить, вед так? А для особых случаев есть режим agressiveAntiKS

2) вместо этой элементарной проверки перебирать хэш %{$monster->{castOnByPlayer}} и сравнивать ID кастовавших со списком пати/танкерслист и в случае если найден хотя бы 1 не входящий в эти списки игрок, считать что моб "нечистый", иначе - что "чистый".

Misc.pm

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

	###	
	my $allowed = 1;

	if (scalar(keys %{$monster->{castOnByPlayer}}) > 0) {
	   	
	   foreach (keys %{$monster->{castOnByPlayer}}) {
		my $ID1=$_;
		my $source = Actor::get($_);
		warning TF("Player %s is casting on mob %d times\n",$source->name,$monster->{castOnByPlayer}{$_});
		if ( existsInList($config{tankersList}, $source->{name}) || 
			    ($char->{party} && %{$char->{party}} && $char->{party}{users}{$ID1} && %{$char->{party}{users}{$ID1}})
		)	{

	                warning TF("And it is a party member\n");
			} 
		else
		{
		warning TF("And it is not a party member");
		$allowed = 0;
		}
							}
	}
	###	
	# If monster hasn't been attacked by other players
	if (scalar(keys %{$monster->{missedFromPlayer}}) == 0
	 && scalar(keys %{$monster->{dmgFromPlayer}})    == 0
###	 && scalar(keys %{$monster->{castOnByPlayer}})   == 0
	&& $allowed == 1

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

Сообщение Click »

проверку я думаю стоит оставить, так как не охото атаковать моба на которого кинули аги блес и тп, а так же не правильно атаковать моба на которого кинули провок.
проверку на пати нужно добавить, но эти сообщения думаю стоит убрать, так как про касты на мобов сообщения и так выводятся, и если килстил, то сообщение тоже выводиться, просто много спама будет.
ок?
DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid »

Click писал(а):проверку я думаю стоит оставить, так как не охото атаковать моба на которого кинули аги блес и тп, а так же не правильно атаковать моба на которого кинули провок.
проверку на пати нужно добавить, но эти сообщения думаю стоит убрать, так как про касты на мобов сообщения и так выводятся, и если килстил, то сообщение тоже выводиться, просто много спама будет.
ок?
Ммм, это мой сырой код с отладкой, сообщения естесвенно выкинуть надо, и может проверку оптимизировать как нить? Делано на скорую руку.

Насчет провока - после провока моб начинает идти к провокнувшему и атачить, это там проверяется, блесс и аги ну хмм... просто получается что бы отнять моба у нас достаточно на него кинуть терну или еще что то )

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

--- Misc.pm	Mon Mar 17 12:59:30 2008
+++ misc.my	Thu Jun 05 12:40:50 2008
@@ -1329,8 +1329,29 @@
 	}
 
+
+	###	
+	my $allowed = 1;
+	if (scalar(keys %{$monster->{castOnByPlayer}}) > 0) 
+	{
+		foreach (keys %{$monster->{castOnByPlayer}}) 
+		{
+			my $ID1=$_;
+			my $source = Actor::get($_);
+			unless ( existsInList($config{tankersList}, $source->{name}) || 
+			       ($char->{party} && %{$char->{party}} && $char->{party}{users}{$ID1} && %{$char->{party}{users}{$ID1}}))
+			{
+                        		$allowed = 0;
+                                        last;
+			} 
+		}
+	}
+	###
+	
 	# If monster hasn't been attacked by other players
 	if (scalar(keys %{$monster->{missedFromPlayer}}) == 0
 	 && scalar(keys %{$monster->{dmgFromPlayer}})    == 0
-	 && scalar(keys %{$monster->{castOnByPlayer}})   == 0
+###	 && scalar(keys %{$monster->{castOnByPlayer}})   == 0
+	 && $allowed 
+
 
 	 # and it hasn't attacked any other player
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

комминтим?
Ответить