Страница 1 из 9

Пати Прист Для одного. (Связка Прист Бот и Человек)

Добавлено: Ср дек 06, 2006 3:10 pm
kLabMouse
Хех. Выставлю ка Я свой кусочек конфига для Пати Супорт Приста.
(Пожже выставлю изминения которые Я вносил в ОпенКора чтоб оно всё пахало безукоризненно)

И так Сами Скилы. Оьратите внимание. Порядок очень важен!

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

######## Support ###########
# Хелим Насколько Нужно, помагает не тратить много СП
useSelf_skill_smartHeal 1

# Хилл должен быть всегда первым, ибо он самый приоритетный
useSelf_skill Heal {
	hp < 70%
	maxCastTime 0.3
	minCastTime 0.1
	timeout 0.1
}

partySkill Heal {
	target_hp < 80%
	maxCastTime 0.3
	minCastTime 0.1
	timeout 0.1
}

# Блесс и Аги зделаны таким образом чтобы  терятся в жёстком бою, ибо модет повлиять серёзно на кач
# Всегда кастим сначала блем на себя, потом аги, потом блес на пати, потом аги на пати
partySkill Blessing {
	lvl 10
	whenStatusInactive Blessing
	target_aggressives 0
	sp > 70
	notInTown 1
	isSelfSkill 1
	maxCastTime 0.5
	minCastTime 0.1
	aggressives 0
}

partySkill Increase AGI {
	lvl 10
	whenStatusActive Blessing
	whenStatusInactive Increase AGI
	target_aggressives 0
	sp > 100
	notInTown 1
	isSelfSkill 1
	maxCastTime 1.5
	minCastTime 1
	aggressives 0
}

partySkill Blessing {
	lvl 10
	whenStatusActive Blessing, Increase AGI
	target_whenStatusInactive Blessing
	target_aggressives 0
	target_timeout 230
	sp > 60
	notInTown 1
	maxCastTime 0.5
	minCastTime 0.1
	aggressives 0
}

partySkill Increase AGI {
	lvl 10
	whenStatusActive Blessing, Increase AGI
	target_whenStatusInactive Increase AGI
	target_aggressives 0
	target_timeout 170
	sp > 80
	notInTown 1
	maxCastTime 1.5
	minCastTime 1
	aggressives 0
}

# Здесьу меня како-йто баг, поидее оно должно было бы кастится когда сопартиец рядом
partySkill Magnificat {
	lvl 5
	whenStatusInactive Magnificat
	target_aggressives 0
	sp > 80
	notInTown 1
	isSelfSkill 1
	maxCastTime 6
	minCastTime 4
	aggressives 0
}

# Так-же как и магни
partySkill Angelus {
	lvl 2
	sp > 30
	whenStatusInactive Angelus
	target_aggressives 0
	notInTown 1
	isSelfSkill 1
	maxCastTime 4
	minCastTime 0.5
	aggressives 0
}

#  Желательно всю пневму ставить сразу-же за хилом
useSelf_skill Pneuma {
	lvl 1
	sp > 15
	defendMonsters Antique Firelock,Apocalypse,Skel Archer,Assaulter,Baphomet,Blazzer,Bloody Butterfly,Bloody Knight,Clock,Clock Tower Manager,Creamy Fear,Cruiser,Dark Illusion,Dark Lord,Dracula,Dryad,Elder,Enchanted Peach Tree,Executioner,Fake Angel,Flora,Gargoyle,Garm,Geographer,Goblin Archer,Grand Peco,Greatest General,Archer Guardian,Heater,Hugeling,Hydra,Kapha,Kobold Archer,Lord of Death,Mandragora,Maya Purple,Megalith,Merman,Mime Monkey,Mutant Dragon,Mysteltainn,Orc Archer,Owl Baron,Parasite,Penomena,Permeter,Rafflesia,Raydric Archer,Seahores,Solider,Stem worm,Stone Shooter,Succubus,Tamruan,Evil Cloud Hermit,Tengu,Violy,Wanderer,Were Wolf,Wind Ghost,Wootan Shooter,Worm Tail,Wraith Dead,Zombie Dragon,Cruiser1
	whenNotGround Pneuma
	maxCastTime 1.2
	minCastTime 1
}

