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

ObjatLayer врет нагло

тут можно задать вопрос по скриптингу
Post Reply
Spinorog
Posts: 9
Joined: 25.07.2014 15:00

ObjatLayer врет нагло

Post by Spinorog »

Товарищи,я в ступоре.. Написал себе скрипт на майнинг... Точнее переработал на стелс свой инжовый скрипт.. Проблема следующая: есть голова - Program - она читает координаты и решает куда идти копать, из неё вызывается процедура Mine, в ней чар копает и отслеживает вес и другие навороты, из этой процедуры вызываются все остальные, как то: пойти домой, разгрузиться, починиться. В начале процедуры Mine я написал такую строчку:

Kirka:=ObjAtLayer(RHandLayer);

и потом с киркой общаюсь через эту переменную. На первом прогоне до ремонта всё окей. Потом чар идет ремонтиться. Среди прочих действий берет из бэкпака молоток в руки, перед этим локально себе запоминает кирку(ну не сделал глобально - некрасиво, но не приступно) такой же строчкой:
pickaxe:=objatlayer(RhandLayer);
Дальше после прочей лабутни одевает молоток:
equip(RhandLayer, HammerID);
Чинит кирку и потом одевает:
useobject(pickaxe);

Идет копать, при этом функция Mine возобновляется с одной лишь целью - встать на предыдущие координаты, а дальше через основное тело Program вызывается по новой. Так вот и в этот момент, когда чар с киркой в руках(!!!) стоит и хочет копать, он вместо кирки одевает молоток... Ну вот объясните мне, как такое возможно???

Мне кажется я упомянул все важные моменты, чтобы не грузить вас своим кодом, но если он нужен - нет проблем.. а то я чувствую себя идиётом...
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: ObjatLayer врет нагло

Post by drabadan »

Spinorog wrote:Товарищи,я в ступоре.. Написал себе скрипт на майнинг... Точнее переработал на стелс свой инжовый скрипт.. Проблема следующая: есть голова - Program - она читает координаты и решает куда идти копать, из неё вызывается процедура Mine, в ней чар копает и отслеживает вес и другие навороты, из этой процедуры вызываются все остальные, как то: пойти домой, разгрузиться, починиться. В начале процедуры Mine я написал такую строчку:

Kirka:=ObjAtLayer(RHandLayer);

и потом с киркой общаюсь через эту переменную. На первом прогоне до ремонта всё окей. Потом чар идет ремонтиться. Среди прочих действий берет из бэкпака молоток в руки, перед этим локально себе запоминает кирку(ну не сделал глобально - некрасиво, но не приступно) такой же строчкой:
pickaxe:=objatlayer(RhandLayer);
Дальше после прочей лабутни одевает молоток:
equip(RhandLayer, HammerID);
Чинит кирку и потом одевает:
useobject(pickaxe);

Идет копать, при этом функция Mine возобновляется с одной лишь целью - встать на предыдущие координаты, а дальше через основное тело Program вызывается по новой. Так вот и в этот момент, когда чар с киркой в руках(!!!) стоит и хочет копать, он вместо кирки одевает молоток... Ну вот объясните мне, как такое возможно???

Мне кажется я упомянул все важные моменты, чтобы не грузить вас своим кодом, но если он нужен - нет проблем.. а то я чувствую себя идиётом...
проще куски кода с комментариями разбирать, а то голова програм процедура майн пересохраняю один и тот же объект по 10 раз...

могу посоветовать использовать константый тип кирки, или массив таких типов если кирки бывают разных типов, и искать эти типы в бекпаке или руках.
Я вотъ когда надоело изгаляться стал пользоваться функцией

Code: Select all

 function UseType(ObjType : Word;Color : Word) : Cardinal;
И больше не испытываю проблем, как говорится - чувствую себя сухо и комфортно.
Spinorog
Posts: 9
Joined: 25.07.2014 15:00

Re: ObjatLayer врет нагло

Post by Spinorog »

Спасибо, что отозвались!
Согласен, usetype тут может решить проблему, но обидно, что встроенная функция не работает, плюс хочу понять от каких перуетов ещё придётся на стелсе себя ограничить... Или же всё работает нормально, а я пока чего-то не понял... Это считай второй скрипт на стелсе, поэтому пока как-то кривовастенько!
Body

Code: Select all

