Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Подскажите где ошибка (magic resist)

тут можно задать вопрос по скриптингу
Vargul
Neophyte
Neophyte
Posts: 49
Joined: 16.09.2010 10:30

Подскажите где ошибка (magic resist)

Post by Vargul »

Цель скрипта

1. Маг кастует огненную стену на предмет (сумка на полу).
2. Медитирует
3. Проверка на голод
4. Ждет.

Проблема - через какое то время маг ставит стенку огня не на объект, а на то место где стоит сам и еще 2 персонажа, которые хилят ходящего по стенке гнома - результат 3 трупа.
Заранее спасибо.

Вот скрипт

Code: Select all

Program MagicResistance;
// v.1.04 (c) Edred

{$Include 'all.inc'}

var
i:integer;
k:integer;
ctime : TDateTime;

const
sumka=$40107083; 
// Значение маны, с которого нужно начинать медитировать
tmana=33;
TypeCast='Fire Field';
// Реги
BPreg=$0F7A;
BMreg=$0F7B;
GAreg=$0F84;
GSreg=$0F85;
MRreg=$0F86;
NSreg=$0F88;
SAreg=$0F8C;
SSreg=$0F8D;

   procedure getitems(item:cardinal);
   // процедура берет из контейнера 20 шт указанного предмета
   begin
      if (count(item)=0) then
      begin
         findType(item,Ground);
         if (FindCount > 0) then
         begin
            k := FindQuantity;
            Grab(finditem,20);
            wait(1000);
            case item of
               BPreg : addtosystemjournal('взял 20 BP из ' + inttostr(k));
               SAreg : addtosystemjournal('взял 20 SA из ' + inttostr(k));
               SSreg : addtosystemjournal('взял 20 SS из ' + inttostr(k));
            end;
         end
         else
         begin
            addtosystemjournal('Мало!!!');
            repeat
               wait(5000);
               findType(item,Ground);
            until (FindCount > 0);
            Grab(finditem,20);
            wait(1000);
            case item of
               BPreg : addtosystemjournal('взял 20 BP из ' + inttostr(k));
               SAreg : addtosystemjournal('взял 20 SA из ' + inttostr(k));
               SSreg : addtosystemjournal('взял 20 SS из ' + inttostr(k));
            end;

         end;
      end;
   end;


   procedure Medita; 
   begin 
      while (WarMode = true) do SetWarMode(false);
      while (Mana < 30) do 
      begin 
         ctime := Now; 
         i:=0; 
         useskill('meditation');
         wait(1000); 
         repeat 
            wait(200); 
            i:=i+1; 
            checksave; 
         until (InJournalBetweenTimes('You are at peace.', ctime, Now)<>-1) or (i=300); 
         addtosystemjournal('медитация закончена'); 
      end; 
   end; 



   procedure Cast2Self;
   begin
      if TargetPresent then CancelTarget;
      case TypeCast of
         'Fire Field' :    begin getitems(BPreg); getitems(SAreg); getitems(SSreg); end;
//         'Lightning' :    begin getitems(BPreg); getitems(MRreg); getitems(SAreg); end;
//         'Poison' : begin getitems(NSreg); end;
      end;
      i:=0;
      ctime := Now;
      cast(TypeCast);
      repeat
          wait(800);
      until TargetPresent or (InJournalBetweenTimes('fizzles', ctime, Now)<>-1) or (i=50);
      if TargetPresent then TargetToObject(sumka);
      wait(1000)
      if (InJournalBetweenTimes('fizzles', ctime, Now)=-1) then addtosystemjournal('каст закончен');
      end;


Begin
   FindDistance:=1;
   while true do
   begin
      Hungry(2, -1);
      Cast2Self;
      wait(3000);
      Medita;
      wait(45000);
   end;
End.
Last edited by Vargul on 25.09.2012 12:21, edited 1 time in total.
Vargul
Neophyte
Neophyte
Posts: 49
Joined: 16.09.2010 10:30

Re: Подскажите где ошибка

Post by Vargul »

Поправочка.
Переставил 2-х хилеров на противоположную сторону огненной стены.
Результат тот же. Оба хилера и ходящий по стенке трупы.
Получается маг ставит стенку на хилеров.
Вопрос почему? Если явно указано на что кастовать стенку.
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Re: Подскажите где ошибка

Post by Fenix »

