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

Проверка перед стековкой итемов

тут можно задать вопрос по скриптингу
Post Reply
Oasis
Novice
Novice
Posts: 52
Joined: 02.01.2014 14:15

Проверка перед стековкой итемов

Post by Oasis »

Господа, доброго времени суток.
Помогите пожалуйста разобраться в одной не хитрой процедуре.

Code: Select all

procedure checitem;
begin
if (Count(Blank) > 4) then
  begin
  stack(Blank,LogsColor);
  wait(1500);
  FindTypeEx(Blank,LogsColor,Ground,True);
  Addtosystemjournal(IntToStr(FindFullQuantity) + ' Отмычек настругал.');
  end;
end;
(переделанный скрипт, названия в константе не менял, банки логколор)

Суть проблемы вот в чем:
Версия Стелс 4.3.6 иногда вот такая фигня: You cannot pick up this item(cannot lift item), ID: $00000000

Версия Стелс 7.7.0(Визитор дал эту версию) постоянно вот такая фигня: Some inspecific error when moving item! Code 5

У админа примерно такие ошибки на консоле из-за которых банят нещадно людей:

Code: Select all

Character 0x12EC0E tried to drop item 0x44587D5B, but had not gotten an item.

Эта ошибка не моя, она забаненого плеера=) и другого скрипта, но уверен это из-за: You cannot pick up this item(cannot lift item), ID: $00000000
Мне наменули лишь на то, что нужна проверка перед стаком, Ну не могу я понять что туда еще можно поставить, помогите други пожалуйста.

З.Ы. есть еще фишинг, он берет удочку из сундука, когда в паке 0 удочек, с сундука он ее берет в пак, потом в руки, потом опять в паке пусто и он еще 1 удочку берет в пак, по такому принципу он работает с удочками, и я смотрел как идет скрипт с киента через стелс, и увидел что иногда в паке появляются фантомные удочки, которые нельзя взять, если закрыть пак и потом открыть, то фантомная удочка пропадает, но ошибка от этого недуга вот такая: You cannot pick up this item(cannot lift item), ID: $00000000
Вот процедура что я собрал.
На сундук с удочками:

Code: Select all

procedure WoodChes;
begin
FindDistance := 2;
if FindType(fishpole, Backpack) < 1 then
begin
useobject(WoodChest);
if (Count(fishpole) > 1) then 
FindTypeEx(fishpole,$0000,WoodChest,True);
MoveItem(FindType(fishpole,WoodChest), 1, backpack, 0, 0, 0);
wait(1000);
end;
end;
На стаковку стейков, он режет рыбу сразу:

Code: Select all

procedure Rawsteak;
begin
FindDistance := 2;
if (Count(steak) > 5) then
begin
//FindTypeEx(steak,$0000,backpack,True);
Stack(steak,$0000);
wait(500);
//FindType(steak,Ground);
Addtosystemjournal(IntToStr(FindFullQuantity) + ' стейков.');
end;
end;
Я там экспериментировал, видно по отключенным строкам.
Помогите пожалуйста.
Andrew Fly
Posts: 3
Joined: 14.11.2016 10:15

Re: Проверка перед стековкой итемов

Post by Andrew Fly »

Я новичок в стелсе, мне вот интересно, есть ли какая-то функция, которая обновляет пакеты самого клиента?
Фантомные удочки в паке - чистый и частый глюк самого клиента любой версии ультимы.
Здесь бы спасла функция, которая стояла бы перед поднятием удочек, и обновляла пакеты самого клиента.
При обновлении пакетов клиента, фантом-удочка исчезла бы, и скрипт дальше адекватно работал.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Проверка перед стековкой итемов

Post by drabadan »

Andrew Fly wrote:Я новичок в стелсе, мне вот интересно, есть ли какая-то функция, которая обновляет пакеты самого клиента?
Фантомные удочки в паке - чистый и частый глюк самого клиента любой версии ультимы.
Здесь бы спасла функция, которая стояла бы перед поднятием удочек, и обновляла пакеты самого клиента.
При обновлении пакетов клиента, фантом-удочка исчезла бы, и скрипт дальше адекватно работал.

