Эврика!!! Free Cast у сагов заработало!!

Дополнения к OpenKore, расширяющиее её функциональность, называются плагинами.

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

Аватара пользователя
AndreyLun
Грамотный
Сообщения: 280
Зарегистрирован: Пн фев 05, 2007 5:55 pm

Re: Эврика!!! Free Cast у сагов заработало!!

Сообщение AndreyLun »

Абырка
Проблема проста - плагин немного тормозной для подвижных мобов. Он отлично работает только в двух случаях:
1) моб неподвижный,
2) саг убивает моба с первой атаки, а моб не реагирует на каст.
Помню раньше, когда мой саг качался на подвижных мобах силой как Лешие и т.п. иногда он не с первой атаки убивал их, тогда моб начинал двигаться к сагу. Можно попробовать увеличить все дистанции атаки моба, может поможет.
А вообще представь себе, когда ты ручками качаешься, то ты можешь предвидеть, что моб может на тебя пойти, то ты заранее готов отбежать от него, если он на тебя агриться. Фактически в Коре это был бы ИИ, который знает повадки мобов, учится самостоятельно и умеет предвидеть) не проще ли тогда сменить локу и мобов, чем мудрить с настройками? :)
Абырка
Начинающий
Сообщения: 40
Зарегистрирован: Ср ноя 15, 2006 11:10 pm

Re: Эврика!!! Free Cast у сагов заработало!!

Сообщение Абырка »

Всё более менее сделал , не много уменьшил тайм ауты , и увеличил растояние , стал нормально отбегать и добивать , бывает иногда небольшая проблемка с тем что Саг отбежал чуть дальше и Моб перестал быть в зоне видомсти и соответсвенно перестал быть целью , а саг всё ещо остался в таргете моба , тогда получается что саг уже бьёт нового моба , а не добитый бьёт сага =0)))
А вообще представь себе, когда ты ручками качаешься, то ты можешь предвидеть, что моб может на тебя пойти, то ты заранее готов отбежать от него, если он на тебя агриться. Фактически в Коре это был бы ИИ, который знает повадки мобов, учится самостоятельно и умеет предвидеть) не проще ли тогда сменить локу и мобов, чем мудрить с настройками?
Тут в принципе хорошо бы что бы скорость размышлений и посылов команд была очень высокой , тогда бы при сокращении дистанции на 1 клетку саг сразу бы отбегал и держал бы растояние .

НО в любом варианте то что уже сейчас работает меня вполне устраивает =0))))
Аватара пользователя
AndreyLun
Грамотный
Сообщения: 280
Зарегистрирован: Пн фев 05, 2007 5:55 pm

Re: Эврика!!! Free Cast у сагов заработало!!

Сообщение AndreyLun »

Апну тему.
Сегодня решил проверить плагин на новой СВН, но плагин не загружается.
выдаются следующие ошибки.
Изображение

Странно, что на репозтории нет вообще плагина такого...
Может кто нибудь исправить этот плагин?
ссылка на пост с плагином: viewtopic.php?p=75697#p75697
Сам плагин:

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

package freeCast;

# This plugin is licensed under the GNU GPL
# Copyright 2008 by DInvalid
# Portions Copyright 2005 by kaliwanagan
# --------------------------------------------------
# Experimental! Use on your own risk!
# How to install this thing..:
#
# The plugin will activate if:
# you have the skill free cast at level 1 or higher, and
# config is set:
# runFromTargetFree 1
# runFromTargetFree_min 7
# runFromTargetFree_mid 9
# runFromTargetFree_max 12
# 

use strict;
use Plugins;
use Globals;
use Translation qw(T TF);
use Log qw(message warning error);
use AI;
use skill;
use Misc;
use Network;
use Network::Send;
use Utils;
use Math::Trig;

Plugins::register('Free Cast', 'experimental sage free cast support', \&Unload);
my $hook1 = Plugins::addHook('AI_post', \&call);
my $ID;
my $target;
my %timeout;
my ($myPos, $monsterPos,$monsterDist);

##
# round($number)
#
# Returns the rounded number
sub round {
	my($number) = shift;
	return int($number + .5 * ($number <=> 0));
}


sub Unload {
Plugins::delHook('AI_post', $hook1);
}

