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

Скрипты на варскиллы (атака и хил + парринг)

тут можно задать вопрос по скриптингу
Post Reply
PvP_Black
Posts: 3
Joined: 05.11.2009 22:11

Скрипты на варскиллы (атака и хил + парринг)

Post by PvP_Black »

Люди, я в скриптах вообще не бум-бум, есть 2 скрипта, на хил + парринг с отходом и на атаку вторым чаром, оба не хотят работать, стелс релиз 1.0, помогите, пожалуйста, скажите, где в них ошибки и как их исправить? Шард: Утопия

скрипт на атаку (не работает вообще, даже не запускается, пишет 0:52:38 [Berragwoman]: Compiling
0:52:38 [Berragwoman]: Compiler: [Error] (war_attack.sc at 33:3): Semicolon (';') expected
0:52:38 [Berragwoman]: Compiling failed
0:52:38 [Berragwoman]: Script war_attack.sc stopped successfuly, хотя на предыдущей версии стелса работал исправно):

Code: Select all

Program War_attack;

{$Include 'all.inc'} 


const
Targ = $030850A4;       // ID Чела которого бить
Sumka = $42F33D53;         // Сумка с дивами
Divik = $1401;           // Тип девайса (!!!!!! только одноручный!!!!!)
Begin

wait (1000);
   UseObject( Sumka );
   wait (1000);
   addtosystemjournal('Сумка с димвами открыта'); 
wait (1000);
while not Dead do

begin
attack( Targ );

if GetType(ObjAtLayer(RhandLayer)) <> Divik then 
begin
wait (1000);
addtosystemjournal('Берем девайс'); 
  FindType( Divik, Sumka )   
  if FindCount = 0 Then 
  begin
   addtosystemjournal('Девайсы ненайдены, скрипт остановлен'); 
   exit; 
  end  
 
  Grab(  finditem, 1 ); 
  wait( 3000 ); 
 
equipt(RhandLayer, Divik);

end;
wait (60000);   

end;


end.
скрипт на хил + парринг с отходом (не работает взятие щита из сумки, не хочет перекладывать грязные бинты в сумку, отход, вроде, норм работает, но может и другие ошибки есть?):

Code: Select all

Program Kach_heal;

{$Include 'all.inc'} 

var
i, WarX, WarY, SafeX, SafeY: integer;


const
Shield = $1B76; //ID щита
Sumka = $7FF95727;         // Сумка со щитами
Bint = $0E21;           // Тип бинта
BBint = $0F87;           // Тип грязного бинта
EnemyWarrior = $312456D;      // Чар который бьет

//ПРОВЕРКА ЩИТА, ЕСЛИ НЕТ БЕРЕМ ИЗ СУМКИ И ОДЕВАЕМ
procedure CheckShield;
begin
	CheckLag; 
	if GetType(ObjAtLayer(LhandLayer)) <> Shield then 
	begin
		UseObject( Sumka );
		wait (1000);
		addtosystemjournal('Берем щит'); 
		FindType( Shield, Sumka );
		if FindCount = 0 Then 
		begin
			addtosystemjournal('Щиты не найдены'); 
		end  
		else
		begin
			CheckLag; 
			Grab(  finditem, 1 ); 
			wait( 3000 ); 
			CheckLag; 
			equipt(LhandLayer, Shield);
		end;
	end;
end;

//ПРОВЕРКА ГРЯЗНЫХ БИНТОВ, ЕСЛИ ЕСТЬ ВЫКЛАДЫВАЕМ В СУМКУ
procedure CheckBBint;
begin
	CheckLag; 
		FindType( BBint, Backpack );
		if FindCount <> 0 Then 
		begin
			UseObject( Sumka );
			wait(1000);
			addtosystemjournal('Выкладываем бинты'); 
			while Count( BBint ) > 0 do
			begin
			   FindType( BBint, backpack ); 
			   MoveItem( finditem, 0, Sumka, 0, 0, 0 ); 
			   wait( 500 ); 
			end;
		end  
end;