Code: Select all

if (GetType(айдишка "фантомной вещи") > 0) then MoveItem(...)

Code: Select all

Program New;
var
 fType : Word;
begin
 //Body of Script
 fType := GetType(SelfId + 100);
 AddToSystemJournal(IntToHex(fType, 4));
end.


09:43:31:293 [OSI_AR]: Compiling
09:43:31:346 [OSI_AR]: Compiled succesfully
09:43:31:346 [OSI_AR]: 0000
09:43:31:362 [OSI_AR]: Succesfully executed
Oasis
Novice
Novice
Posts: 52
Joined: 02.01.2014 14:15

Re: Проверка перед стековкой итемов

Post by Oasis »

Господа, я сделал на фишинг такой алгоритм взятия удочки:
Вот процедура одевания удочки, если нет удочки в паке, она ссылается к чектулс.
CheckEquip

Code: Select all

procedure CheckEquip;
 Var EquipPole : Cardinal;  
   begin
   if (GetType(ObjAtLayer(RhandLayer)) <> fishpole) then
   begin
   Disarm;
   wait(500);
   checktools;
   FindTypeEx(fishpole,$0000,Backpack,True);
   EquipPole := finditem; 
   Equip(RhandLayer, EquipPole);  
   wait(500);
   end;
 end;
checktools

Code: Select all

 procedure checktools;
 begin
 FindType(fishpole, Backpack);
 if (FindCount < 1) then
 begin
 WoodChes;
 end;
end;
если нет удочки, мы идем к процедуре которая берет удочку из скндука:
WoodChes

Code: Select all

procedure WoodChes;
begin
FindDistance := 2;
if FindType(fishpole, Backpack) < 1 then
begin
useobject(WoodChest);
if (Count(fishpole) > 1) then 
FindTypeEx(fishpole,$0000,WoodChest,True);
MoveItem(findtype(fishpole,WoodChest), 1, backpack, 0, 0, 0);
wait(1000);
end;
end;
Потом скрипт начинает цикл заново, и после того как одел удочку и отработал все процедуры выше, он переходит к процедуре фишинг:
procedure Fishing

Code: Select all

procedure Fishing;
begin
for a:=0 to WaterCount do
begin
if WaterPlace[a].a = 1 then begin
WaitTargetTile(WaterPlace[a].t, WaterPlace[a].x, WaterPlace[a].y, WaterPlace[a].z);
wait(5000);
if Length(LastJournalMessage)=34 then begin
WaterPlace[a].a:=0;
AddToSystemJournal('Заброкован таил');
end;
//UseType(fishpole,$0000);
UseObject(ObjAtLayer(RhandLayer));
if cut = 0 then begin
fishgrab;
end;
Rawsteak;
CheckGold;
MoveSos;
MoveMap;
seaweed;
//WoodChes;
CheckDagger;
netl;
end;
end;
end;
И все бы хорошо, но по скрипту мы еще одеваем даггер (когда даггер в руке с удочкой, пойманная рыбка автоматом режется и в пак сразу падают сырые стейки), вот чек даггер:
CheckDagger

Code: Select all

procedure CheckDagger;
begin
if (cut = 1) and (RHandLayer<>dagger) then begin
Equipt(RHandLayer, dagger);
end;
if cut = 0 then begin
unequip(RHandLayer);
end;
end;
Теперь что у нас происходит, запускаем скрипт, он берет с пака в руки даггер, если нет в паке удочек, он следует алгоритму который выше по процедурам я описал.Удочка в паке, он одевает ее поверх даггера и вот что пишет клиент:
System: You don't know how to use those items together.
Знания у меня крайне скудны, и я не могу понять, как сделать так что бы не было этого конфликта.

Вот весь скрипт на которым я поиздевался:
Скрипт

Code: Select all