Визуально всё в порядке.
Прояви творческий подход к отладке - расставь хилеров на разных линиях. А то что они у тебя разом дохнут. Как раз узнаешь какого из хилеров твой маг недолюбливает больше всего.
Может он у тебя кидает стену не на неподвижный объект, а на ходящего туда-сюда гнома?
Помните – ничто так не защищает ваши зубы 12 часов днем и 12 часов ночью как уважительное отношение к окружающим.
"Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня"© Larry Wall
Vargul
Neophyte
Neophyte
Posts: 49
Joined: 16.09.2010 10:30

Re: Подскажите где ошибка

Post by Vargul »

Хождение гнома не пересекается с постановкой хилеров. Позиция хилеров обусловлена тем чтобы они дотягивались до него, когда гном находиться на крайних точках пути.
Позиция чаров следующая - маг на 1 линии, затем сумка и по этой же линии ходит гном, и уже на 3-ей линии стоят 2 хилера.
Я просто не могу понять, почему через час (примерно) маг кастить стенку на линии, где стоят хилеры. И что самое интересное, после того как все сдохли, маг кастует стенку туда куда надо, там где стоит объект (сумка).

Может вместо if TargetPresent then TargetToObject(sumka); использовать WaitTargetXYZ
хотя это та же ловушка, только на точку
Last edited by Vargul on 18.10.2011 12:56, edited 1 time in total.
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Re: Подскажите где ошибка

Post by Fenix »

Зачем спрашиваешь? Пробуй. Мне чтобы такое протестировать надо ставить клиенты, регаться на сервер, создавать и качать чаров.
Помните – ничто так не защищает ваши зубы 12 часов днем и 12 часов ночью как уважительное отношение к окружающим.
"Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня"© Larry Wall
Vargul
Neophyte
Neophyte
Posts: 49
Joined: 16.09.2010 10:30

Re: Подскажите где ошибка

Post by Vargul »

да я советуюсь, мысли в слух так сказать, может какую то другую функцию использовать посоветуете
а то я просто в тупике каком то, бьюсь об стену, а выход где то рядом :)
Vargul
Neophyte
Neophyte
Posts: 49
Joined: 16.09.2010 10:30

Re: Подскажите где ошибка

Post by Vargul »

а кроме творческого подхода никаких вариантов больше нет?:)
Alex
Moderator
Moderator
Posts: 351
Joined: 07.04.2005 4:41

Re: Подскажите где ошибка

Post by Alex »

WaitTargetXYZ - хороший вариант на попробовать
Новый стелс лежит тут. Стелс это произведение искусства! :)
Vargul
Neophyte
Neophyte
Posts: 49
Joined: 16.09.2010 10:30

Re: Подскажите где ошибка

Post by Vargul »

Попробовал творческий подход с расстановкой хилеров в разных точках и WaitTargetXYZ.
Результат - 1 хилер все равно сдох, и сдох гном, ходящий по стенке, второй хилер видимо не дотянулся в критический момент.

Щас поставил тоже самое, но убрал дохнущего хилера, добавил магу хил гнома.
Вечером посмотрю результат :)
Веселуха :)

P.S. стелс новый 3.9.2
Vargul
Neophyte
Neophyte
Posts: 49
Joined: 16.09.2010 10:30

Re: Подскажите где ошибка

Post by Vargul »

Результат не заставил себя долго ждать.
Маг сам себя убил.
Что за бред? Помогайте, мысли, предложения.
MuDaCk
Apprentice
Apprentice
Posts: 393
Joined: 10.10.2006 0:03
Contact:

Re: Подскажите где ошибка

Post by MuDaCk »

значит иногда проскакивает таргет селф или таргет по идишнику хилера.

Я бы сделал так:

Code: Select all

cast(TypeCast);
             waitfortarget(3000);
           TargetToObject(sumka);
Придерживаюсь принципа простоты 8)
My name is Игорёшка Image
Пишу скрипты за едуImage
Vargul
Neophyte
Neophyte
Posts: 49
Joined: 16.09.2010 10:30

Re: Подскажите где ошибка

Post by Vargul »

Так я тоже делал.
Непонятно почему он вообще ставит стенку в другое место, а потом опять куда надо.
Вот в чем вопрос. Как может "проскакивать что-то" если этого что-то даже не упоминается в скрипте :)

