Товарищи,я в ступоре.. Написал себе скрипт на майнинг... Точнее переработал на стелс свой инжовый скрипт.. Проблема следующая: есть голова - Program - она читает координаты и решает куда идти копать, из неё вызывается процедура Mine, в ней чар копает и отслеживает вес и другие навороты, из этой процедуры вызываются все остальные, как то: пойти домой, разгрузиться, починиться. В начале процедуры Mine я написал такую строчку:
Kirka:=ObjAtLayer(RHandLayer);
и потом с киркой общаюсь через эту переменную. На первом прогоне до ремонта всё окей. Потом чар идет ремонтиться. Среди прочих действий берет из бэкпака молоток в руки, перед этим локально себе запоминает кирку(ну не сделал глобально - некрасиво, но не приступно) такой же строчкой:
pickaxe:=objatlayer(RhandLayer);
Дальше после прочей лабутни одевает молоток:
equip(RhandLayer, HammerID);
Чинит кирку и потом одевает:
useobject(pickaxe);
Идет копать, при этом функция Mine возобновляется с одной лишь целью - встать на предыдущие координаты, а дальше через основное тело Program вызывается по новой. Так вот и в этот момент, когда чар с киркой в руках(!!!) стоит и хочет копать, он вместо кирки одевает молоток... Ну вот объясните мне, как такое возможно???
Мне кажется я упомянул все важные моменты, чтобы не грузить вас своим кодом, но если он нужен - нет проблем.. а то я чувствую себя идиётом...
Re: ObjatLayer врет нагло
Posted: 28.07.2014 14:58
by drabadan
Spinorog wrote:Товарищи,я в ступоре.. Написал себе скрипт на майнинг... Точнее переработал на стелс свой инжовый скрипт.. Проблема следующая: есть голова - Program - она читает координаты и решает куда идти копать, из неё вызывается процедура Mine, в ней чар копает и отслеживает вес и другие навороты, из этой процедуры вызываются все остальные, как то: пойти домой, разгрузиться, починиться. В начале процедуры Mine я написал такую строчку:
Kirka:=ObjAtLayer(RHandLayer);
и потом с киркой общаюсь через эту переменную. На первом прогоне до ремонта всё окей. Потом чар идет ремонтиться. Среди прочих действий берет из бэкпака молоток в руки, перед этим локально себе запоминает кирку(ну не сделал глобально - некрасиво, но не приступно) такой же строчкой:
pickaxe:=objatlayer(RhandLayer);
Дальше после прочей лабутни одевает молоток:
equip(RhandLayer, HammerID);
Чинит кирку и потом одевает:
useobject(pickaxe);
Идет копать, при этом функция Mine возобновляется с одной лишь целью - встать на предыдущие координаты, а дальше через основное тело Program вызывается по новой. Так вот и в этот момент, когда чар с киркой в руках(!!!) стоит и хочет копать, он вместо кирки одевает молоток... Ну вот объясните мне, как такое возможно???
Мне кажется я упомянул все важные моменты, чтобы не грузить вас своим кодом, но если он нужен - нет проблем.. а то я чувствую себя идиётом...
проще куски кода с комментариями разбирать, а то голова програм процедура майн пересохраняю один и тот же объект по 10 раз...
могу посоветовать использовать константый тип кирки, или массив таких типов если кирки бывают разных типов, и искать эти типы в бекпаке или руках.
Я вотъ когда надоело изгаляться стал пользоваться функцией
function UseType(ObjType : Word;Color : Word) : Cardinal;
И больше не испытываю проблем, как говорится - чувствую себя сухо и комфортно.
Re: ObjatLayer врет нагло
Posted: 28.07.2014 16:10
by Spinorog
Спасибо, что отозвались!
Согласен, usetype тут может решить проблему, но обидно, что встроенная функция не работает, плюс хочу понять от каких перуетов ещё придётся на стелсе себя ограничить... Или же всё работает нормально, а я пока чего-то не понял... Это считай второй скрипт на стелсе, поэтому пока как-то кривовастенько!
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.
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;
Re: ObjatLayer врет нагло
Posted: 28.07.2014 16:51
by drabadan
я так и не увидел, где ты снова берешь кирку в руку, чтобы оттуда прочесть ее айди. Вызывая брейк ты выводишь скрипт из цикла дальше в ремонте, как я понимаю, ты берешь в руки молоток, перед возвратом в цикл у тебя читается из руки айди молотка...
Что не так?
Проверить что у тебя в руке:
длинные куски кода лучше засовывать в спойлер, чтоб людям потом удобочитаемей было.
По теме - ну хз, может где-то что-то самопереписывается. У меня похожие проблемы были, но используя ЮзТайп я от них полностью на 100% ушел.
Да, с юзтайпом сейчас тоже ушёл, конечно! Спасибо за внимание!
Re: ObjatLayer врет нагло
Posted: 29.07.2014 2:19
by Vizit0r
ну я не знаю, что сказать. за всю историю стрелса на ObjAtLayer никто не жаловался.
Если ты уверен, что вопрос в стелсе - давай в личку чара в нужном месте с киркой + скрипт из пары строк, демонстрирующий "баг".
Re: ObjatLayer врет нагло
Posted: 29.07.2014 11:39
by Spinorog
Vizit0r wrote:ну я не знаю, что сказать. за всю историю стрелса на ObjAtLayer никто не жаловался.
Если ты уверен, что вопрос в стелсе - давай в личку чара в нужном месте с киркой + скрипт из пары строк, демонстрирующий "баг".
Сейчас потестирую ещё. Вечером возникла проблема с тем, что он не снимал кирку через unequip(RHandLayer), похоже что-то со слоями... сейчас пару версий проверю, и если подтвердится, то скину чара подготовленного со скриптом!