// ХОДИЛКА

   procedure GotoXY(x,y,prec : integer; runflag : boolean);
   // x,y - координаты, в которые идем
   // prec - точность подхода
   // runflag - бежать или идти
   // v. 1.04 (с) Edred, скрипт портирован с инжекта
   // оригинальная версия Yoko с доработкой AGRS и Edred.
   var ld, ldc, dx, dy, mx, my : Integer;
   begin
      ld := 0; ldc := 0;
      while true do
      begin
         dx := GetX(self) - x; if dx < 0 then dx := 0 - dx;
         dy := GetY(self) - y; if dy < 0 then dy := 0 - dy;
         if dy > dx then dx := dy;
         if dx <= prec then exit;
         mx := GetX(self); my := GetY(self);
         dx := mx - x; if dx < 0 then dx := 0 - dx;
         dy := my - y; if dy < 0 then dy := 0 - dy;
         if dy > dx then dx := dy;
         if dx <= prec then exit;
         if ld = dx then begin
            ldc := ldc + 1;
            if ldc > 100 then begin addtosystemjournal( 'GotoXY: Cannot reach location!' ); exit; end;
         end
         else ld := dx;
         waitconnection(5000);
         if mx = x then begin
            if my = y then exit;
            // North
            if my > y then begin Raw_Move(0,runflag); continue; end;
            // South
            Raw_Move(4,runflag); continue;
         end;
         if mx < x then begin
            // Northeast
            if my > y then begin Raw_Move(1,runflag); continue; end;
            // East
            if my = y then begin Raw_Move(2,runflag); continue; end;
            // Southeast
            Raw_Move(3,runflag); continue;
         end;
         // Southwest
         if my < y then begin Raw_Move(5,runflag); continue; end;
         // West
         if my = y then begin Raw_Move(6,runflag); continue; end;
         // Nortwest
         Raw_Move(7,runflag); continue;
      end;
   end; 

                        // КУДА ОТХОДИТЬ
   // Определяет координаты, где стоит чар и где стоит враг. Вычисляет направление
   // и определяет координаты точки отхода. Записывает их в SafeX и SafeY.
   // Текущие координаты - в WarX, WarY.

   function CreateSafePoints : boolean;
   var tmpx, tmpy : cardinal;
   begin
      Result := false;
      WarX := GetX(self);
      WarY := GetY(self);
      tmpx := GetX(EnemyWarrior);
      tmpy := GetY(EnemyWarrior);
      if (WarX <> tmpx) AND (WarY <> tmpY) then
      begin
         AddToSystemJournal('Error: Неправильная установка чаров!');
         AddToSystemJournal('Чары должны стоять по одной из осей,');
         AddToSystemJournal('Поставьте чаров либо по направлению 1-9 (на цифровой клавиатуре),');
         AddToSystemJournal('либо по направлению 3-7.');
         exit;
      end;
      if WarY = tmpy then
      begin
         SafeY := WarY;
         if WarX < tmpx then SafeX := WarX - 1;
         if WarX > tmpx then SafeX := WarX + 1;
         if WarX = tmpx then
         begin
            AddToSystemJournal('Error: Чары стоят в одной точке!');
            exit;
         end;
      end;
      if WarX = tmpx then
      begin
         SafeX := WarX;
         if WarY < tmpy then SafeY := WarY - 1;
         if WarY > tmpy then SafeY := WarY + 1;
      end;
      Result := true;
   end; 


//ПРОВЕРКА ХП, ЕСЛИ МАЛО ОТХОДИМ, ОТХИЛИВАЕМСЯ И ПОДХОДИМ
procedure CheckHP;
begin

if (HP < 30) then
   begin
     GotoXY(SafeX,SafeY,0,false); 
                        CheckLag;
		while (HP <> MaxHP) do
			begin
				FindType( Bint, Ground ) 
				         If FindCount = 0 Then
					    begin
					    addtosystemjournal('Закончились бинты'); 
					    wait (20000);
					    end
				         Else
					    begin
				            UseFromGround(Bint, 0);
				            WaitTargetSelf;
				            wait (3500);
				            CheckLag;
				            end;
			end;
                          CheckLag;
      GotoXY(WarX,WarY,0,false); 
   end;