VAR
	JailPatch : String;
	str1,str2 : String;
    val1,val2 : integer;
	i,sum,code : Integer; 
   begin
    moveOpenDoor := True;
   
    JailPatch := '2111 2263 MINE 2115 2259 ...  END'; // и всё в таком духе
	i := 1;
	sum := 0 ;
	
	JailPatch := JailPatch + ' ';
   
	repeat
		str1 := GetWord( JailPatch, i );
		if str1 <> '' then
			if str1 = 'MINE' then 
				Mine  // КОПАЕМ 
			else 
				if str1 = 'END' Then 
					i := 0 
				else
				begin
					// str1 - координата, тогда идём куда-то 
					i := i + 1;
					str2 := GetWord( JailPatch, i );
                    
                    NewMoveXY(  StrToInt64(trim(str1)), StrToInt64((str2)), True, 0, True ) 
				end               
		
		else 
         i := 0;  
      i := i + 1;
   until Dead;
   
end.
Mine

Code: Select all

Procedure Mine;

var
	cTime : TDateTime;
	Kirka : Cardinal ;
	NeedRepair, NeedUnload, EmergencyStop, NeedNewTool : boolean ;
	mxm, mym, mzm, xx, yy ,km, zm : integer;
	LastCoordX,LastCoordY : integer;
   
begin
    
	NeedRepair := False;
	NeedUnload := False;
	EmergencyStop := False;
	NeedNewTool := False;
	//Kirka:=findtype($0E85,backpack);               
    Kirka:=ObjAtLayer(RHandLayer);
	mxm := GetX(self) 
	mym := GetY(self) 
	mzm := GetZ(self)

	for yy:=-2 to 2 do
		begin
			for xx:=-2 to 2 do
			begin        
            
				cTime := Now;
				SetWarMode(false);
				
				Waittargettile(1343, (GetX(self) + xx ), ( GetY(self) + yy ), 0);
				checklag(6000);
				useobject(Kirka);
              
				WaitJournalLine(now, 'Здесь нет руды.|далеко|поля зрения|под собой|Invisibility|invisibily|Onna',0);
				
				if FoundedParamID>3 then
				begin
					EmergencyStop:=True;
					break;
				end;

				if Weight>(MaxWeight-100) then 
				begin	
					NeedUnload:=True;
					break;
				end;
				
				ClickOnObject( Kirka );
				WaitJournalLine(now, 'Прочность',0);

				if InJournalBetweenTimes(' 25%| 26%| 27%| 28%| 29%| 30%', cTime, Now)>0 then
				begin
					NeedRepair:=True;
					break;
				end;

				if InJournalBetweenTimes('  19%| 20%| 21%| 22%| 23%| 24%', cTime, Now)>0 then
				begin
					NeedNewTool := True;
					break;
				end;

				if InJournalBetweenTimes('Invisibility|invisibily|Onna', cTime, Now)>0 then
				begin
					EmergencyStop := True;
					break;
				end;

			end;
			if EmergencyStop or NeedRepair or NeedUnload or NeedNewTool then
			 break;
		end;
	  
   if EmergencyStop then
      while True do
         wait(50000);
   
	if NeedUnload or NeedRepair or NeedNewTool then
	begin
		AddToSystemJournal('Starting Pause...');
		LastCoordX:=GetX(self);
		LastCoordY:=GetY(self);
		GoHome;
		wait(500);
		UnLoadRock;
		wait(500);
		UnLoad;
		wait(500);
		if NeedRepair then
		begin
			Remont;
			NeedRepair := False;
		end;

		if NeedNewTool then
		begin
			//GetNewTool;
			NeedNewTool := False;
		end;
		
		GoMine;
		AddToSystemJournal('Resuming...')
		wait(1000);
        
		NewMoveXY( LastCoordX, LastCoordY, True, 0, True )     
		
	end;  
   
end;
Last edited by Spinorog on 28.07.2014 20:33, edited 2 times in total.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: ObjatLayer врет нагло

Post by drabadan »

я так и не увидел, где ты снова берешь кирку в руку, чтобы оттуда прочесть ее айди. Вызывая брейк ты выводишь скрипт из цикла дальше в ремонте, как я понимаю, ты берешь в руки молоток, перед возвратом в цикл у тебя читается из руки айди молотка...
Что не так?
Проверить что у тебя в руке:

Code: Select all

program WhatInLayer;
begin
 ClickOnObject(ObjAtLayer(RhandLayer));
 Wait(1000);
 AddToSystemJournal(GetName(ObjAtLayer(RhandLayer)));
