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

Помогите Бс Рекол

тут можно задать вопрос по скриптингу
Post Reply
GaZza
Posts: 2
Joined: 12.04.2016 22:09

Помогите Бс Рекол

Post by GaZza »

Code: Select all

Program New;
const
Shield=$1B76;
Ingots=$1BF2;
Tongs=$0FBB;
TinkerTools=$1EB8;
WaitTime=1500;
WaitLag=30000;
GoldCoin=$0EED;


IngotBag=$40661439; // сумка в доме

RB = $40630898; // сюда айди рунбуки
runabank = '31'; // через разор узнать номер кнопки (банк)
runadom = '31'; // через разор узнать номер кнопки (дом)
runabser = '31'; // через разор узнать номер кнопки (плавильня)

homeX=732;//Координата Х дома
homeY=1257; //Координата дома

bankX=732;//Координата Х банка
bankY=1257; //Координата У банка

bserX=732;//Координата Х плавильни
bserY=1257; //Координата У плавильни





var
BankBox:Cardinal;
goldget,ingcount:integer;

Procedure PutMoneyBank;
begin
  checklag(60000);
  AddToSystemJournal('606 Заработал ГП : '+ inttostr(CountEx(GoldCoin,$0000,backpack)));


  begin
    while (CountEx(GoldCoin,$0000,backpack) > 0) and not dead do
    begin
      checklag(60000);
      FindTypeEx (GoldCoin,$0000,Backpack,True) ;
      checklag(60000);
      MoveItem(FindItem,0,BankBox,0,0,0);
      wait(2000);
    end;
  end;
end;




procedure bank; //New
begin
  While (GetX(self) <> bankX) and (GetY(self) <> bankY) do
  begin
    UseObject(RB);
    CheckLag(60000);
    WaitGump(runabank);
    CheckLag(60000);
    Wait(3500);
    CheckLag(60000);
    PutMoneyBank;
  end;
end;

procedure dom; //New
begin
  While (GetX(self) <> homeX) and (GetY(self) <> homeY) do
  begin
    UseObject(RB);
    CheckLag(60000);
    WaitGump(runadom);
    CheckLag(60000);
    Wait(3500);
    CheckLag(60000);
  end;
end;

procedure bser; //New
begin
  While (GetX(self) <> bserX) and (GetY(self) <> bserY) do
  begin
    UseObject(RB);
    CheckLag(60000);
    WaitGump(runabser);
    CheckLag(60000);
    Wait(3500);
    CheckLag(60000);
  end;
end;

procedure GetIngots;
begin
  FindType(Ingots, IngotBag);
  While (FindQuantity > 10) do begin
    MoveItem(FindItem,1500,backpack,0,0,0);
    Wait(WaitTime);
    ingcount:=FindFullQuantity;
    Wait(WaitTime);

    Exit;
  end;
end;


procedure GetTongs;
begin
  FindType(TinkerTools, Backpack);
  UseObject(finditem);
  Wait(1000);
  CheckLag(WaitLag);
  If not IsGump then GetTongs;
  Wait(500);
  WaitGump('86'); // bs
  wait(2000);
  CloseSimpleGump(GetGumpsCount-1);
end;

procedure tt;
begin
  FindType(TinkerTools, Backpack);
  UseObject(finditem);
  Wait(1000);
  CheckLag(WaitLag);
  If not IsGump then tt;
  Wait(500);
  WaitGump('23'); // bs
  wait(2000);
  CloseSimpleGump(GetGumpsCount-1);
end;

procedure vendor_sell;
var
i:word;
begin
  i:=0;
  FindType(Shield, backpack);
  if FindCount>5 then begin
    FindType(GoldCoin, backpack);
    //SetAutoSellDelay(3);      //Установить задержку на продажу. Время задается в секундах. По умолчанию - 3 (минимальное значение).
    AutoSell($1B76,$0000,10);
    AutoSell($1B7b,$0000,10);
    //while CountEx(GoldCoin,$0000,backpack) = 0 do
    //begin
    SetContextMenuHook($00110F77,2);
    RequestContextMenu($00110F77);
    //end;

  end;

end;