end;

//ЗВУК ТРЕВОГИ  
procedure alarm;
var siren: string;
begin
siren:='C:\Games\UOSoft\stealth_v1.0 (rc 1)\Stealth_v1.0 (RC 1)\alarm.wav'; //путь к файлу со звуком тревоги
playwav(siren); 
end;

Begin
if not CreateSafePoints then exit; 
i:=0;
while not Dead do
begin

if i=100 then 
		begin		
			i:=0;
			CheckBBint;
		end;
i:=i+1;


FindType( Bint, Ground ) 
         If FindCount = 0 Then
	    begin
	    alarm;
            addtosystemjournal('Закончились бинты'); 
	    wait (20000);
	    end
         Else
	    begin
            UseFromGround(Bint, 0);
            WaitTargetSelf;
            wait (3500);
            CheckLag;
	    CheckHP;
            end;


end;

end.
Заранее огромнейшее спасибо
WladL
Apprentice
Apprentice
Posts: 240
Joined: 27.07.2009 17:21
Location: DRW
Contact:

Post by WladL »

для начала сюда http://stealth.od.ua/forum/viewtopic.php?p=6284#6284
1)
0:52:38 [Berragwoman]: Compiler: [Error] (war_attack.sc at 33:3): Semicolon (';') expected

это значит в 33й строке не поставили ; в конце команды.
подозреваю тут > FindType( Divik, Sumka )
2)
не хочет перекладывать грязные бинты в сумку,
Не знаю как у Вас, а у нас тип грязных бинтов $0E20. У тебя указан

Code: Select all

BBint = $0F87;           // Тип грязного бинта
3)
не работает взятие щита из сумки,
Проверь верно ли указан тип щита, ИД сумки

Code: Select all

Shield = $1B76; //ID щита 
Sumka = $7FF95727;         // Сумка со щитами
попробуй заменить

Code: Select all

procedure CheckShield; 
begin 
   if (GetDistance(Sumka)=-1) OR (GetDistance(Sumka)>3) then begin
    addtosystemjournal('Сумка либо не найдена, либо слишком далеко');
exit;
end;
   CheckLag; 
   if GetType(ObjAtLayer(LhandLayer)) <> Shield then 
   begin 
      while FindType($FFFF,Sumka)=0 do begin 
        UseObject( Sumka ); 
        wait (1000);
      end;
      addtosystemjournal('Берем щит'); 
      FindType( Shield, Sumka ); 
      if FindCount = 0 Then 
      begin 
         addtosystemjournal('Щиты не найдены'); 
      end  
      else 
      begin 
         CheckLag; 
         MoveItem(FindItem,1,backpack,0,0,0); 
         wait( 3000 ); 
         CheckLag; 
         FindType( Shield, backpack ); 
         equip(LhandLayer, finditem); 
      end; 
   end; 
end;
Last edited by WladL on 10.11.2009 1:02, edited 1 time in total.
PvP_Black
Posts: 3
Joined: 05.11.2009 22:11

Post by PvP_Black »

С типом бинтов реально лоханулся, все кроме них проверил, тип щита и айди сумки верные, но, что самое забавное - все равно не хочет бинты грязные перекладывать в сумку, щит так брать и не хочет, по журналу вот такой цикл идет:

Code: Select all

[2:06:08] You see: a backpack
[2:06:08] System: Who would you like to heal?
[2:06:08] System: The patient seems to be quite all right
как я подразумеваю, он вместо щелчка по месту, где должен быть щит, щелкает по бэкпаку...