end.
Spinorog
Posts: 9
Joined: 25.07.2014 15:00

Re: ObjatLayer врет нагло

Post by Spinorog »

Ох дырявая голова - забыл приложить процедуру ремонта - обратно в ней берется кирка!
Remont

Code: Select all

procedure Remont();
   
	
	var
     pickaxe : Cardinal;	
     cTime : TDateTime;
     
	begin
       
	   AddToSystemJournal('Ремонтируюсь');
	   pickaxe:=objatlayer(RhandLayer);
	   
	   useobject(CraftChest);
	   wait(500);
	   useobject(RemontBag);  
       wait(500);
	   repeat   
		  FindTypeEx(ironingot,$0000,RemontBag,false);
		  wait(500);
		  grab(finditem, 650);
		  FindType(ironingot,backpack);
	   until FindCount>0;   
       
       wait(1000);
       MoveItem(ArmRing, 0, backpack, 0,0,0)
	   wait(1000);
	   MoveItem(ArmNeck, 0, backpack, 0,0,0)
	   wait(1000);
	   MoveItem(ArmEar, 0, backpack, 0,0,0)
	   wait(1000);
	   
	   
		  equip(RhandLayer, $406722A0);
		  wait(500);

	  
	   useobject(ArmRing);
	   wait(500);
	   useobject(ArmNeck);
	   wait(500);
	   useobject(ArmEar);
	   wait(500);        
       
	   
	   repeat
       cTime := Now;
	   useskill('Arms Lore');
	   waittargettype($0E85);                         
       wait(500);
       until InJournalBetweenTimes('Unexpected|target|info', cTime, Now)<0;

	   WaitJournalLine(now, 'Вещь в идеальном|Идеальное',0);
	   
	   {useobject(MinRing);
	   wait(500);
	   useobject(MinNeck);
	   wait(500);
	   useobject(MinEar);
	   wait(500);}
	   moveitem(ArmRing,0, RemontBag,0,0,0);
	   wait(1000);
	   moveitem(ArmNeck,0, RemontBag,0,0,0);
	   wait(1000);
	   moveitem(ArmEar,0, RemontBag,0,0,0);
	   wait(1000);
	   FindType(ironingot, backpack);
	   wait(500);
	   moveitem(finditem,0, RemontBag,0,0,0);
	   wait(500);
	   checklag(6000);
	   useobject(pickaxe);
	   
	end;
Last edited by Spinorog on 28.07.2014 20:32, edited 1 time in total.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: ObjatLayer врет нагло

Post by drabadan »

Spinorog wrote:Ох дырявая голова - забыл приложить процедуру ремонта - обратно в ней берется кирка!

Code: Select all

procedure Remont();
   
	
	var
     pickaxe : Cardinal;	
     cTime : TDateTime;
     
	begin
       
	   AddToSystemJournal('Ремонтируюсь');
	   pickaxe:=objatlayer(RhandLayer);
	   
	   useobject(CraftChest);
	   wait(500);
	   useobject(RemontBag);  
       wait(500);
	   repeat   
		  FindTypeEx(ironingot,$0000,RemontBag,false);
		  wait(500);
		  grab(finditem, 650);
		  FindType(ironingot,backpack);
	   until FindCount>0;   
       
       wait(1000);
       MoveItem(ArmRing, 0, backpack, 0,0,0)
	   wait(1000);
	   MoveItem(ArmNeck, 0, backpack, 0,0,0)
	   wait(1000);
	   MoveItem(ArmEar, 0, backpack, 0,0,0)
	   wait(1000);
	   
	   
		  equip(RhandLayer, $406722A0);
		  wait(500);

	  
	   useobject(ArmRing);
	   wait(500);
	   useobject(ArmNeck);
	   wait(500);
	   useobject(ArmEar);
	   wait(500);        
       
	   
	   repeat
       cTime := Now;
	   useskill('Arms Lore');
	   waittargettype($0E85);                         
       wait(500);
       until InJournalBetweenTimes('Unexpected|target|info', cTime, Now)<0;

	   WaitJournalLine(now, 'Вещь в идеальном|Идеальное',0);
	   
	   {useobject(MinRing);
	   wait(500);
	   useobject(MinNeck);
	   wait(500);
	   useobject(MinEar);
	   wait(500);}
	   moveitem(ArmRing,0, RemontBag,0,0,0);
	   wait(1000);
	   moveitem(ArmNeck,0, RemontBag,0,0,0);
	   wait(1000);
	   moveitem(ArmEar,0, RemontBag,0,0,0);
	   wait(1000);
	   FindType(ironingot, backpack);
	   wait(500);
	   moveitem(finditem,0, RemontBag,0,0,0);
	   wait(500);
	   checklag(6000);
	   useobject(pickaxe);
	   
	end;