Program Fising;
type
WaterRecord = Record
t,x,y,z,a: integer;
end;

var
WaterTile: array[0..50] of integer;
WaterPlace: array[0..500] of WaterRecord;
WaterCount: integer;
x,y,c,a,i: integer;
s: boolean;


{$Include 'all.inc'}

const
steak = $097A; // фишстрейк
WoodChest = $43E9E967; // сндук с удачками
mainbag = $43E9E967; //сумка в которую будет соберать гп и иагическую рыбу.
fishpole = $0DC0; //удочка(или сети)
dagger = $0F51; //дагер
Trash = $43E9E967; //Мусорка, будет выкидывать морскую траву и пустые сумки.
Map = $43E9E967; //Сундук с картами 
SOS = $43E9E967; //Сундук с сос картами
net = $43E9E967; //Сундук с сетями. если сети не нужны, ставим там айди треша
cut = 1; //1-Резать рыбу(даггер в руки), 0-не резать

procedure CheckGold;
var bag : Cardinal;

Begin
FindDistance := 2;
repeat
Ignore(mainbag);
findtype($0e75, ground);
if (FindCount >= 1) and (GetDistance(finditem) <=2) and (GetDistance(finditem) >=0) and connected and (not dead) then begin
bag := finditem;
useobject(bag);
wait(1000);
MoveItem(findtype($0EED,bag), 0, mainbag, 0, 0, 0);
wait(1000);
MoveItem(bag, 0, Trash, 0, 0, 0); 
end;

until (FindCount < 1) or dead;
End;



procedure MoveSos;
begin
FindDistance := 2;
hungry (1,ground);
wait(1000);
repeat
FindType($099F, backpack);
if (FindCount >= 1) and (GetDistance(finditem) <=2) and (GetDistance(finditem) >=0) and connected and (not dead) then begin
wait(100);
MoveItem(finditem, 0, SOS, 0, 0, 0);
wait(100);
end;
until (FindCount < 1) or dead;
end;

procedure MoveMap;
begin
FindDistance := 2;
repeat
FindType($14ED, ground);
if (FindCount >= 1) and (GetDistance(finditem) <=2) and (GetDistance(finditem) >=0) and connected and (not dead) then begin
wait(100);
MoveItem(finditem, 0, Map, 0, 0, 0);
wait(100);
end;
until (FindCount < 1) or dead;
end;

procedure seaweed;
begin
FindDistance := 2;
repeat
FindType($0DBA, ground);
if (FindCount >= 1) and (GetDistance(finditem) <=2) and (GetDistance(finditem) >=0) and connected and (not dead) then begin
wait(100);
MoveItem(finditem, 0, Trash, 0, 0, 0);
wait(100);
end;
until (FindCount < 1) or dead;
end;

procedure netl;
begin
FindDistance := 2;
repeat
FindType($0DCA, backpack);
if (FindCount >= 1) and (GetDistance(finditem) <=2) and (GetDistance(finditem) >=0) and connected and (not dead) then begin
wait(100);
MoveItem(finditem, 0, net, 0, 0, 0);
wait(100);
end;
until (FindCount < 1) or dead;
end;


procedure WoodChes;
begin
FindDistance := 2;
if FindType(fishpole, Backpack) < 1 then
begin
useobject(WoodChest);
if (Count(fishpole) > 1) then 
FindTypeEx(fishpole,$0000,WoodChest,True);
MoveItem(findtype(fishpole,WoodChest), 1, backpack, 0, 0, 0);
wait(1000);
end;
end;

procedure Rawsteak;
begin
FindDistance := 2;
if (Count(steak) > 5) then
begin
Stack(steak,$0000);
wait(500);
//FindType(steak,Ground);
Addtosystemjournal(IntToStr(FindFullQuantity) + ' стейков.');
end;
end;