partySkill Pneuma {
	lvl 1
	sp > 10
	target_defendMonsters Antique Firelock,Apocalypse,Skel Archer,Assaulter,Baphomet,Blazzer,Bloody Butterfly,Bloody Knight,Clock,Clock Tower Manager,Creamy Fear,Cruiser,Dark Illusion,Dark Lord,Dracula,Dryad,Elder,Enchanted Peach Tree,Executioner,Fake Angel,Flora,Gargoyle,Garm,Geographer,Goblin Archer,Grand Peco,Greatest General,Archer Guardian,Heater,Hugeling,Hydra,Kapha,Kobold Archer,Lord of Death,Mandragora,Maya Purple,Megalith,Merman,Mime Monkey,Mutant Dragon,Mysteltainn,Orc Archer,Owl Baron,Parasite,Penomena,Permeter,Rafflesia,Raydric Archer,Seahores,Solider,Stem worm,Stone Shooter,Succubus,Tamruan,Evil Cloud Hermit,Tengu,Violy,Wanderer,Were Wolf,Wind Ghost,Wootan Shooter,Worm Tail,Wraith Dead,Zombie Dragon,Cruiser1
	target_whenNotGround Pneuma
	notInTown 1
	maxCastTime 1.2
	minCastTime 1
}

# Кайри на себя, хорошо себя показівает когда мы танчим
partySkill Kyrie Eleison {
	lvl 5
	whenStatusInactive Kyrie Eleison
#	target_aggressives 0
	sp > 80
	notInTown 1
	isSelfSkill 1
	maxCastTime 4
	minCastTime 2
#	aggressives 0
}

# Кайри на других
partySkill Kyrie Eleison {
	lvl 5
	whenStatusActive Kyrie Eleison
	target_timeout 25
	sp > 60
	aggressives 0
	notInTown 1
	maxCastTime 4
	minCastTime 2
}

# Если сопартийца много бьют то кастим чаще
partySkill Kyrie Eleison {
	lvl 5
	target_aggressives >= 3
	target_timeout 15
	sp > 60
	aggressives 0
	notInTown 1
	maxCastTime 4
	minCastTime 2
}

# По идее Манус на себя, но нах не нужен
#useSelf_skill Impositio Manus {
#	lvl 3
#	whenStatusInactive Impositio Manus
#	notInTown 1
#	aggressives 0
#	maxCastTime 3
#	minCastTime 0.5
#	timeout 2.8
#}

# Манус на сопартийца
partySkill Impositio Manus {
	lvl 3
	# whenStatusInactive Impositio Manus
	target_timeout 45
	target_aggressives 0
	aggressives 0
	notInTown 1
	maxCastTime 3
	minCastTime 0.5
}

# Ну и если убили, то оживим
partySkill Resurrection {
	lvl 1
	target_dead 1
	notInTown 1
	maxCastTime 6
	minCastTime 5
	aggressives 0
	timeout 15
}

# Анти КС (панацея от хантов)
#monsterSkill Pneuma {
#	lvl 1
#	sp > 30%
#	notInTown 1
#	whenFollowing 0
#	target Antique Firelock,Apocalypse,Skel Archer,Assaulter,Baphomet,Blazzer,Bloody Butterfly,Bloody Knight,Clock,Clock Tower Manager,Creamy Fear,Cruiser,Dark Illusion,Dark Lord,Dracula,Dryad,Elder,Enchanted Peach Tree,Executioner,Fake Angel,Flora,Gargoyle,Garm,Geographer,Goblin Archer,Grand Peco,Greatest General,Archer Guardian,Heater,Hugeling,Hydra,Kapha,Kobold Archer,Lord of Death,Mandragora,Maya Purple,Megalith,Merman,Mime Monkey,Mutant Dragon,Mysteltainn,Orc Archer,Owl Baron,Parasite,Penomena,Permeter,Rafflesia,Raydric Archer,Seahores,Solider,Stem worm,Stone Shooter,Succubus,Tamruan,Evil Cloud Hermit,Tengu,Violy,Wanderer,Were Wolf,Wind Ghost,Wootan Shooter,Worm Tail,Wraith Dead,Zombie Dragon,Cruiser1
#	target_whenNotGround Pneuma
#	maxCastTime 2
#	minCastTime 1
#	notInTown 1
#	timeout 3
#}