procedure CraftItem;
begin
  vendor_sell;
  if Dead or not Connected then Exit;
  FindType(Ingots, Backpack);
  if (FindQuantity < 18) then begin
    bank;
    dom;
    GetIngots;
    bser;
  end;
  FindType(TinkerTools, Backpack);
  if (FindCount < 2) then begin
    tt;
  end;
  FindType(Tongs, Backpack);
  if FindCount = 0 then
  begin
    GetTongs;
  end;
  if IsGump then begin CloseSimpleGump(GetGumpsCount-1); end;
  UseType(Tongs,$FFFF);
  Wait(1250);
  CheckLag(WaitLag);
  If not IsGump or (GetGumpID(GetGumpsCount-1)<>$38920ABD) then CraftItem;
  CheckLag(WaitLag);
  WaitGump('21');
  if (not Hidden) then
  begin
    UseSkill('Hiding');
  end;
  if IsGump then begin CloseSimpleGump(GetGumpsCount-1); end;
  Wait(100);
end;





begin
  BankBox:=ObjAtLayer(BankLayer);
  while not dead do begin
    CraftItem;
  end;
end.



Не открывает Банк (реколится но не открывает) чтоб скинуть деньги
Не видит вендора чтоб продать щиты (если можно опишите как допилить , чтоб к нему подходил)
не берёт инготы

Вроде все :)

За ранее благодарю !

[Отформатировал код и добавил тег] Vizit0r
Half-Life
Novice
Novice
Posts: 86
Joined: 30.10.2012 12:06
Location: Одесса
Contact:

Re: Помогите Бс Рекол

Post by Half-Life »

Ну окей) давай тебе поможем. Для начала могу сказать, что всё что написано выше, это тихий ужас. Давай попробуем всё это аккуратненько и более-менее правильно переписать. Скрипт простенький, ничего сложного нет, поэтому, для начала определимся, что мы от него (скрипта) хотим. Исходя из беглого просмотра кода, алгоритм получился такой:
  1. Реколимся в дом.
  2. Если хватает металла берём заданное количество, если нет скрипт останавливается.
  3. Реколимся к наковальне.
  4. Куём заданное количество щитов, попутно проверяя тулзы и металл.
  5. Реколимся к вендору и продаём всё добро.
  6. Реколимся в банк и скидываем заработанное.
  7. Повторяем с п.1.
Ну что, с алгоритмом разобрались едем дальше. Я привык, что бы все скрипты имели одинаковый каркас, поэтому будем использовать его.

Code: Select all

Program MakeAndSell;

begin
  while True do begin
    //Do something
  end;
end.
Теперь добавим горсть констант и щепотку переменных)
MakeAndSell

Code: Select all

Program MakeAndSell;
{
Autor: Half-Life;
Description: Скрипт берёт из контейнера который находится дома металл, летит к кузне, делает щиты, продаёт и скидывает деньги в банк.
Тестировался на шарде UOAwakening.
UOStealthClientVersion: 7.0.3;
Warning! Будьте бдительны! - Администрация многих игровых серверов враждебно относится к использованию стелс клиента на своих серверах. Заподозрив вас в использовании стелс клиента и других неправославных программ они начинают сатанеть и в порыве слепой ярости могут попасть по вам Банхаммером;
}
const
VendorID = $0006155A; //ID Вендора которому будем продавать.
VendorContextMenu = 4; //Индекс контекстного меню отвечающего за продажу.

RuneBook = $41C61F03; //ID Рб.
RuneBookGumpID = $554B87F3; //ID гампа Рб.
RecallMethod = 7; //Через что реколиться. 5 - магия, 7 - чива.

HomeRune = 2; // Номер рунки к дому. Отсчёт начинается с единицы.
HomeX = 709; // Координата Х дома.
HomeY = 1017; // Координата У дома.

ForgeRune = 5; // Номер рунки к форджу. Отсчёт начинается с единицы.
ForgeX = 763; // Координата Х форджа.
ForgeY = 1263; // Координата У форджа.

VendorRune = 5; // Номер рунки к вендору. Отсчёт начинается с единицы.
VendorX = 977;  // Координата Х вендора.
VendorY = 510;  // Координата У вендора.

BankRune = 1; // Номер рунки к банку. Отсчёт начинается с единицы.
BankX = 722; // Координата Х банка.
BankY = 1255; // Координата У банка.

GoldType = $0EED; // Тип голда.

IngotsStorage = $416328C8; // ID Сумки с металлом которая находится в доме.
IngotsType = $1BF2; // Тип инготов.
IngotsColor = $0000; // Цвет инготов.
IngotsAmount = 370; // Количество инготов необходимое для работы скрипта.