по-прежнему нормально только ходит и хилится, на грязные бинты, в принципе, по фигу, мне главное - чтобы щит брал в руку :(((((
WladL
Apprentice
Apprentice
Posts: 240
Joined: 27.07.2009 17:21
Location: DRW
Contact:

Post by WladL »

Вообще не понимаю, на какой стадии сбой?
чтобы щит брал в руку ((((
В пак то он щит ложит?
расставь якоря по типу таких

Code: Select all

procedure CheckShield; 
......
begin 
AddToSystemJournal('Found '+IntToSTR(FindCount)+' shields');//<=======        
 CheckLag; 
         MoveItem(FindItem,1,backpack,0,0,0); 
         wait( 3000 ); 
         CheckLag; 
         FindType( Shield, backpack ); 
         equipt(LhandLayer, finditem); 
      end;
И тогда уже предметно задавай вопрос
"Ребяты, вот тут почему-то то-то, а должно быть то-то , помогите".
и кстати, что-то я вообще не нашел в основном цикле вызова процедуры проверки щита!!!!
добавь вверх кода эту функцию

Code: Select all

function EquipShield:boolean;
begin
result:=false;
if GetType(ObjAtLayer(LhandLayer))<>Shield then begin
  FindType( Shield, backpack );
  if Finditem=0 then exit; 
  equip(LhandLayer, finditem);
end;
result:=true;
end;

Code: Select all

Begin 
if not CreateSafePoints then exit; 
i:=0; 
while not Dead do 
begin 

if i=100 then 
      begin       
         i:=0; 
         CheckBBint; 
      end; 
i:=i+1; 


FindType( Bint, Ground ) 
         If FindCount = 0 Then 
       begin 
       alarm; 
            addtosystemjournal('Закончились бинты'); 
       wait (20000); 
       end 
         Else 
       begin 
            UseFromGround(Bint, 0); 
            WaitTargetSelf; 
            wait (3500); 
            CheckLag; 
       CheckHP; 
            end; 
  if not EquipShield then CheckShield;//<==================одеваем щит

end;
Last edited by WladL on 10.11.2009 1:01, edited 1 time in total.
PvP_Black
Posts: 3
Joined: 05.11.2009 22:11

Post by PvP_Black »

Все равно не работает :((( Якорь только в то место поставил, куда ты в примере привел, но что-то я не увидел никакой роли этого якоря, в журнал ничего не добавлялось, щит брать по-прежнему не хочет, при добавлении проверки щита (последние 2 твоих кода) делают ситуацию немного лучше, в журнал начинает писаться "берем щит", однако никакого щита никто не берет, ошибок никаких скрипт не выдает, все никак проблему понять не могу, попробовал переписать под скрипт на атаку, получилось следующее:

Code: Select all

Program Parrying;

{$Include 'all.inc'} 


const
Sumka = $42F33D54;         // Сумка с щитами
Shield = $1B76;           // Тип Щита
Begin

wait (1000);
   UseObject( Sumka );
   wait (1000);
   addtosystemjournal('Сумка со щитами открыта'); 
wait (1000);
while not Dead do

if GetType(ObjAtLayer(LhandLayer)) = 0 Then
begin
wait (1000);
addtosystemjournal('Берем щит'); 
  FindType( Shield, Sumka )   
  if FindCount = 0 Then 
  begin
   addtosystemjournal('Щиты ненайдены, скрипт остановлен'); 
   exit; 
  end;  
 
  Grab(  finditem, 1 ); 
  wait( 3000 ); 
 
equipt(LhandLayer, Shield);

end;
wait(60000);   

end.
Запустил его в параллель с хилом и отходом, все работает, щит берется, но опять же проблемы: щит он, зачем-то, берет дважды (первый одевает, а второй в бэкпак улетает, не понимаю, как это исправить, вроде, по условиям нормально все) и со временем скрипт сам останавливается, щитов туева гора, поэтому не думаю, что скрипт останавливается из-за отсутствия щитов :( мозги кипят уже...
WladL
Apprentice
Apprentice
Posts: 240
Joined: 27.07.2009 17:21
Location: DRW
Contact:

Post by WladL »

блин, и я повелся :shock:
сравни 2 функции . И посмотри какая из них у тебя юзается при одевании щита (главное с какими параметрами!)

function equip(Layer: Byte; Obj: Cardinal): Boolean; // Одеть вещь на указанный слой
function equipt(Layer: Byte; ObjType: Word): Boolean; // Одеть вещь найденную в бакпаке на указанный слой
"Как хочешь ты трудись;
Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
Post Reply