sub call {
my $i = AI::findAction("attack");
if (defined $i) {
my $args = AI::args($i);
$ID = $args->{ID};
$target = Actor::get($ID);
$myPos = $char->{pos_to};
$monsterPos = $target->{pos_to};
$monsterDist = round(distance($myPos, $monsterPos));
}


if (AI::action eq "skill_use") {
   my $args = AI::args(AI::action);
   my $s = $args->{skillHandle};
   if ($s eq "MG_FIREBOLT" || $s eq "MG_COLDBOLT" || $s eq "MG_LIGHTNINGBOLT" || $s eq "MG_THUNDERSTORM") {
     cast();
   }
}
}

sub cast {
if (($char->{skills}{SA_FREECAST}{lv}) && main::timeOut(\%timeout)){

	#message "Cast!\n";
	my ($realMyPos, $realMonsterPos, $realMonsterDist, $hitYou);
	my $realMyPos = calcPosition($char);
	my $realMonsterPos = calcPosition($target);
	my $realMonsterDist = round(distance($realMyPos, $realMonsterPos));

	$myPos = $realMyPos;
	$monsterPos = $realMonsterPos;
	$hitYou = 0;

	if ($config{'runFromTargetFree'} && ($realMonsterDist < $config{'runFromTargetFree_min'})) {
		#my $begin = time;
		my @blocks = calcRectArea($myPos->{x}, $myPos->{y},$config{'runFromTargetFree_mid'});

		my $highest;
		foreach (@blocks) {
			my $dist = ord(substr($field{dstMap}, $_->{y} * $field{width} + $_->{x}));
			if (!defined $highest || $dist > $highest) {
				$highest = $dist;
			}
		}
		my $pathfinding = new PathFinding;
		use constant AVOID_WALLS => 4;
		for (my $i = 0; $i < @blocks; $i++) {
			# We want to avoid walls (so we don't get cornered), if possible
			my $dist = ord(substr($field{dstMap}, $blocks[$i]{y} * $field{width} + $blocks[$i]{x}));
			if ($highest >= AVOID_WALLS && $dist < AVOID_WALLS) {
				delete $blocks[$i];
				next;
			}

			$pathfinding->reset(
				field => \%field,
				start => $myPos,
				dest => $blocks[$i]);
			my $ret = $pathfinding->runcount;
			if ($ret <= 0 || $ret > $config{'runFromTargetFree_min'} * 2) {
				delete $blocks[$i];
				next;
			}

			delete $blocks[$i] unless (checkLineSnipable($blocks[$i], $realMonsterPos) || checkLineWalkable($blocks[$i], $realMonsterPos));
		}

		my $largestDist;
		my $best_spot;
		foreach (@blocks) {
			next unless defined $_;
			my $dist = distance($monsterPos, $_);
			if (!defined $largestDist || $dist > $largestDist) {
				$largestDist = $dist;
				$best_spot = $_;
			}
		}

		move($best_spot->{x}, $best_spot->{y}, $ID) if ($best_spot);

	} elsif ($config{'runFromTargetFree'} && ($realMonsterDist > $config{'runFromTargetFree_max'})) {
		my $radius = $config{runFromTargetFree_max}-1;
		my @blocks = calcRectArea2($realMonsterPos->{x}, $realMonsterPos->{y},
					$radius,
					$config{runFromTargetFree_mid});

		my $best_spot;
		my $best_dist;
		for my $spot (@blocks) {
			if (
			    (($config{attackCanSnipe} && checkLineSnipable($spot, $realMonsterPos)) || checkLineWalkable($spot, $realMonsterPos))
				&& $field->isWalkable($spot->{x}, $spot->{y})
			) {
				my $dist = distance($realMyPos, $spot);
				if (!defined($best_dist) || $dist < $best_dist) {
					$best_dist = $dist;
					$best_spot = $spot;
				}
			}
		}

		move($best_spot->{x}, $best_spot->{y}, $ID) if ($best_spot);

	}

}
$timeout{time} = time;
$timeout{timeout} = 1;
}

return 1;
Аватара пользователя
AndreyLun
Грамотный
Сообщения: 280
Зарегистрирован: Пн фев 05, 2007 5:55 pm

Re: Эврика!!! Free Cast у сагов заработало!!

Сообщение AndreyLun »

Спасибо, по тэстим)
Ответить