procedure fishgrab;
begin
if FindType($09CC, ground) > 0 then
MoveItem(finditem, 0, mainbag, 0, 0, 0);
if FindType($09CD, ground) > 0 then
MoveItem(finditem, 0, mainbag, 0, 0, 0);
if FindType($09CE, ground) > 0 then
MoveItem(finditem, 0, mainbag, 0, 0, 0);
if FindType($09CF, ground) > 0 then
MoveItem(finditem, 0, mainbag, 0, 0, 0);
if FindType($14EB, ground) > 0 then
MoveItem(finditem, 0, mainbag, 0, 0, 0);
if FindType($0DD6, ground) > 0 then
MoveItem(finditem, 0, mainbag, 0, 0, 0);
if FindType($0DD7, ground) > 0 then
MoveItem(finditem, 0, mainbag, 0, 0, 0);
if FindType($0DD8, ground) > 0 then
MoveItem(finditem, 0, mainbag, 0, 0, 0);
end;

procedure CheckDagger;
begin
if (cut = 1) and (RHandLayer<>dagger) then begin
Equipt(RHandLayer, dagger);
end;
if cut = 0 then begin
unequip(RHandLayer);
end;
end;

procedure CheckWaterTile;
var
t: integer;
LCount: integer;
TTile: TStaticCell;
begin
TTile:=ReadStaticsXY(x, y, WorldNum);
LCount:=GetLayerCount(x, y, WorldNum);
i:=0;
while i < LCount do
begin
for t:=0 to 6 do
begin
if TTile.Statics[0].Tile=WaterTile[t] then
begin
WaterPlace[c].t:=TTile.Statics[0].Tile;
WaterPlace[c].x:=x;
WaterPlace[c].y:=y;
WaterPlace[c].z:=TTile.Statics[0].z;
WaterPlace[c].a:=1;
c:=c+1;
end;
end;
i:=i+1;
end;
end;

procedure FindWaterTile;
begin
for x:=GetX(self)-7 to GetX(self)+7 do
for y:=GetY(self)-7 to GetY(self)+7 do
begin
CheckWaterTile;
end;
WaterCount:=c-1;
end;

 procedure checktools;
 begin
 FindType(fishpole, Backpack);
 if (FindCount < 1) then
 begin
 WoodChes;
 end;
end;

procedure CheckEquip;
 Var EquipPole : Cardinal;  
   begin
   if (GetType(ObjAtLayer(RhandLayer)) <> fishpole) then
   begin
   Disarm;
   wait(500);
   checktools;
   FindTypeEx(fishpole,$0000,Backpack,True);
   EquipPole := finditem; 
   Equip(RhandLayer, EquipPole);  
   wait(500);
   end;
 end;

procedure Fishing;
begin
for a:=0 to WaterCount do
begin
if WaterPlace[a].a = 1 then begin
WaitTargetTile(WaterPlace[a].t, WaterPlace[a].x, WaterPlace[a].y, WaterPlace[a].z);
wait(5000);
if Length(LastJournalMessage)=34 then begin
WaterPlace[a].a:=0;
AddToSystemJournal('Заброкован таил');
end;
//UseType(fishpole,$0000);
UseObject(ObjAtLayer(RhandLayer));
if cut = 0 then begin
fishgrab;
end;
Rawsteak;
CheckGold;
MoveSos;
MoveMap;
seaweed;
CheckDagger;
netl;
end;
end;
end;

         

begin

s:=true;

WaterTile[0]:=6038;
WaterTile[1]:=6039;
WaterTile[2]:=6040;
WaterTile[3]:=6041;
WaterTile[4]:=6042;
WaterTile[5]:=6043;
WaterTile[6]:=6044;


FindWaterTile;

AddToSystemJournal('Найдено тайлов для рыбалки: '+IntToStr(WaterCount));
while not Dead and s do begin
if cut = 1 then begin
CheckDagger;
end;
CheckEquip;
Fishing;
end;
end.
Вроде решил проблему, в функции фиша, вместо: UseObject(ObjAtLayer(RhandLayer)); поставил: UseType(fishpole,$0000);
Post Reply