ShieldType = $1B76;  // Тип щита. Heater shield
ShieldAmount = 20;   // Количество щитов которое будем ковать.

BlacksmithType = $0FBB; // Тип бс тулзы (tongs).
TinkerType = $1EB8; // Тип тинкер тулзы.
ToolsGumpID = $38920ABD; // ID гампа тулз.

TKNumFirst = '15'; // Первая кнопка в тинкер меню отвечающая за меню тузл.
TKNumSecond = '23'; // Вторая кнопка в тинкер меню отвечающая за крафт тиинкер тулзы.
TKBSToolsNum = '86'; // Вторая кнопка в тинкер меню отвечающая за крафт бс тулзы.

BSNumFirst = '15'; // Первая кнопка в бс меню отвечающая за меню щитов.
BSNumSecond = '16'; // Вторая кнопка в бс меню отвечающая за крафт щита.

WaitRecalTime = 2000;
WaitTime = 500;
WaitLagTime = 10000;

var
GoldTotal: Integer;

//==============================================================================
//# Utils
//==============================================================================

procedure WaitLag(WaitTime,LagTime:Word);
begin
  Wait(WaitTime);
  CheckLag(LagTime);
end;

procedure CloseGumps;
begin
  while IsGump do begin
    if not Connected then Exit;
    if not IsGumpCanBeClosed(GetGumpsCount-1) then begin
      WaitGump('0');
      Exit;
    end;
    CloseSimpleGump(GetGumpsCount-1);
  end;
end;

//==============================================================================
//# Initial
//==============================================================================

procedure Initial;
begin
  ClearSystemJournal;
  ClearJournal;
  IgnoreReset;
  AddToSystemJournal('Стартуем!');
  AddToSystemJournal('Закрываем гапмы...');
  CloseGumps;
  AddToSystemJournal('Гампы закрыты.');
end;

//==============================================================================
//# CheckStates
//==============================================================================

procedure CheckConnection;
begin
  if Connected then Exit;
  AddToSystemJournal('Нет коннекта.');
  while not Connected do begin
    AddToSystemJournal('Пытаюсь зайти на сервер...');
    Wait(5000);
  end;
  AddToSystemJournal('Есть коннект.');
  Initial;
end;

procedure CheckDead;
begin
  if not Dead then Exit;
  AddToSystemJournal('Очень жаль, но Вы умерли. Скрипт остановлен.');
  Halt;
end;

procedure CheckStates;
begin
  CheckConnection;
  CheckDead;
end;

//==============================================================================
//# Recalling
//==============================================================================

procedure RecallTo(Destination:Byte;X,Y:Word;Place:String);
begin
  AddToSystemJournal('Пытаюсь среколиться в '+Place);
  while (GetX(Self)<>X) and (GetY(Self)<>Y) do begin
    CheckStates;
    UseObject(RuneBook);
    WaitLag(WaitTime,WaitLagTime);
    if (GetGumpID(GetGumpsCount-1)<>RuneBookGumpID) then Continue;
    WaitGump(IntToStr(Destination*6+RecallMethod-6));
    WaitLag(WaitRecalTime,WaitLagTime);
  end;
  AddToSystemJournal('Среколились.');
end;

//==============================================================================
//# Check Metal
//==============================================================================

procedure CheckMetal;
var
Metal:Cardinal;
MetalCount,NeedMetalCount:Integer;
begin
  while True do begin
    CheckStates;
    NeedMetalCount:=IngotsAmount-(CountEx(IngotsType,IngotsColor,Backpack)+(CountEx(ShieldType,$0000,Backpack))*18);
    if NeedMetalCount<=0 then Exit;
    AddToSystemJournal('Проверяю металл.');
    AddToSystemJournal('Необходимо взять '+IntToStr(NeedMetalCount)+' метала.');
    repeat
      if not Connected then Exit;
      UseObject(IngotsStorage);
      WaitLag(WaitTime,WaitLagTime);
    until(LastContainer = IngotsStorage);
    FindTypeEx(IngotsType,IngotsColor,IngotsStorage,False);
    Metal:=FindItem;
    MetalCount:=FindFullQuantity;
    AddToSystemJournal('Найдено метала '+IntToStr(MetalCount));
    if MetalCount<IngotsAmount then begin
      AddToSystemJournal('На жаль у Вас нет необходимого для продолжения работы скрипта необходимого количества металла. Скрипт остановлен');
    end;
    Grab(Metal,NeedMetalCount);
  end;
