Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7
Stealth 6
Stealth 6
для тестов и создания шаблонов скриптов нужны любители любых языков, кроме паскаля и C# (тут уже все написано). В частности, интересны грамотный питонщик, java и т.д.
Писать в личку, а лучше прямо в аську.
Писать в личку, а лучше прямо в аську.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re: Stealth 6
процентов так на 99. 1% я оставлю на то, что где-то я что-то не вспомню и изменю. Но надеюсь что не будет такого.peis wrote:Также интересно будут ли нормально работать старые скрипты в новом стелсе
Вот с питоном сложнее, но это проблемы тех, кто хочет в нем писать скрипты. Захотят - напишут прослойку, типа той, что мы сделали для дельфей и c#. Пока питонщики молчат.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re: Stealth 6
принимаю заявки на переписывание нескольких больших и сложных скриптов в новом формате на Delphi\c#, для демонстрации. Задача - чтобы использовалось как можно больше скриптовых возможностей. туда же прицеплю GUI и всякое такое.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re: Stealth 6
Ламбер\майнинг + крафт тулсов. Вроде как и не сложно, но потом можно будет "почерпнуть"!Vizit0r wrote:принимаю заявки на переписывание нескольких больших и сложных скриптов в новом формате на Delphi\c#, для демонстрации. Задача - чтобы использовалось как можно больше скриптовых возможностей. туда же прицеплю GUI и всякое такое.
Code: Select all
Program Mining_Bot_New_2; // -- V nazvanii "2" - eto nomer konfiga dlya bota.
const
RESP_WAITING_TIME_MINS = 5; // -- Prodolzjitelnost' ozjidaniya respa v minutah.
MY_MAX_WEIGHT = 200; // -- Maks ves pri kotorom vugryzka.
AVERAGE_LAG_MS = 1500; // -- Ne Trogat'.
BANK_ID = $400DBA9E; // -- Bank id personaja.
CURRENT_BOT = 2; // -- poryadkoviy nomer bota. 1, 2, 3.
{===========================================================================================================================}
{========CHAT SETUP================}
{MINING PART}
M_nothing1 = 'is no metal';
M_nothing2 = 'too far';
M_nothing3 = 'mining in rock';
M_nothing4 = 'cannot mine';
M_nothing5 = 'no line';
M_nothing6 = 'reach';
M_fizzles1 = 'loosen some rocks';
M_needwait = 'not to mine';
M_success = 'in your pack.';
{LUMBER PART}
Msg1 = 'переместили';
Msg2 = 'You put';
Msg3 = 'hack';
Msg4 = 'Target cannot be seen';
Msg5 = 'There are no';
Msg6 = 'not enough wood here to';
Msg7 = 'use an axe on';
Msg8 = 'That is too far away';
{====CHAT SETUP END=================}
iTTileCount = 39;
iRadiusSearch = 30; // Радиус (не диаметр!) поиска деревьев в тайлах, относительно персонажа
Logs = $1BDD; // Тип логов
Raw_Ore_Type = $19B8;
Ingot_Type = $1BEF;
{END CONSTANTS}
{===========================================================================================================================}
type WayPoints = record
x, y : Integer;
end;
type TItemInfo = Record
TypeOfItem : Cardinal;
CategoryBtn, ItemBtn : Integer;
end;
{===========================================================================================================================}
{VARS}
var
Hatchet, Pickaxe, Tinker_Tools, Carpentry_Tools : TItemInfo;
WayPoint : array[0..12] of WayPoints;
i, minret, Start_Mine, End_Mine, Bank_Tile_X, Bank_Tile_Y : Integer;
FoundTilesArray : TFoundTilesArray;
TempFoundTilesArray, ChopTilesArray : array of TFoundTile;
TreeTile:array [0..iTTileCount] of word;
ctime : TDateTime;
{END VARS}
{===========================================================================================================================}
{INITIATION SECTION}
procedure InitBotSystem;
begin
if (CURRENT_BOT = 1) then
begin
Start_Mine := 1;
End_Mine := 3;
Bank_Tile_X := 2512;
Bank_Tile_Y := 548;
end;
if (CURRENT_BOT = 2) then
begin
Start_Mine := 4;
End_Mine := 7;
Bank_Tile_X := 2512;
Bank_Tile_Y := 553;
end;
if (CURRENT_BOT = 3) then
begin
Start_Mine := 8;
End_Mine := 9;
Bank_Tile_X := 2512;
Bank_Tile_Y := 559;
end;
end;
procedure InitTools;
begin
Hatchet.TypeOfItem := $0F43;
Hatchet.CategoryBtn := 6;
Hatchet.ItemBtn := 15;
Pickaxe.TypeOfItem := $0E86;
Pickaxe.CategoryBtn := 8;
Pickaxe.ItemBtn := 57;
Tinker_Tools.TypeOfItem := $1EB8;
Tinker_Tools.CategoryBtn := 8;
Tinker_Tools.ItemBtn := 25;
Carpentry_Tools.TypeOfItem := $1034;
Carpentry_Tools.CategoryBtn := 8;
Carpentry_Tools.ItemBtn := 33;
end;
procedure InitWaypoints;
begin
WayPoint[0].x := Bank_Tile_X;
WayPoint[0].y := Bank_Tile_Y;
//______Minoc Bank__________//
WayPoint[1].x := 2466;
WayPoint[1].y := 556;
//______Crafting Point______//
WayPoint[2].x := 2570;
WayPoint[2].y := 477;
WayPoint[3].x := 2573;
WayPoint[3].y := 477;
WayPoint[4].x := 2575;
WayPoint[4].y := 478;
WayPoint[5].x := 2577;
WayPoint[5].y := 480;
WayPoint[6].x := 2573;
WayPoint[6].y := 480;
WayPoint[7].x := 2569;
WayPoint[7].y := 480;
WayPoint[8].x := 2565;
WayPoint[8].y := 485;
WayPoint[9].x := 2565;
WayPoint[9].y := 485;
WayPoint[10].x := 2569;
WayPoint[10].y := 486;
//______Mining Points________//
WayPoint[11].x := 2572;
WayPoint[11].y := 475;
//______Smelting Point______//
WayPoint[12].x := 2435;
WayPoint[12].y := 477;
//_______Lumber Point________//
end;
procedure InitTTilesArray;
begin
TreeTile[0]:=3274;
TreeTile[1]:=3275;
TreeTile[2]:=3277;
TreeTile[3]:=3280;
TreeTile[4]:=3283;
TreeTile[5]:=3286;
TreeTile[6]:=3288;
TreeTile[7]:=3290;
TreeTile[8]:=3293;
TreeTile[9]:=3296;
TreeTile[10]:=3299;
TreeTile[11]:=3302;
TreeTile[12]:=3320;
TreeTile[13]:=3323;
TreeTile[14]:=3326;
TreeTile[15]:=3329;
TreeTile[16]:=3393;
TreeTile[17]:=3394;
TreeTile[18]:=3395;
TreeTile[19]:=3396;
TreeTile[20]:=3415;
TreeTile[21]:=3416;
TreeTile[22]:=3417;
TreeTile[23]:=3418;
TreeTile[24]:=3419;
TreeTile[25]:=3438;
TreeTile[26]:=3439;
TreeTile[27]:=3440;
TreeTile[28]:=3441;
TreeTile[29]:=3442;
TreeTile[30]:=3460;
TreeTile[31]:=3461;
TreeTile[32]:=3462;
TreeTile[33]:=3476;
TreeTile[34]:=3478;
TreeTile[35]:=3480;
TreeTile[36]:=3482;
TreeTile[37]:=3484;
TreeTile[38]:=3492;
TreeTile[39]:=3496;
SetArrayLength(ChopTilesArray, 1);
end;
// Поиск деревьев
procedure SearchTree;
var
i, j : Integer;
iFoundTilesArrayCount : word;
iTempFoundTilesArrayCount : Integer;
begin
for i:= 0 to iTTileCount do
begin
iFoundTilesArrayCount := GetStaticTilesArray((GetX(Self) - iRadiusSearch), (GetY(Self) - iRadiusSearch), (GetX(Self) + iRadiusSearch), (GetY(Self) + iRadiusSearch), 1, TreeTile[i], FoundTilesArray);
if iFoundTilesArrayCount > 0 then
begin
SetArrayLength(TempFoundTilesArray, Length(TempFoundTilesArray) + iFoundTilesArrayCount);
for j := 0 to iFoundTilesArrayCount - 1 do
begin
TempFoundTilesArray[iTempFoundTilesArrayCount + j] := FoundTilesArray[j];
end;
iTempFoundTilesArrayCount := iTempFoundTilesArrayCount + iFoundTilesArrayCount;
end;
end;
//AddToSystemJournal('Найдено деревьев: ' + IntToStr(iTempFoundTilesArrayCount));
end;
// Чистим записи дубликаты (Vizit0r :P)
procedure ClearDuplicate;
var
i, j : Integer;
begin
ChopTilesArray[Length(ChopTilesArray) - 1] := TempFoundTilesArray[0];
for i:=1 to Length(TempFoundTilesArray) - 1 do
begin
for j:=0 to Length(ChopTilesArray) - 1 do
if (ChopTilesArray[j] = TempFoundTilesArray[i]) then
break;
if j > Length(ChopTilesArray) - 1 then
begin
SetArrayLength(ChopTilesArray, Length(ChopTilesArray) + 1);
ChopTilesArray[Length(ChopTilesArray) - 1] := TempFoundTilesArray[i];
end;
end;
//AddToSystemJournal('После отсеивания дубликатов, осталось деревьев:' + IntToStr(Length(ChopTilesArray)));
end;
// Возводим в степень 2 (Shinma)
function sqr(a:LongInt):LongInt;
begin
result:=a*a;
end;
// Вычисляем длину вектора (Shinma)
function vector_length(c_2:TFoundTile):LongInt;
begin
result:=Round(sqrt(sqr(GetX(self)-c_2.X)+sqr(GetY(self)-c_2.Y)));
end;
// «Быстрая сортировка» по длине вектора, от центра последней поляны ко всем собранным координатам деревьев
procedure QuickSort(A: array of TFoundTile; l,r: integer);
var
i, j: Integer;
x, y: TFoundTile;
begin
i := l;
j := r;
x := A[((l + r) div 2)];
repeat
while vector_length(A[i]) < vector_length(x) do inc(i);
while vector_length(x) < vector_length(A[j]) do dec(j);
if not (i>j) then
begin
y:= A[i];
A[i]:= A[j];
A[j]:= y;
inc(i);
dec(j);
end;
until i>j;
if l < j then QuickSort(ChopTilesArray, l,j);
if i < r then QuickSort(ChopTilesArray, i,r);
end;
// Находим, исключаем дубликаты, сортируем деревья
procedure MarkTrees;
begin
NewMoveXY(WayPoint[12].x, WayPoint[12].y, true, 1, true);
SearchTree;
AddToSystemJournal('Trees found: ' + IntToStr(Length(TempFoundTilesArray)));
ClearDuplicate;
QuickSort(ChopTilesArray, 0, Length(ChopTilesArray) - 1);
end;
procedure WaitAverageLag(Lag : Integer);
begin
Wait(Lag);
//UOSay(IntToStr(Lag));
end;
function ItemMoved(PreviousWeight : Integer): Boolean;
begin
Result := False;
if Weight <> PreviousWeight then Result := True;
end;
procedure CallBank;
begin
WaitAverageLag(AVERAGE_LAG_MS);
UOSay('BANK');
WaitAverageLag(AVERAGE_LAG_MS);
end;
{INITIATION SECTION END}
{===========================================================================================================================}
{GATHERING SECTION}
function ToolCount(Tool, Container : Cardinal) : Integer;
begin
FindType(Tool, Container);
Result := FindCount;
end;
procedure LoadTools(Tool : Cardinal);
var tmpId : Cardinal;
begin
NewMoveXY(WayPoint[0].x, WayPoint[0].y, true, 0, true);
WaitAverageLag(AVERAGE_LAG_MS);
CallBank;
WaitAverageLag(AVERAGE_LAG_MS);
tmpId := FindType($0E75, BANK_ID);
UseObject(tmpId);
WaitAverageLag(AVERAGE_LAG_MS);
if FindType(Tool, tmpId) > 0 then
begin
While ToolCount(Tool, backpack) < 5 do
begin
MoveItem(FindType(Tool, tmpId), 1, backpack, 0,0,0);
Wait(1500);
end;
end;
AddToSystemJournal('Zagruzil Tool');
end;
procedure EquipTool(Tool : Cardinal);
var
xc, yc : Integer;
begin
if not ((GetType(ObjAtLayer(RhandLayer)) = Tool) or (GetType(ObjAtLayer(LhandLayer)) = Tool)) then
begin
if ToolCount(Tool, backpack) <= 3 then
begin
xc := GetX(self);
yc := GetY(self);
WaitAverageLag(AVERAGE_LAG_MS);
LoadTools(Tool);
WaitAverageLag(AVERAGE_LAG_MS);
NewMoveXY(xc, yc, true, 0, true);
end;
UseObject(FindType(Tool, backpack));
WaitAverageLag(AVERAGE_LAG_MS*2);
end;
end;
// Рубим дерево (Edred)
function LumbCurTree(tile,x,y,z : Integer) : Boolean;
// рубим указанный тайл. Возвращаем false если перевес или чар мертв.
var
q, m1, m2, m3, m4, m5, m6, m7, m8, CountFizzle, NextTree : integer;
begin
Result := true;
CountFizzle := 0;
repeat
if WarMode = true then SetWarMode(false);
if TargetPresent then CancelTarget;
ctime := Now;
if Dead then begin Result := false; exit; end;
EquipTool(Hatchet.TypeOfItem);
//if IsGump then GumpHandling;
if not TargetPresent then UseObject(ObjAtLayerEx(LhandLayer,self));
WaitForTarget(5000);
//Guards;
If TargetPresent then TargetToTile(tile, x, y, z);
q := 0;
repeat
wait(100);
q := q + 1;
//CallGuards;
m1 := InJournalBetweenTimes(Msg1, ctime, Now);
m2 := InJournalBetweenTimes(Msg2, ctime, Now);
m3 := InJournalBetweenTimes(Msg3, ctime, Now);
m4 := InJournalBetweenTimes(Msg4, ctime, Now);
m5 := InJournalBetweenTimes(Msg5, ctime, Now);
m6 := InJournalBetweenTimes(Msg6, ctime, Now);
m7 := InJournalBetweenTimes(Msg7, ctime, Now);
m8 := InJournalBetweenTimes(Msg8, ctime, Now);
until (m1<>-1) or (m2<>-1) or (m3<>-1) or (m4<>-1) or (m5<>-1) or (m6<>-1) or (m7<>-1) or (m8<>-1) or Dead or (q > 50);
if (m2<>-1) or (m3<>-1) or (m4<>-1) then CountFizzle := CountFizzle + 1;
if Dead or (Weight > MY_MAX_WEIGHT) then begin Result := false; exit; end;
if (q > 200) then NextTree := NextTree + 1;
until (m5<>-1) OR (m6<>-1) OR (m7<>-1) OR (m8<>-1) OR (CountFizzle = 10) OR (NextTree > 3);
if NextTree >= 3 then NextTree := 0;
end;
function MiningAround : Integer ;
// копаем вокруг чара
// параметр - максимальный вес.
// возвращаем:
// 1 - вокруг чара все вскопано успешно
// 2 - превышен максимальный вес
// 3 - чар под атакой
// 4 - нет кирки
var il, k, r, x, y, xnk, ynk : Integer;
var xn, yn : Word;
var mn1, mn2, mn3, mn4, mn5, mn6, mf1, mw1, ms1 : Integer;
var ctime : TDateTime;
var TileInfo : TStaticCell;
//var gi : TGumpInfo;
begin
Result := 1;
//addtosystemjournal(inttostr(GetX(self)) + ' ' + inttostr(GetY(self)) + ': Начинаем обкопку. Вес чара: ' + inttostr(Weight));
for x := -2 to 2 do
begin
for y := -2 to 2 do
begin
r := 0;
repeat
if TargetPresent then CancelTarget;
if WarMode = true then SetWarMode(false);
ctime := Now;
EquipTool(Pickaxe.TypeOfItem);
while IsGump do
begin
CloseSimpleGump(GetGumpsCount-1);
Wait(100);
end;
///////////////////////////
if not Dead then
begin
xnk := GetX(self) + x;
ynk := GetY(self) + y;
xn := xnk;
yn := ynk;
TileInfo := ReadStaticsXY(xn, yn, 0);
for il := 0 to TileInfo.StaticCount - 1 do
begin
//AddToSystemJournal(IntToStr(il));
if (TileInfo.Statics[il].Tile >= 1339) and (TileInfo.Statics[il].Tile <= 1359) then
begin
WaitTargetTile(TileInfo.Statics[il].Tile,TileInfo.Statics[il].x,TileInfo.Statics[il].y,TileInfo.Statics[il].z);
UseObject(ObjAtLayer(RHandLayer));
end;
end;
end;
///////////////////////////
k := 0;
repeat
wait(10);
k := k + 1;
mn1 := InJournalBetweenTimes(M_nothing1, ctime, Now);
mn2 := InJournalBetweenTimes(M_nothing2, ctime, Now);
mn3 := InJournalBetweenTimes(M_nothing3, ctime, Now);
mn4 := InJournalBetweenTimes(M_nothing4, ctime, Now);
mn5 := InJournalBetweenTimes(M_nothing5, ctime, Now);
mn6 := InJournalBetweenTimes(M_nothing6, ctime, Now);
mf1 := InJournalBetweenTimes(M_fizzles1, ctime, Now);
ms1 := InJournalBetweenTimes(M_success, ctime, Now);
until (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1) or (mf1<>-1) or (ms1<>-1) or Dead or (k > 200);
if InJournalBetweenTimes('heavy', ctime, Now) <> -1 then
begin
Result := 6
exit;
end;
if Weight > MY_MAX_WEIGHT then
begin
Result := 2;
exit;
end;
if (mf1<>-1) then
begin
r := r + 1;
if r >= 10 then break
else continue;
end;
if (mw1<>-1) then wait(2000);
until (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1);
end;
end;
end;
procedure Unload;
var k : Integer;
begin
while FindTypeEx(Raw_Ore_Type, $0000, backpack, false) > 0 do
begin
NewMoveXY(WayPoint[1].x, WayPoint[1].y, true, 0, true);
WaitAverageLag(AVERAGE_LAG_MS);
UseObject(FindItem);
WaitAverageLag(AVERAGE_LAG_MS);
end;
while FindType(Raw_Ore_Type, backpack) > 0 do
begin
NewMoveXY(WayPoint[0].x, WayPoint[0].y, true, 0, true);
CallBank;
WaitAverageLag(AVERAGE_LAG_MS*2);
for k := 0 to 5 do
begin
UseObject(FindType($097B, BANK_ID));
WaitAverageLag(AVERAGE_LAG_MS);
end;
MoveItems(backpack, Raw_Ore_Type, $FFFF, BANK_ID, 0,0,0, 1200);
end;
while FindType(Ingot_Type, backpack) > 0 do
begin
NewMoveXY(WayPoint[0].x, WayPoint[0].y, true, 0, true);
CallBank;
MoveItems(backpack, Ingot_Type, $FFFF, BANK_ID, 0,0,0, 1200);
end;
while FindType(Logs, backpack) > 0 do
begin
NewMoveXY(WayPoint[0].x, WayPoint[0].y, true, 0, true);
CallBank;
MoveItems(backpack, Logs, $FFFF, BANK_ID, 0,0,0, 1200);
end;
end;
procedure GetLogs;
begin
for i := 0 to Length(ChopTilesArray) - 1 do
begin
NewMoveXY(ChopTilesArray[i].x, ChopTilesArray[i].y, true, 1, true);
if not LumbCurTree(ChopTilesArray[i].tile, ChopTilesArray[i].x, ChopTilesArray[i].y, ChopTilesArray[i].z)
or (GetQuantity(FindType(Logs, backpack)) > 80) then
begin
Unload;
break;
end;
end;
end;
{GATHERING SECTION END}
{===========================================================================================================================}
{CRAFTING SECTION}
procedure CraftTool(Tool : Cardinal; CategoryBtn, ItemBtn : Integer);
var
gi : TGumpInfo;
begin
while IsGump do CloseSimpleGump(GetGumpsCount-1);
WaitAverageLag(AVERAGE_LAG_MS);
Useobject(FindType(Tool, backpack));
WaitAverageLag(AVERAGE_LAG_MS*2);
GetGumpInfo(GetGumpsCount-1, gi);
WaitAverageLag(AVERAGE_LAG_MS);
NumGumpButton(GetGumpsCount-1, gi.GumpButtons[CategoryBtn].return_value);
WaitAverageLag(AVERAGE_LAG_MS*2);
NumGumpButton(GetGumpsCount-1, gi.GumpButtons[ItemBtn].return_value);
WaitAverageLag(AVERAGE_LAG_MS*3);
end;
procedure LoadCraftResources;
begin
while GetQuantity(FindType(Logs, backpack)) < 100 do
begin
CallBank;
if GetQuantity(FindItem) > 100 then break;
MoveItem(FindType(Logs, BANK_ID), 25, backpack, 0,0,0);
WaitAverageLag(AVERAGE_LAG_MS);
end;
while GetQuantity(FindType(Ingot_Type, backpack)) < 100 do
begin
CallBank;
if GetQuantity(FindItem) > 100 then break;
MoveItem(FindType(Ingot_Type, BANK_ID), 25, backpack, 0,0,0);
WaitAverageLag(AVERAGE_LAG_MS);
end;
end;
function Count(Tool, Container : Cardinal) : Integer;
var
tmpInt : Integer;
begin
FindType(Tool, Container);
tmpInt := FindCount;
FindType(Tool, Backpack);
Result := tmpInt + FindCount;
end;
procedure ToolsCheck;
var
tmpContainer : Cardinal;
PreviousWeight : Integer;
begin
NewMoveXY(WayPoint[0].x, WayPoint[0].y, true, 0, true);
WaitAverageLag(AVERAGE_LAG_MS);
CallBank;
tmpContainer := FindType($0E75, BANK_ID);
UseObject(tmpContainer);
WaitAverageLag(AVERAGE_LAG_MS);
while GetQuantity(FindType(Logs, BANK_ID)) < 500 do GetLogs;
//UOSay(IntToStr(Count(Dig_Tool_Type, tmpContainer)));
while Count(Pickaxe.TypeOfItem, tmpContainer) < 25 do
begin
LoadCraftResources;
if FindType(Tinker_Tools.TypeOfItem, backpack) <= 0 then MoveItem(FindType(Tinker_Tools.TypeOfItem, tmpContainer), 1, backpack, 0,0,0);
CraftTool(Tinker_Tools.TypeOfItem, Pickaxe.CategoryBtn, Pickaxe.ItemBtn);
WaitAverageLag(AVERAGE_LAG_MS*2);
end;
while Count(Hatchet.TypeOfItem, tmpContainer) < 15 do
begin
LoadCraftResources;
if FindType(Carpentry_Tools.TypeOfItem, backpack) <= 0 then MoveItem(FindType(Carpentry_Tools.TypeOfItem, tmpContainer), 1, backpack, 0,0,0);
CraftTool(Carpentry_Tools.TypeOfItem, Hatchet.CategoryBtn, Hatchet.ItemBtn);
WaitAverageLag(AVERAGE_LAG_MS*2);
end;
while Count(Tinker_Tools.TypeOfItem, tmpContainer) < 8 do
begin
LoadCraftResources;
if FindType(Tinker_Tools.TypeOfItem, backpack) <= 0 then MoveItem(FindType(Tinker_Tools.TypeOfItem, tmpContainer), 1, backpack, 0,0,0);
CraftTool(Tinker_Tools.TypeOfItem, Tinker_Tools.CategoryBtn, Tinker_Tools.ItemBtn);
WaitAverageLag(AVERAGE_LAG_MS*2);
end;
while Count(Carpentry_Tools.TypeOfItem, tmpContainer) < 8 do
begin
LoadCraftResources;
if FindType(Tinker_Tools.TypeOfItem, backpack) <= 0 then MoveItem(FindType(Tinker_Tools.TypeOfItem, tmpContainer), 1, backpack, 0,0,0);
CraftTool(Tinker_Tools.TypeOfItem, Carpentry_Tools.CategoryBtn, Carpentry_Tools.ItemBtn);
WaitAverageLag(AVERAGE_LAG_MS*2);
end;
Unload;
while FindType($FFFF, backpack) > 0 do
begin
PreviousWeight := Weight;
MoveItem(FindItem, 0, tmpContainer, 0,0,0);
WaitAverageLag(AVERAGE_LAG_MS);
if not ItemMoved(PreviousWeight) then CallBank;
end;
end;
{CRAFTING SECTION END}
{===========================================================================================================================}
{WAITING SECTION}
function getSkill(Skill : Integer) : String;
begin
if Skill = 0 then Result := 'Hiding';
if Skill = 1 then Result := 'Detecting Hidden';
if Skill = 2 then Result := 'Spirit Speak';
end;
procedure WaitForResp;
var randomSkill : String;
var k, kn : Integer;
begin
Unload;
WaitAverageLag(AVERAGE_LAG_MS);
randomSkill := getSkill(Random(3));
k := 0;
kn := RESP_WAITING_TIME_MINS*10;
repeat
UseSkill(randomSkill);
WaitAverageLag(AVERAGE_LAG_MS*4);
k := k + 1;
until (k > kn) or Dead;
end;
{WAITING SECTION END}
{===========================================================================================================================}
{MAIN LOOP}
begin
InitBotSystem;
InitTools;
InitTTilesArray;
InitWaypoints;
//CallBank;
MarkTrees;
while not Dead do
begin
for i := Start_Mine to End_Mine do
begin
ToolsCheck;
NewMoveXY(WayPoint[i].x, WayPoint[i].y, true, 0, true);
repeat
minret := MiningAround;
if minret = 2 then Unload;
until (minret = 2) or (minret = 1);
end;
WaitForResp;
end;
end.
{MAIN LOOP END}
Re: Stealth 6
Крафт скроллов с GUI.Vizit0r wrote:принимаю заявки на переписывание нескольких больших и сложных скриптов в новом формате на Delphi\c#, для демонстрации. Задача - чтобы использовалось как можно больше скриптовых возможностей. туда же прицеплю GUI и всякое такое.
Code: Select all
Program CraftScrollov;
const
RegChest = $4057AA11;
LoadRegAmount = 750;
type TReagentInfo = Record
Name : String;
TypeOfReagent : Cardinal;
end;
type TItemInfo = Record
Name : String;
Tool, Container, TypeOfItem : Cardinal;
CountOfReagent, QuantityOfReg, CraftGump, CategoryBtn, ItemBtn, SmeltBtn : Integer;
Reg : array[0..9] of TReagentInfo;
end;
var
Item : TItemInfo;
Food : array[0..4] of Cardinal;
CraftForm : TSTForm;
CraftButton : TSTButton;
CraftItemTField : TSTEdit;
CraftItemQuantityTField : TSTEdit;
CraftQuantityLabel : TSTLabel;
CraftItemNameLabel : TSTLabel;
CraftChoicesLabel : TSTLabel;
CraftChoiceDescriptionLabel : TSTLabel;
CounterLabel : TSTLabel;
HowManyLeftToDoLabel : TSTLabel;
RegLabel : array[0..9] of TSTLabel;
RegLabelChest : array[0..9] of TSTLabel;
CurrentSkillLevelLabel : TSTLabel;
StatisticsLabel : TSTLabel;
StatisticsLabelChest : TSTLabel;
UsesLeftLabel : TSTLabel;
TriesMade : TSTLabel;
procedure initFood;
begin
Food[0] := $09B7;
Food[1] := $1608;
Food[2] := $09D0;
Food[3] := $160A;
Food[4] := $097B;
end;
procedure GetTItemInfo(Choice : String);
begin
if (Choice = 'recall') then
begin
Item.Name := 'Recall cкролл';
Item.Tool := $0FBF;
Item.CountOfReagent := 4;
Item.Container := $0E76;
Item.TypeOfItem := $1F4C;
Item.QuantityOfReg := 1;
Item.CraftGump := 1044009;
Item.CategoryBtn := 6;
Item.ItemBtn := 30;
Item.Reg[0].TypeOfReagent := BM;
Item.Reg[0].Name := 'Blood Moss';
Item.Reg[1].TypeOfReagent := MR;
Item.Reg[1].Name := 'Mandrake Roots';
Item.Reg[2].TypeOfReagent := BP;
Item.Reg[2].Name := 'Black Pearls';
Item.Reg[3].TypeOfReagent := $0EF3;
Item.Reg[3].Name := 'Blank scroll';
end;
if (Choice = 'gh') then
begin
Item.Name := 'GH cкролл';
Item.Tool := $0FBF;
Item.Container := $0E76;
Item.TypeOfItem := $1F49;
Item.QuantityOfReg := 1;
Item.CountOfReagent := 5;
Item.CraftGump := 1044009;
Item.CategoryBtn := 6;
Item.ItemBtn := 22;
Item.Reg[0].TypeOfReagent := SS;
Item.Reg[0].Name := 'Spider`s Silk';
Item.Reg[1].TypeOfReagent := MR;
Item.Reg[1].Name := 'Mandrake Roots';
Item.Reg[2].TypeOfReagent := GS;
Item.Reg[2].Name := 'Ginsening';
Item.Reg[3].TypeOfReagent := $0EF3;
Item.Reg[3].Name := 'Blank scroll';
Item.Reg[4].TypeOfReagent := GA;
Item.Reg[4].Name := 'Garlic';
end;
if (Choice = 'reflect') then
begin
Item.Name := 'Reflect cкролл';
Item.Tool := $0FBF;
Item.CountOfReagent := 4;
Item.Container := $0E76;
Item.TypeOfItem := $1F50;
Item.QuantityOfReg := 1;
Item.CraftGump := 1044009;
Item.CategoryBtn := 7;
Item.ItemBtn := 20;
Item.Reg[0].TypeOfReagent := GA;
Item.Reg[0].Name := 'Garlic';
Item.Reg[1].TypeOfReagent := MR;
Item.Reg[1].Name := 'Mandrake Roots';
Item.Reg[2].TypeOfReagent := SS;
Item.Reg[2].Name := 'Spider`s Silk';
Item.Reg[3].TypeOfReagent := $0EF3;
Item.Reg[3].Name := 'Blank scroll';
end;
if (Choice = 'paralyze') then
begin
Item.Name := 'Paralyze cкролл';
Item.Tool := $0FBF;
Item.CountOfReagent := 4;
Item.Container := $0E76;
Item.TypeOfItem := $1F52;
Item.QuantityOfReg := 1;
Item.CraftGump := 1044009;
Item.CategoryBtn := 7;
Item.ItemBtn := 24;
Item.Reg[0].TypeOfReagent := GA;
Item.Reg[0].Name := 'Garlic';
Item.Reg[1].TypeOfReagent := MR;
Item.Reg[1].Name := 'Mandrake Roots';
Item.Reg[2].TypeOfReagent := SS;
Item.Reg[2].Name := 'Spider`s Silk';
Item.Reg[3].TypeOfReagent := $0EF3;
Item.Reg[3].Name := 'Blank scroll';
end;
if (Choice = 'efield') then
begin
Item.Name := 'EF cкролл';
Item.Tool := $0FBF;
Item.Container := $0E76;
Item.TypeOfItem := $1F5E;
Item.QuantityOfReg := 1;
Item.CountOfReagent := 5;
Item.CraftGump := 1044009;
Item.CategoryBtn := 9;
Item.ItemBtn := 14;
Item.Reg[0].TypeOfReagent := SS;
Item.Reg[0].Name := 'Spider`s Silk';
Item.Reg[1].TypeOfReagent := MR;
Item.Reg[1].Name := 'Mandrake Roots';
Item.Reg[2].TypeOfReagent := BP;
Item.Reg[2].Name := 'Black Pearls';
Item.Reg[3].TypeOfReagent := $0EF3;
Item.Reg[3].Name := 'Blank scroll';
Item.Reg[4].TypeOfReagent := SA;
Item.Reg[4].Name := 'Sulfurous Ash';
end;
end;
procedure GumpCheckAndSolve;
var
gi :TGumpInfo;
begin
if IsGump then
begin
GetGumpInfo(GetGumpsCount-1, gi);
if not (gi.XmfHTMLGumpColor[0].Cliloc_id = Item.CraftGump) then
begin
while IsGump do
begin
CloseSimpleGump(GetGumpsCount-1);
end;
if (FindType(Item.Tool, backpack) > 0) then UseObject(FindItem);
Wait(1500);
end;
end;
if not IsGump then
begin
if (FindType(Item.Tool, backpack) > 0) then UseObject(FindItem);
Wait(1000);
end;
end;
procedure CraftOneItem;
var
gi : TGumpInfo;
begin
GumpCheckAndSolve;
GetGumpInfo(GetGumpsCount-1, gi);
if (gi.XmfHTMLGumpColor[0].Cliloc_id = Item.CraftGump) then
begin
NumGumpButton(GetGumpsCount-1, gi.GumpButtons[Item.CategoryBtn].return_value);
Wait(1500);
NumGumpButton(GetGumpsCount-1, gi.GumpButtons[Item.ItemBtn].return_value);
end;
end;
procedure SmeltItem;
var
gi : TGumpInfo;
begin
GumpCheckAndSolve;
GetGumpInfo(GetGumpsCount-1, gi);
if (gi.XmfHTMLGumpColor[0].Cliloc_id = Item.CraftGump) then
begin
NumGumpButton(GetGumpsCount-1, gi.GumpButtons[Item.SmeltBtn].return_value);
WaitForTarget(5000);
if TargetPresent then TargetToObject(FindType(Item.TypeOfItem, backpack));
Wait(1500);
end;
end;
procedure LoadUnload;
var
tmpInt : Integer;
begin
GetTItemInfo(CraftItemTField.Text);
UseObject(RegChest);
Wait(1500);
for tmpInt := 0 to (Item.CountOfReagent - 1) do
begin
if GetQuantity(FindType(Item.Reg[tmpInt].TypeOfReagent, backpack)) < Item.QuantityOfReg then
begin
MoveItem(FindType(Item.Reg[tmpInt].TypeOfReagent, RegChest), (LoadRegAmount - GetQuantity(FindType(Item.Reg[tmpInt].TypeOfReagent, backpack))), backpack, 0,0,0);
Wait(1500);
end;
end;
if FindType(Item.TypeOfItem, backpack) > 0 then
begin
MoveItem(FindItem, 0, RegChest, 0,0,0);
Wait(1500);
end;
end;
procedure Obed;
var
im : Integer;
begin
for im := 0 to 4 do
begin
if (FindType(Food[im], backpack) > 0) then
begin
UseObject(FindItem);
Wait(1500);
exit;
end;
end;
end;
function UsesLeft : Integer;
var
aa : TClilocRec;
begin
aa := GetToolTipRec(FindType(Item.Tool, backpack));
Result := (StrToInt(aa.Items[1].Params[0]));
end;
function Counter : Integer;
begin
GetTItemInfo(CraftItemTField.Text);
Result := GetQuantity(FindType(Item.TypeOfItem, backpack));
end;
procedure B_Click(Sender : TObject);
var
tmpInt1, tmpInt2, tmpInt3, k, im : Integer;
ctime : TDateTime;
begin
GetTItemInfo(CraftItemTField.Text);
Wait(1000);
UOSay(Item.Name);
im := 0;
While FindType(Item.TypeOfItem, backpack) > 0 do
begin
MoveItem(FindItem, 0, RegChest, 0,0,0);
Wait(1500);
end;
while ((Counter + (GetQuantity(FindType(Item.TypeOfItem, RegChest)))) < StrToInt(CraftItemQuantityTField.Text)) do
begin
for tmpInt1 := 0 to (Item.CountOfReagent - 1) do
begin
if (GetQuantity(FindType(Item.Reg[tmpInt1].TypeOfReagent, backpack)) <= Item.QuantityOfReg) then LoadUnload;
end;
if Mana < 20 then
begin
ctime := Now;
while not (InJournalBetweenTimes('You enter', ctime, Now) <> -1) do
begin
UseSkill('Meditation');
Wait(2500);
end;
repeat
Wait(1500);
until (Mana > 90);
end;
Obed;
im := im + 1;
TriesMade.Caption := 'Tries Made: ' + IntToStr(im);
CraftOneItem;
k := 0;
repeat
k := k + 1;
Wait(300);
until IsGump or Dead or (k > 15);
HowManyLeftToDoLabel.Caption := 'Left to do: ' + IntToStr(((StrToInt(CraftItemQuantityTField.Text))) - (Counter + (GetQuantity(FindType(Item.TypeOfItem, RegChest)))));
for tmpInt2 := 0 to (Item.CountOfReagent - 1) do
begin
RegLabel[tmpInt2].Caption := Item.Reg[tmpInt2].Name + ': ' + IntToStr(GetQuantity(FindType(Item.Reg[tmpInt2].TypeOfReagent, backpack)));
end;
CurrentSkillLevelLabel.Caption := 'Current Skill Level: ' + FloatToStrF(GetSkillValue('Inscription'),ffFixed,12,1);
CounterLabel.Caption := 'Total Items: ' + IntToStr(Counter + (GetQuantity(FindType(Item.TypeOfItem, RegChest))));
for tmpInt3 := 0 to (Item.CountOfReagent - 1) do
begin
RegLabelChest[tmpInt3].Caption := Item.Reg[tmpInt3].Name + ': ' + IntToStr(GetQuantity(FindType(Item.Reg[tmpInt3].TypeOfReagent, RegChest)));
end;
//UsesLeftLabel.Caption := 'Uses of tool left: ' + IntToStr(UsesLeft);
end;
Beep;
AddToSystemJournal('Done!');
end;
procedure FormClose(Sender: TObject; var Action : TCloseAction);
begin
Action := caFree;
raiseException(erCustomError, 'for example, script stop after form');
end;
procedure init;
var i, k, im, ik : Integer;
begin
CraftForm := TSTForm.Create;
CraftForm.OnClose := @FormClose;
CraftForm.Width := 380;
CraftForm.Height := 320;
CraftForm.Caption := 'Craft by Drabadanchik';
CraftForm.Visible := True;
CraftButton := TSTButton.Create(CraftForm);
CraftButton.OnClick := @B_Click;
CraftButton.Caption := 'Скрафтить!';
CraftButton.Top := 55;
CraftItemTField := TSTEdit.Create(CraftForm);
CraftItemQuantityTField := TSTEdit.Create(CraftForm);
CraftItemQuantityTField.Top := 30;
CraftItemNameLabel := TSTLabel.Create(CraftForm);
CraftItemNameLabel.Left := 125;
CraftItemNameLabel.Caption := '<-- Напиши название итема!';
CraftQuantityLabel := TSTLabel.Create(CraftForm);
CraftQuantityLabel.Left := 125;
CraftQuantityLabel.Top := 30;
CraftQuantityLabel.Caption := '<-- Напиши сколько хочешь скрафтить!';
CraftChoiceDescriptionLabel := TSTLabel.Create(CraftForm);
CraftChoiceDescriptionLabel.Top := 65;
CraftChoiceDescriptionLabel.Left := 95;
CraftChoiceDescriptionLabel.Caption := 'Варианты крафта: reflect, recall, paralyze, efield, gh.';
CraftChoicesLabel := TSTLabel.Create(CraftForm);
CraftChoicesLabel.Top := 95;
CraftChoicesLabel.Left := 55;
CraftChoicesLabel.Caption := 'CURRENT STATISTICS:';
CounterLabel := TSTLabel.Create(CraftForm);
CounterLabel.Top := 115;
CounterLabel.Left := 10;
HowManyLeftToDoLabel := TSTLabel.Create(CraftForm);
HowManyLeftToDoLabel.Top := 135;
HowManyLeftToDoLabel.Left := 10;
for i := 0 to 9 do
begin
k := k + 20;
RegLabel[i] := TSTLabel.Create(CraftForm);
RegLabel[i].Top := k + 165;
RegLabel[i].Left := 10;
end;
CurrentSkillLevelLabel := TSTLabel.Create(CraftForm);
CurrentSkillLevelLabel.Top := 135;
CurrentSkillLevelLabel.Left := 145;
StatisticsLabel := TSTLabel.Create(CraftForm);
StatisticsLabel.Top := 165;
StatisticsLabel.Left := 10;
StatisticsLabel.Caption := 'Reagents in Backpack:';
for im := 0 to 9 do
begin
ik := ik + 20;
RegLabelChest[im] := TSTLabel.Create(CraftForm);
RegLabelChest[im].Top := ik + 165;
RegLabelChest[im].Left := 145;
end;
StatisticsLabelChest := TSTLabel.Create(CraftForm);
StatisticsLabelChest.Top := 165;
StatisticsLabelChest.Left := 145;
StatisticsLabelChest.Caption := 'Reagetns in Chest: ';
UsesLeftLabel := TSTLabel.Create(CraftForm);
UsesLeftLabel.Top := 115;
UsesLeftLabel.Left := 145;
TriesMade := TSTLabel.Create(CraftForm);
TriesMade.Top := 115;
TriesMade.Left := 145;
end;
begin
initFood;
init;
while True do Wait(1000);
end.
Re: Stealth 6
слабенький какой-то инскрипт, всего на пару скроллов.
Впрочем, пойдет.
Впрочем, пойдет.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re: Stealth 6
Заготовка же =).Vizit0r wrote:слабенький какой-то инскрипт, всего на пару скроллов.
Впрочем, пойдет.
Re: Stealth 6
тестеры внешних скриптов и стелса в целом - со вторника можете писать в асю, буду беты давать на тесты.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
-
- Neophyte
- Posts: 13
- Joined: 11.07.2013 6:04
Re: Stealth 6
А где хотя бы пятый взять? Тут уже бета 6го тестируется, а 5ого нет нигде...
Re: Stealth 6
5й получился несколько неудачный, поэтому перешли на 6й сразу 

"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re: Stealth 6
По поводу тестов - к CFA, я уезжаю на пару месяцев. будет интернет, или нет - узнаю по месту.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re: Stealth 6
ввиду большого количества практически неисправимых багов - скриптовый движок откатывается обратно на PascalScript. Жаль только кучу потраченного времени на Pax.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".