длинные куски кода лучше засовывать в спойлер, чтоб людям потом удобочитаемей было.

По теме - ну хз, может где-то что-то самопереписывается. У меня похожие проблемы были, но используя ЮзТайп я от них полностью на 100% ушел.
Spinorog
Posts: 9
Joined: 25.07.2014 15:00

Re: ObjatLayer врет нагло

Post by Spinorog »

drabadan wrote:
Spinorog wrote:Ох дырявая голова - забыл приложить процедуру ремонта - обратно в ней берется кирка!

Code: Select all

procedure Remont();
   
	
	var
     pickaxe : Cardinal;	
     cTime : TDateTime;
     
	begin
       
	   AddToSystemJournal('Ремонтируюсь');
	   pickaxe:=objatlayer(RhandLayer);
	   
	   useobject(CraftChest);
	   wait(500);
	   useobject(RemontBag);  
       wait(500);
	   repeat   
		  FindTypeEx(ironingot,$0000,RemontBag,false);
		  wait(500);
		  grab(finditem, 650);
		  FindType(ironingot,backpack);
	   until FindCount>0;   
       
       wait(1000);
       MoveItem(ArmRing, 0, backpack, 0,0,0)
	   wait(1000);
	   MoveItem(ArmNeck, 0, backpack, 0,0,0)
	   wait(1000);
	   MoveItem(ArmEar, 0, backpack, 0,0,0)
	   wait(1000);
	   
	   
		  equip(RhandLayer, $406722A0);
		  wait(500);

	  
	   useobject(ArmRing);
	   wait(500);
	   useobject(ArmNeck);
	   wait(500);
	   useobject(ArmEar);
	   wait(500);        
       
	   
	   repeat
       cTime := Now;
	   useskill('Arms Lore');
	   waittargettype($0E85);                         
       wait(500);
       until InJournalBetweenTimes('Unexpected|target|info', cTime, Now)<0;

	   WaitJournalLine(now, 'Вещь в идеальном|Идеальное',0);
	   
	   {useobject(MinRing);
	   wait(500);
	   useobject(MinNeck);
	   wait(500);
	   useobject(MinEar);
	   wait(500);}
	   moveitem(ArmRing,0, RemontBag,0,0,0);
	   wait(1000);
	   moveitem(ArmNeck,0, RemontBag,0,0,0);
	   wait(1000);
	   moveitem(ArmEar,0, RemontBag,0,0,0);
	   wait(1000);
	   FindType(ironingot, backpack);
	   wait(500);
	   moveitem(finditem,0, RemontBag,0,0,0);
	   wait(500);
	   checklag(6000);
	   useobject(pickaxe);
	   
	end;
длинные куски кода лучше засовывать в спойлер, чтоб людям потом удобочитаемей было.

По теме - ну хз, может где-то что-то самопереписывается. У меня похожие проблемы были, но используя ЮзТайп я от них полностью на 100% ушел.
Да, с юзтайпом сейчас тоже ушёл, конечно! Спасибо за внимание!
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: ObjatLayer врет нагло

Post by Vizit0r »

ну я не знаю, что сказать. за всю историю стрелса на ObjAtLayer никто не жаловался.

Если ты уверен, что вопрос в стелсе - давай в личку чара в нужном месте с киркой + скрипт из пары строк, демонстрирующий "баг".
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Spinorog
Posts: 9
Joined: 25.07.2014 15:00

Re: ObjatLayer врет нагло

Post by Spinorog »

Vizit0r wrote:ну я не знаю, что сказать. за всю историю стрелса на ObjAtLayer никто не жаловался.

Если ты уверен, что вопрос в стелсе - давай в личку чара в нужном месте с киркой + скрипт из пары строк, демонстрирующий "баг".
Сейчас потестирую ещё. Вечером возникла проблема с тем, что он не снимал кирку через unequip(RHandLayer), похоже что-то со слоями... сейчас пару версий проверю, и если подтвердится, то скину чара подготовленного со скриптом!
Post Reply