end;

//==============================================================================
//# CraftToolsMenu
//==============================================================================

procedure Create(NumF,NumS,Name:String);
begin
  WaitGump(NumF);
  WaitGump(NumS);
  AddToSystemJournal(Name);
  WaitLag(WaitTime*2,WaitLagTime);
end;

// =============================================================================
// Check Tools
// =============================================================================

function CheckTools(CheckType:Word;Count:Byte):Boolean;
begin
  CheckStates;
  CheckLag(WaitLagTime);
  Result:=CountEx(CheckType,0,Backpack)>Count-1;
end;

// =============================================================================
// Create Tools
// =============================================================================

procedure CreateTKTools;
begin
  if CountEx(TinkerType,0,Backpack)=0 then begin
    AddToSystemJournal('Не найдено ни одной тинкер тулзы. '+
    'Для нормальной работы скрипта в паке должна быть хоть одна тинкер тулза.'+
    'Скрипт остановлен');
    Halt;
  end;
  while not CheckTools(TinkerType,2) do begin
    CheckStates;
    UseType(TinkerType,0);
    Create(TKNumFirst,TKNumSecond,'Create tinker tools');
  end;
end;

function CreateCraftTools():Boolean;
begin
  if not CheckTools(TinkerType,2) then CreateTKTools;
  while not CheckTools(BlacksmithType,1) do begin
    CheckStates;
    UseType(TinkerType,0);
    Create(TKNumFirst,TKBSToolsNum,'Create blacksmith tools')
  end;
  Result:=True;
end;

// =============================================================================
// Create Shields
// =============================================================================

procedure CreateShields;
begin
  AddToSystemJournal('Начинаю щиты.');
  CloseGumps;
  while True do begin
    CheckStates;
    if CountEx(ShieldType,$0000,Backpack)>=ShieldAmount then begin
      CloseGumps;
      Break;
    end;
    if not CheckTools(BlacksmithType,1) then CreateCraftTools;
    UseType(BlacksmithType,0);
    Create(BSNumFirst,BSNumSecond,'Create shields');
    WaitLag(WaitTime,WaitLagTime);                                                                                 
    AddToSystemJournal('Сделано '+IntToStr(CountEx(ShieldType,$0000,Backpack))+' щитов из '+IntToStr(ShieldAmount));
  end;
end;

// =============================================================================
// Sell Shields
// =============================================================================

procedure SellShields;
begin
  AddToSystemJournal('Продаём щиты.');
  AutoSell(ShieldType,$0000,CountEx(ShieldType,$0000,Backpack));
  while CountEx(ShieldType,$0000,Backpack)>0 do begin
    SetContextMenuHook(VendorID,VendorContextMenu);
    RequestContextMenu(VendorID);
    WaitLag(WaitRecalTime,WaitLagTime);
  end;
  AutoSell(ShieldType,$0000,0);
  AddToSystemJournal('Продали.');
end;

// =============================================================================
// Unload
// =============================================================================
procedure Unload;
var
BankBox:Cardinal;
Time:TDateTime;
begin
  repeat
    Time:=Now;
    UOSay('Bank');
    WaitLag(WaitTime,WaitLagTime);
  until(InJournalBetweenTimes('container has',Time,Now)>1);
  BankBox:=ObjAtLayer(BankLayer);
  while FindType(GoldType,Backpack)>1 do begin
    GoldTotal:=GoldTotal+FindFullQuantity;
    MoveItem(FindItem,FindFullQuantity,BankBox,0,0,0);
    WaitLag(WaitTime,WaitLagTime);
  end;
  AddToSystemJournal('TotalGold = '+IntToStr(GoldTotal));
end;

begin
  GoldTotal := 0;
  if not GetARStatus then SetARStatus(True);
  SetAutoSellDelay(3);
  CheckStates;
  Initial;
  while True do begin
    RecallTo(HomeRune,HomeX,HomeY,'Домой');
    CheckMetal;
    RecallTo(ForgeRune,ForgeX,ForgeY,'Кузня');
    CreateShields;
    RecallTo(VendorRune,VendorX,VendorY,'Вендор');
    SellShields;
    RecallTo(BankRune,BankX,BankY,'Bank');
    Unload;
  end;
end.
скрипт исправлен, ибо был заточен по PAX. (c) Vizit0r
Post Reply