# Панацея от быстрых мостров
#monsterSkill Decrease AGI {
#	lvl 1
#	sp > 30%
#	notInTown 1
#	target_whenStatusInactive Decrease AGI
#	target_timeout 35
#	notInTown 1
#	maxCastTime 3
#	minCastTime 2
#	timeout 15
#}

# Очень хороший блок если качаемяся с Магом, Визом, Сагом, Хантом
#monsterSkill Lex Aeterna {
#	lvl 1
#	sp > 30%
#	notInTown 1
#	target_whenStatusInactive Lex Aeterna
#	target_timeout 15
#	maxCastTime 6
#	minCastTime 5
#	notInTown 1
#	timeout 15
#}
Небольшой Патч Что-бы лучше Ставить Пневму и Площадные заклинания которые ставятся на позицию где другой чар.

Файл CoreLogic.pm
Ищем

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

				next if ($ID eq "");
				next if ((!$char->{party} || !$char->{party}{users}{$ID}) && (!$char->{homunculus} || $char->{homunculus}{ID} ne $ID) && !$config{"partySkill_$i"."_notPartyOnly"});
				my $player = Actor::get($ID);
				next unless UNIVERSAL::isa($player, 'Actor::Player');
Меняем

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

				next if ($ID eq "");
				next if ((!$char->{party} || !$char->{party}{users}{$ID}) && (!$char->{homunculus} || $char->{homunculus}{ID} ne $ID) && !$config{"partySkill_$i"."_notPartyOnly"});

				# By LabMouse
				my $player;
				if ((!$char->{party}{users}{$ID})||(($char->{party}{users}{$ID})&&($players{$ID}))) {
					$player = $players{$ID};
				} else {
					$player = $char->{party}{users}{$ID};
				}

				#my $player = Actor::get($ID);
				#next unless UNIVERSAL::isa($player, 'Actor::Player');
Ищем

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

					my $pos = $player->position;
					$party_skill{x} = $pos->{x};
					$party_skill{y} = $pos->{y};
Меняем

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

					# By LabMouse
					my $pl_pos;
					$pl_pos = calcPosition($players{$ID});
					$party_skill{x} = $pl_pos->{x};
					$party_skill{y} = $pl_pos->{y};

					#my $pos = $player->position;
					#$party_skill{x} = $pos->{x};
					#$party_skill{y} = $pos->{y};
Файл Misc.pm
Ищем

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

	if ($config{$prefix."_whenGround"}) {
		return 0 unless whenGroundStatus(calcPosition($char), $config{$prefix."_whenGround"});
	}

	if ($config{$prefix."_whenNotGround"}) {
		return 0 if whenGroundStatus(calcPosition($char), $config{$prefix."_whenNotGround"});
	}
Меняем

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

	# By LabMouse
	if ($config{$prefix."_whenGround"}) {
		return 0 if !whenGroundStatus(calcPosition($char), $config{$prefix."_whenGround"});
	}
	if ($config{$prefix."_whenNotGround"}) {
		return 0 if whenGroundStatus(calcPosition($char), $config{$prefix."_whenNotGround"});
	}

	#if ($config{$prefix."_whenGround"}) {
	#	return 0 unless whenGroundStatus(calcPosition($char), $config{$prefix."_whenGround"});
	#}
	#
	#if ($config{$prefix."_whenNotGround"}) {
	#	return 0 if whenGroundStatus(calcPosition($char), $config{$prefix."_whenNotGround"});
	#}
Ищем

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

