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

FAQ. Ответы на часто задаваемые вопросы.

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

Правила форума
Этот раздел является руководством и тут разрешено оставлять сообщения лишь для уточнения и внесения корректив в существующие материалы. Для вопросов существует ряд других разделов.
Закрыто
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4763
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

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

Сообщение kLabMouse » Ср дек 06, 2006 3:10 pm

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

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

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

######## 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'});
				}
			}
		}
	}
Вложения
FolowerPatch_5398.zip
Патч для версии 5398 и более.
Если что, в нутри и сам патч и патченые файлы.
Предупреждаю!!!! Патч не совмстим с версиями ранее чем 5398
(111.25 КБ) 1600 скачиваний
FolowerPatch.zip
Патч на ревизию СВНа 5195
Делает Сопартийца более мотёрым. Так-же в середине Дифф патч для последуйщих обновлений
(112.97 КБ) 1349 скачиваний
FolowerPatch_5195.zip
Диффпатч со всеми обновлениями. Состоянием на СВН 5195
(2.95 КБ) 1013 скачиваний
Последний раз редактировалось kLabMouse Вс фев 04, 2007 1:09 pm, всего редактировалось 10 раз.

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

Сообщение Aib0 » Ср мар 07, 2007 12:47 pm

Просто тут рукописный код с ашипками(
Поставить норм скобочки и работает.
Wtf is "OpenKore"?

"What we're dealing with here is a total lack of respect for the law"

zeleboba

Сообщение zeleboba » Сб окт 13, 2007 9:57 pm

поставь таймаут и максимальное кол-во раз, должно помочь

fynjy
Новичок
Сообщения: 14
Зарегистрирован: Вс дек 10, 2006 12:38 pm

Сообщение fynjy » Вс окт 14, 2007 10:24 am

хмммм...
а как узнать нормальный "таймаут" и "максимальное кол-во раз"?

Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4763
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse » Пт ноя 30, 2007 6:48 pm

УРЯ!!!!!!!!!!!!!! :Yahoo!: :Yahoo!: :Yahoo!:

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

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

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

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

Удачи.
Вложения
Priest_0_0_1.zip
Тест. Версия 0.0.1
Готовые файлы (по просьбам трудящихся)
из папочки control_mod
взять содержимое файлов и дописать к соответвующим
(108.7 КБ) 1058 скачиваний
follow_patch_0_0_1.diff
Тест. Версия 0.0.1
(11.55 КБ) 690 скачиваний
Последний раз редактировалось kLabMouse Пт ноя 30, 2007 7:19 pm, всего редактировалось 2 раза.

Slavchik93
Энтузиаст
Сообщения: 52
Зарегистрирован: Ср окт 17, 2007 5:01 pm

Сообщение Slavchik93 » Пт ноя 30, 2007 8:58 pm

Маус.Спс огромное,буду тестить)))

Добавлено спустя 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 секунды:

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

Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4763
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse » Пн дек 03, 2007 11:37 am

Обновление до 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.
Вложения
Priest_0_0_2.zip
Тест. Версия 0.0.2
Готовые файлы (по просьбам трудящихся)
из папочки control_mod
взять содержимое файлов и дописать к соответвующим
(108.78 КБ) 1298 скачиваний
follow_patch_0_0_2.diff
Тест. Версия 0.0.2
(11.83 КБ) 803 скачивания

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

Сообщение Aib0 » Пн дек 03, 2007 8:47 pm

Мыша, успехов в начинании)
Хотел спросить - что за проблема с кастом?
Wtf is "OpenKore"?

"What we're dealing with here is a total lack of respect for the law"

Slavchik93
Энтузиаст
Сообщения: 52
Зарегистрирован: Ср окт 17, 2007 5:01 pm

Сообщение Slavchik93 » Пн дек 03, 2007 10:02 pm

Да проблем то ща никаких нету уже)))До этого тормозил сильно,а сейчас вапще супер)

Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4763
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse » Вт дек 04, 2007 10:18 am

Aib0
Да там Task::Skill подтормаживает.
И вообще сами Таски тормознутые пока пашут паралельно с АИ.

Slavchik93
Энтузиаст
Сообщения: 52
Зарегистрирован: Ср окт 17, 2007 5:01 pm

Сообщение Slavchik93 » Вт дек 04, 2007 4:29 pm

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

Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4763
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse » Вт дек 04, 2007 5:12 pm

Slavchik93
Какие дистанции на следование выставил?

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

Slavchik93
Энтузиаст
Сообщения: 52
Зарегистрирован: Ср окт 17, 2007 5:01 pm

Сообщение Slavchik93 » Вт дек 04, 2007 10:00 pm

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

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

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

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

Сообщение Aib0 » Ср дек 05, 2007 8:27 am

kLabMouse писал(а):Slavchik93ЗЫ: То что он бегает кругом чара, ето норм. Написано же: Бот Прист + Человек.
Хм... вроде решал эту проблему...
Wtf is "OpenKore"?

"What we're dealing with here is a total lack of respect for the law"

Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4763
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse » Ср дек 05, 2007 9:54 am

Aib0
Если ты не против. Посмотри что Я там намудрил и внеси свои правки с инкрементом версии.

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

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

followDistanceMax 3
followDistanceMin 1

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

Закрыто