Слушайте, может быть пальцем в небо конечно, но как Вам такое - когда гном ходит он закрывает собой сумку (в случае TargettoObject (sumka)) или точку (WaitTargetXYZ) куда надо прицелом тыкнуть. Может быть из-за этого маг начинает тупить и кастить на 1 тайл выше или ниже?
Соображения, критика приветствуется. Уже дело принципа.
Last edited by Vargul on 19.10.2011 17:10, edited 1 time in total.
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Re: Подскажите где ошибка

Post by Fenix »

Попробуй скрипт:

Code: Select all

const
	Bag = $40107083;
	MinMana = 33;
	RegCount = 100;
	BPReg = $0F7A;
	SAReg = $0F8C;
	SSReg = $0F8D;
	
procedure CastToID(Item: Cardinal);
begin
	CheckLag(15000);
	if TargetPresent() then CancelTarget();
	Cast('Fire Fild');
	CheckLag(15000);
	WaitForTarget(5000);
	CheckLag(15000);
	if TargetPresent() then begin
		CurTime := Now;
		TargetToObject(Item);
		Wait(1000);
	end;
end;

function CheckReg(RegType: Word);
var
	MoveCount, NeedCount: Word;
begin
	if FindType(RegType, Backpack) = 0 then begin
		FindDistance := 2;
		NeedCount := RegCount;
		while (FindType(RegType, Ground) > 0) and (NeedCount > 0) do begin
			if FindCount >= NeedCount then MoveCount := NeedCount else MoveCount := FindCount;
			NeedCount := NeedCount - MoveCount;
			CheckLag(15000);
			MoveItem(FindId, Backpack, MoveCount);
			CheckLag(15000);
			Wait(1000);
		end;
		Result := NeedCount < RegCount;
	end else begin
		Result := True;
	end;
end;

function Meditate();
var
	CurTime: TDateTime;
begin
	if Mana >= MinMana then begin
		Result := True;
	end else if Dead then begin
		Resutl := False;
	end else begin
		CheckLag(15000);
		if WarMode() then SetWarMode(False);
		CheckLag(15000);
		while (Mana < MinMana) do begin 
			CurTime := Now; 
			UseSkill('Meditation');
			CheckLag(15000);
			Wait(5000); 
			repeat
				Wait(200); 
				CheckLag(15000);
			until (InJournalBetweenTimes('You are at peace.|You fail', CurTime, Now) >= 0) or (Now - CurTime > 1/24/60/60 * 10); //10 секунд или пока не закончит медитировать(успех или нет - не важно)
			if InJournalBetweenTimes('You fail', CurTime, Now) >= 0 then Wait(7000); //ждем пока откатится скил медитации
			CheckLag(15000);
		end;
		Result := True;
	end; 
end;

begin
	while not Dead do begin
		if not CheckReg(BPReg) then begin
			AddToSystemJournal('Не хватает BP');
			Exit;
		end;
		if not CheckReg(SAReg) then begin
			AddToSystemJournal('Не хватает SA');
			Exit;
		end;
		if not CheckReg(SSReg) then begin
			AddToSystemJournal('Не хватает SS');
			Exit;
		end;
		if Meditate() then begin
			CastToID(Bag);
			Wait(10000); //ждем 10 секунд после каста
		end;
	end;
end.
Код был написан в состоянии аффекта в блокноте, компилятора в жизни не видел. Все тупые ошибки программиста исправлять самостоятельно.
Помните – ничто так не защищает ваши зубы 12 часов днем и 12 часов ночью как уважительное отношение к окружающим.
"Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня"© Larry Wall
Vargul
Neophyte
Neophyte
Posts: 49
Joined: 16.09.2010 10:30

Re: Подскажите где ошибка

Post by Vargul »

Спасибо, я попробую обязательно твой скрипт.
Я увидел, что в твоем скрипте есть проверки на лаг. Я в свой добавлю, посмотрю что получится.
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Re: Подскажите где ошибка

Post by Fenix »

Врядли проверки на лаг помогут тебе от каста в себя. Просто у меня нет проверки на успешность каста, предполагается, что при отсутствии лагов каст за 5 секунд точно пройдет.
Помните – ничто так не защищает ваши зубы 12 часов днем и 12 часов ночью как уважительное отношение к окружающим.
"Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня"© Larry Wall
Post Reply