sub checkPlayerCondition {
	my ($prefix, $id) = @_;

	my $player = $playersList->getByID($id);
Меняем

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

sub checkPlayerCondition {
	my ($prefix, $id) = @_;

	# By LabMouse
	my $player = $players{$id};
	#my $player = $playersList->getByID($id);
Ищем

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

	if ($config{$prefix."_whenGround"}) {
		return 0 unless whenGroundStatus(calcPosition($player), $config{$prefix."_whenGround"});
	}
	if ($config{$prefix."_whenNotGround"}) {
		return 0 if whenGroundStatus(calcPosition($player), $config{$prefix."_whenNotGround"});
	}
Меняем

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

	# By LabMouse
	if ($config{$prefix."_whenGround"}) {
		return 0 if !whenGroundStatus(calcPosition($players{$id}), $config{$prefix."_whenGround"});
	}
	if ($config{$prefix."_whenNotGround"}) {
		return 0 if whenGroundStatus(calcPosition($players{$id}), $config{$prefix."_whenNotGround"});
	}

	#if ($config{$prefix."_whenGround"}) {
	#	return 0 unless whenGroundStatus(calcPosition($player), $config{$prefix."_whenGround"});
	#}
	#if ($config{$prefix."_whenNotGround"}) {
	#	return 0 if whenGroundStatus(calcPosition($player), $config{$prefix."_whenNotGround"});
	#}
Ищем

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

	if ($config{$prefix."_whenGround"}) {
		return 0 unless whenGroundStatus(calcPosition($monster), $config{$prefix."_whenGround"});
	}
	if ($config{$prefix."_whenNotGround"}) {
		return 0 if whenGroundStatus(calcPosition($monster), $config{$prefix."_whenNotGround"});
	}
Меняем

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

	# By LabMouse
	if ($config{$prefix."_whenGround"}) {
		return 0 if !whenGroundStatus(calcPosition($monster), $config{$prefix."_whenGround"});
	}
	if ($config{$prefix."_whenNotGround"}) {
		return 0 if whenGroundStatus(calcPosition($monster), $config{$prefix."_whenNotGround"});
	}

	#if ($config{$prefix."_whenGround"}) {
	#	return 0 unless whenGroundStatus(calcPosition($monster), $config{$prefix."_whenGround"});
	#}
	#if ($config{$prefix."_whenNotGround"}) {
	#	return 0 if whenGroundStatus(calcPosition($monster), $config{$prefix."_whenNotGround"});
	#}
Немного быстрее получаем Имя Перса
Файл Misc.pm
Ищем

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

		$net->sendGetPlayerInfo($ID);
		$actor = shift @{$queue};
		push @{$queue}, $actor if ($actor);
		last;
Меняем

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

		# By LabMouse
		sendGetPlayerInfo($net, $ID);

		#$net->sendGetPlayerInfo($ID);
		$actor = shift @{$queue};
		push @{$queue}, $actor if ($actor);
		last;
Лучше следуем За сопартийцем
Файл Receive.pm
Ищем

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

		if ($actor->isa('Actor::Player')) {
			debug "Player Moved: " . $actor->name . " ($actor->{binID}) Level $actor->{lv} $sex_lut{$actor->{sex}} $jobs_lut{$actor->{jobID}} - ($coordsFrom{x}, $coordsFrom{y}) -> ($coordsTo{x}, $coordsTo{y})\n", "parseMsg";
Меняем

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

		if (UNIVERSAL::isa($actor, "Actor::Player"))) {
			# Check Whatever it is a party member

			my $ID = $actor->{ID};
			if ($char->{party}{users}{$ID}) {
				$chars[$config{char}]{party}{users}{$ID}{pos}{x} = $coordsTo{x};
				$chars[$config{char}]{party}{users}{$ID}{pos}{y} = $coordsTo{y};
				$chars[$config{char}]{party}{users}{$ID}{online} = 1;
			}
			debug "Player Moved: " . $actor->name . " ($actor->{binID}) Level $actor->{lv} $sex_lut{$actor->{sex}} $jobs_lut{$actor->{jobID}} - ($coordsFrom{x}, $coordsFrom{y}) -> ($coordsTo{x}, $coordsTo{y})\n", "parseMsg";
Делаем Быструю Статистику ХП и СП
Файл responses.txt
Добавляем Строчку

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

statusS1 HP: %$char_hp/%$char_hp_max SP: %$char_sp/%$char_sp_max
Файл ChatQueue.pm
Ищем

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

	} elsif ($switch eq "status") {
		$vars->{char_sp} = $char->{sp};
		$vars->{char_hp} = $char->{hp};
		$vars->{char_sp_max} = $char->{sp_max};
		$vars->{char_hp_max} = $char->{hp_max};
		$vars->{char_lv} = $char->{lv};
		$vars->{char_lv_job} = $char->{lv_job};
		$vars->{char_exp} = formatNumber($char->{exp});
		$vars->{char_exp_max} = formatNumber($char->{exp_max});
		$vars->{char_exp_job} = formatNumber($char->{exp_job});
		$vars->{char_exp_job_max} = formatNumber($char->{exp_job_max});
		$vars->{char_weight} = $char->{weight};
		$vars->{char_weight_max} = $char->{weight_max};
		$vars->{zenny} = formatNumber($char->{zenny});
		sendMessage($net, $type, getResponse("statusS"), $user) if $config{verbose};
Меняем

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

	} elsif ($switch eq "status") {
		$vars->{char_sp} = $char->{sp};
		$vars->{char_hp} = $char->{hp};
		$vars->{char_sp_max} = $char->{sp_max};
		$vars->{char_hp_max} = $char->{hp_max};
		$vars->{char_lv} = $char->{lv};
		$vars->{char_lv_job} = $char->{lv_job};
		$vars->{char_exp} = formatNumber($char->{exp});
		$vars->{char_exp_max} = formatNumber($char->{exp_max});
		$vars->{char_exp_job} = formatNumber($char->{exp_job});
		$vars->{char_exp_job_max} = formatNumber($char->{exp_job_max});
		$vars->{char_weight} = $char->{weight};
		$vars->{char_weight_max} = $char->{weight_max};
		$vars->{zenny} = formatNumber($char->{zenny});
		sendMessage($net, $type, getResponse("statusS"), $user) if $config{verbose};

	# By LabMouse
	# a litle version of status
	} elsif ($switch eq "stat") {
		$vars->{char_sp} = $char->{sp};
		$vars->{char_hp} = $char->{hp};
		$vars->{char_sp_max} = $char->{sp_max};
		$vars->{char_hp_max} = $char->{hp_max};
		sendMessage($net, $type, getResponse("statusS1"), $user) if $config{verbose};
Добавляем Улучшеную Удалённую Консоль, дабы быстро управлять Ботом
Файл ChatQueue.pm
Ищем

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

		$timeout{ai_thanks_set}{time} = time;

	} else {
		return 0;
	}
	return 1;
Меняем

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

		$timeout{ai_thanks_set}{time} = time;

	} else {
		return Commands::run($msg);
	}
	return 1;
Перенапрявляем Все приваты в пати чат (рекомендовано использовать с Улучшеной Удалённой Консолью)
Файл ChatQueue.pm
Ищем

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

	# Not a chat command; attempt to reply with a message
	processChatResponse($cmd) if ($config{autoResponse});
Меняем

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

	# Not a chat command; attempt to reply with a message
	processChatResponse($cmd) if ($config{autoResponse});
	sendMessage($net, "p", $cmd->{user} . ": ". $cmd->{msg});
Удаляем Нафиг Проверку На Удалённый Логин к Боту. Теперь никто не сомжет ето зделать
Файл ChatQueue.pm
Ищем

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

		if ($msg eq $config{adminPassword}) {
			auth($user, 1);
			sendMessage($net, "pm", getResponse("authS"), $user);
		}
Меняем

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

		if ($msg eq $config{adminPassword}) {
			# auth($user, 1);
			# sendMessage($net, "pm", getResponse("authS"), $user);
		}
Исправляем Баг С постоянным отхилом.
Взято с http://forums.openkore.com/viewtopic.php?t=26501
Файл Misc.pm
Ищем

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

	# we will have player HP info (only) if we are in the same party
	if ($chars[$config{char}]{party} && $chars[$config{char}]{party}{users}{$id}) {
		if ($config{$prefix . "_hp"}) {
			if ($config{$prefix."_hp"} =~ /^(.*)\%$/) {
				return 0 if (!inRange(percent_hp($chars[$config{char}]{party}{users}{$id}), $1));
			} else {
				return 0 if (!inRange($chars[$config{char}]{party}{users}{$id}{hp}, $config{$prefix . "_hp"}));
			}
Меняем

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

	# we will have player HP info (only) if we are in the same party
	if ($chars[$config{char}]{party} && $chars[$config{char}]{party}{users}{$id}) {
		if ($config{$prefix . "_hp"}) {
			if ($config{$prefix."_hp"} =~ /^(.*)\%$/) {
				return 0 if ($chars[$config{char}]{party}{users}{$id}{hp} == 0);
				return 0 if (!inRange(percent_hp($chars[$config{char}]{party}{users}{$id}), $1));
			} else {
				return 0 if ($chars[$config{char}]{party}{users}{$id}{hp} == 0);
				return 0 if (!inRange($chars[$config{char}]{party}{users}{$id}{hp}, $config{$prefix . "_hp"}));
			}
Пяное Следование (Внимание есть баги с препядствиями возможнно решу в ближайшее время)
Взято с http://forums.openkore.com/viewtopic.php?t=26501
Файл CoreLogic.pm
Ищем

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

	# if we are not doing anything else now...
	if (AI::action eq "follow") {
		if (AI::args->{'suspended'}) {
			if (AI::args->{'ai_follow_lost'}) {
				AI::args->{'ai_follow_lost_end'}{'time'} += time - AI::args->{'suspended'};
			}
			delete AI::args->{'suspended'};
		}

		# if we are not doing anything else now...
		if (!$args->{ai_follow_lost}) {
			my $ID = $args->{ID};
			my $player = $players{$ID};

			if ($args->{following} && $player->{pos_to}) {
				my $dist = distance($char->{pos_to}, $player->{pos_to});
				if ($dist > $config{followDistanceMax} && timeOut($args->{move_timeout}, 0.25)) {
					$args->{move_timeout} = time;
					if ( $dist > 15 || ($config{followCheckLOS} && !checkLineWalkable($char->{pos_to}, $player->{pos_to})) ) {
						ai_route($field{name}, $player->{pos_to}{x}, $player->{pos_to}{y},
							attackOnRoute => 1,
							distFromGoal => $config{followDistanceMin});
					} else {
						my (%vec, %pos);

						stand() if ($char->{sitting});
						getVector(\%vec, $player->{pos_to}, $char->{pos_to});
						moveAlongVector(\%pos, $char->{pos_to}, \%vec, $dist - $config{followDistanceMin});
						$timeout{ai_sit_idle}{time} = time;
						sendMove($pos{x}, $pos{y});
					}
				}
			}

			if ($args->{following} && $player && %{$player}) {
				if ($config{'followSitAuto'} && $players{$args->{'ID'}}{'sitting'} == 1 && $chars[$config{'char'}]{'sitting'} == 0) {
					sit();
				}

				my $dx = $args->{'last_pos_to'}{'x'} - $players{$args->{'ID'}}{'pos_to'}{'x'};
				my $dy = $args->{'last_pos_to'}{'y'} - $players{$args->{'ID'}}{'pos_to'}{'y'};
				$args->{'last_pos_to'}{'x'} = $players{$args->{'ID'}}{'pos_to'}{'x'};
				$args->{'last_pos_to'}{'y'} = $players{$args->{'ID'}}{'pos_to'}{'y'};
				if ($dx != 0 || $dy != 0) {
					lookAtPosition($players{$args->{'ID'}}{'pos_to'}) if ($config{'followFaceDirection'});
				}
			}
		}
	}
Заменяем

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

	# if we are not doing anything else now...
	if (AI::action eq "follow") {
		if (AI::args->{'suspended'}) {
			if (AI::args->{'ai_follow_lost'}) {
				AI::args->{'ai_follow_lost_end'}{'time'} += time - AI::args->{'suspended'};
			}
			delete AI::args->{'suspended'};
		}

		# if we are not doing anything else now...
		if (!$args->{ai_follow_lost}) {
			my $ID = $args->{ID};
			my $player = $players{$ID};

			if ($args->{following} && $player->{pos_to}) {
				my $dist = distance($char->{pos_to}, $player->{pos_to});
				if ($dist > $config{followDistanceMax} && timeOut($args->{move_timeout}, 0.25)) {
					$args->{move_timeout} = time;
					if ( $dist > 15 || ($config{followCheckLOS} && !checkLineWalkable($char->{pos_to}, $player->{pos_to})) ) {
						ai_route($field{name}, $player->{pos_to}{x}, $player->{pos_to}{y},
							attackOnRoute => 1,
							distFromGoal => $config{followDistanceMin});
					} else {
						my ($targetpos, $actor, %pos);
						foreach  (@playersID) {
							next unless $_;
							$actor = $players{$_};
							$pos{$actor->{pos_to}{x}}{$actor->{pos_to}{y}} = 1;						
						}
						foreach  (@npcsID) {
							next unless $_;
							$actor = $npcs{$_};
							$pos{$actor->{pos_to}{x}}{$actor->{pos_to}{y}} = 1;						
						}
						foreach  (@monstersID) {
							next unless $_;
							$actor = $monsters{$_};
							$pos{$actor->{pos_to}{x}}{$actor->{pos_to}{y}} = 1;						
						}

						my @rectBlock = calcRectArea2($player->{pos_to}{x}, $player->{pos_to}{y}, 
							$config{followDistanceMax}, $config{followDistanceMin});
						my $blockCount = scalar(@rectBlock);
						my $loopCount = 0;
						do {
							$targetpos = $rectBlock[int(rand($blockCount))];
							$loopCount++;
						} while ((!checkFieldWalkable(\%field, $targetpos->{x}, $targetpos->{y})
							|| $pos{$targetpos->{x}}{$targetpos->{y}}) && ($blockCount > $loopCount));
						
						if ($blockCount > $loopCount) {
							stand() if ($char->{sitting});
							$timeout{ai_sit_idle}{time} = time;
							sendMove($targetpos->{x}, $targetpos->{y});
						} else {
							# Can not found a solution. Maybe stay! or move onto my master!!
							# $targetpos = $player->{pos_to};
							# stand() if ($char->{sitting});
							# $timeout{ai_sit_idle}{time} = time;
							# sendMove($targetpos->{x}, $targetpos->{y});
						}
					}
				}
			}

			if ($args->{following} && $player && %{$player}) {
				if ($config{'followSitAuto'} && $players{$args->{'ID'}}{'sitting'} == 1 && $chars[$config{'char'}]{'sitting'} == 0) {
					sit();
				}

				my $dx = $args->{'last_pos_to'}{'x'} - $players{$args->{'ID'}}{'pos_to'}{'x'};
				my $dy = $args->{'last_pos_to'}{'y'} - $players{$args->{'ID'}}{'pos_to'}{'y'};
				$args->{'last_pos_to'}{'x'} = $players{$args->{'ID'}}{'pos_to'}{'x'};
				$args->{'last_pos_to'}{'y'} = $players{$args->{'ID'}}{'pos_to'}{'y'};
				if ($dx != 0 || $dy != 0) {
					lookAtPosition($players{$args->{'ID'}}{'pos_to'}) if ($config{'followFaceDirection'});
				}
			}
		}
	}

Добавлено: Ср мар 07, 2007 12:47 pm
Aib0
Просто тут рукописный код с ашипками(
Поставить норм скобочки и работает.

Добавлено: Сб окт 13, 2007 9:57 pm
zeleboba
поставь таймаут и максимальное кол-во раз, должно помочь

Добавлено: Вс окт 14, 2007 10:24 am
fynjy
хмммм...
а как узнать нормальный "таймаут" и "максимальное кол-во раз"?

Добавлено: Пт ноя 30, 2007 6:48 pm
kLabMouse
УРЯ!!!!!!!!!!!!!! :Yahoo!: :Yahoo!: :Yahoo!:

Долгожданное обновление.
Тестим, жалуемся. :oops:
Поточная версия 0.0.1 со всеми наворотами.

Ставить желательно поверх СВН 6095 версии. хотя поверх месной сборки тоже должно пойти.
В аттаче ДИфф, так что без СВНки вам не обойтись.
Файлы конфигарции брать с патча Abi0 (Большая обеденённая зборка)

ЗЫ 1: Я даже не пробовал, главное было добиться чтобы небыли видимые баги.

ЗЫ 2: Когда запашет пяное следование. займусь и пяным рандомом.
ЗЫ 3: Флуд потру, точнее всё что было до данного поста.

Удачи.

Добавлено: Пт ноя 30, 2007 8:58 pm
Slavchik93
Маус.Спс огромное,буду тестить)))

Добавлено спустя 8 минут 23 секунды:

гы гы,баг опять вот смотри
Error message:
Can't call method "isWalkable" on unblessed reference at src/Misc.pm line 645.

Stack trace:
Can't call method "isWalkable" on unblessed reference at src/Misc.pm line 645.
at src/Misc.pm line 645
Misc::closestWalkableSpot('HASH(0xf88c48)', 'HASH(0x3046f90)') called at src/AI/CoreLogic.pm line 2031
AI::CoreLogic::processFollow() called at src/AI/CoreLogic.pm line 154
AI::CoreLogic::iterate() called at src/functions.pl line 605
main::mainLoop_initialized() called at src/functions.pl line 70
main::mainLoop() called at src/Interface.pm line 75
Interface::mainLoop('Interface::Console::Win32=HASH(0x23e0b0c)') called at openkore.pl line 96
main::__start() called at start.pl line 119

Died at this line:
foreach my $z ( [0,0], [0,1],[1,0],[0,-1],[-1,0], [-1,1],[1,1],[1,-1],[-1,-1],[0,2],[2,0],[0,-2],[-2,0] ) {
* next if !$field->isWalkable($pos->{x} + $z->[0], $pos->{y} + $z->[1]);
$pos->{x} += $z->[0];

Добавлено спустя 39 секунд:

Причем качался десять минут норм,а потом вот это выскачило((

Добавлено спустя 3 минуты 47 секунд:

И еще вроде тормозит ставя заклинания на партнершу.Раньше все ставил еще до истечения баффов,а теперь задержка секунд пятнадцать.Хм может я тупой и это и есть этот патч.Хотя месяца три назад с патчем даже задержки не было ставил все вовремя.

Добавлено спустя 1 час 18 минут 34 секунды:

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

Добавлено: Пн дек 03, 2007 11:37 am
kLabMouse
Обновление до 0.0.2, решение проблемы с блессом поля.

TODO:
0.0.3 -- 0.0.5: Решение проблемы с долгим кастом.
0.1.0 -- 0.1.5: Попытка експорта сего чуда в плагин.
0.2.0 -- 0.9.0: добавление фишек.
1.0.0 -- 1.9.9: Исправление возможных багов.
2.0.0 -- 3.0.0: Добавление ещё одного плага, для общения партии и поддержки оной, без присутствия человека. Путём реализации общения через BUS.

Добавлено: Пн дек 03, 2007 8:47 pm
Aib0
Мыша, успехов в начинании)
Хотел спросить - что за проблема с кастом?

Добавлено: Пн дек 03, 2007 10:02 pm
Slavchik93
Да проблем то ща никаких нету уже)))До этого тормозил сильно,а сейчас вапще супер)

Добавлено: Вт дек 04, 2007 10:18 am
kLabMouse
Aib0
Да там Task::Skill подтормаживает.
И вообще сами Таски тормознутые пока пашут паралельно с АИ.

Добавлено: Вт дек 04, 2007 4:29 pm
Slavchik93
Короче обнаружил неприятный баг в следовании,то что прист когда его бьют мобы(где то три штуки)Тупо стоит на месте если даже мастер уже убежал и все пишет-якобы сейчас пойду.И еще в обновлении появился баг в следовании,прист начал частенько отставать от мастера,клеток эдак на 8,бывало вапще сажусь я хантом,прист отходит клеток на 7 от меня вперед и садится.

Добавлено: Вт дек 04, 2007 5:12 pm
kLabMouse
Slavchik93
Какие дистанции на следование выставил?

ЗЫ: То что он бегает кругом чара, ето норм. Написано же: Бот Прист + Человек.
А не Бот Прист + Бот Аттакер.

Добавлено: Вт дек 04, 2007 10:00 pm
Slavchik93
followDistanceMax 4
followDistanceMin 2
Тоесть Бот+Бот здесь не пойдет,да вроде и так норм)))Скорее всего баги из за особенности нашего любимого Лаггейма.
Флуд:Зацени,бот сожрал 13 Авакенинг потион за раз,место одного.))

Добавлено спустя 1 час 54 минуты 46 секунд:

Недавно увидел еще более худшую картину.Бот прист стоит неподвижно от основного чара на растоянии 70клеток по вертикали.И причем даже не пытается вычислить путь куда идти.Просто стоит и курит.

Добавлено: Ср дек 05, 2007 8:27 am
Aib0
kLabMouse писал(а):Slavchik93ЗЫ: То что он бегает кругом чара, ето норм. Написано же: Бот Прист + Человек.
Хм... вроде решал эту проблему...

Добавлено: Ср дек 05, 2007 9:54 am
kLabMouse
Aib0
Если ты не против. Посмотри что Я там намудрил и внеси свои правки с инкрементом версии.

Добавлено спустя 1 минуту 3 секунды:

Slavchik93
Про аваки уже писалось на форуме. Поищи.

followDistanceMax 3
followDistanceMin 1

Вот такого Хватает вполне. правда будет немного путатся под ногами.