Скрипт написан под Stealth версии 3.4 и выше, и протестирован на версии 3.7.3.
Первым что хочу сказать, что за основу были взяты скрипты Edred'a на мининг и ламбер для Forest Wars, за что ему огромная благодарность.
Для работы скрипта, нам потребуется:
Дом - 1 шт.
Сундук - 1 шт.
Кирка в руке - 1 шт.
Stealth v 3.4 и выше.
Injection (для маркировки точек).
Сам скрипт представлен ниже:
Code: Select all
Program mining;
{$Include 'all.inc'}
const
WalkSpeed=450; // Скорость перемещения
Sunduk = $47DB8AC3; // Сундук, куда складываем руду
Pickaxe1 = $0E85; // Тип кирки
Pickaxe2 = $0E86; // Тип Кирки
M_nothing1 = 'There is nothing here';
M_nothing2 = 'That is too far';
M_nothing3 = 'Try mining elsewhere.';
M_nothing4 = 'You cannot mine so close';
M_nothing5 = 'You have no line';
M_nothing6 = 'reach';
M_nothing7 = 'Вы переместили Iron Ore в свою сумку..';
M_nothing8 = 'Вы переместили Jewel of Spirits в свою сумку..';
M_nothing9 = 'Вы переместили Silver Ore в свою сумку..';
M_nothing10 = 'Вы переместили Dark Iron Ore в свою сумку..';
M_fizzles1 = 'You loosen some rocks';
M_fizzles2 = 'не смогли выкопать ничего';
M_needwait = 'You decide not to mine';
M_success = 'Вы переместили';
M_tfail = 'Targeting cancelled';
Ore1 = $19B7;
Ore2 = $19BA;
Ore3 = $19B8;
Ore4 = $19B9;
XNearSunduk = 3179; // Координаты рядом с сундуком
YNearSunduk = 2287; // Координаты рядом с сундуком
MyMaxWeight = 250; // Максимальный вес
type MineRecord = Record
tilenum, x, y, z : Integer;
end;
var
xx, yy, k, l : Integer;
mn1, mn2, mn3, mn4, mn5, mn6, mn7, mn8, mn9, mn10, mf1, mf2, mw1, ms1, tf1 : Integer;
tiles : array[0..1000] of MineRecord;
arrayLength : Integer;
ctime : TDateTime;
// Инициализация
procedure Init;
begin
SetWalkUnmountTimer(WalkSpeed);
end;
// Прячемся
procedure CheckHide;
begin
repeat
if WarMode = true then SetWarMode(false);
UseSkill('Stealth');
wait(3500);
until Hidden;
end;
// Парсим строку
procedure GetMiningRail(s : String; WPos : Integer);
begin
s := s + ' ';
tiles[WPos].tilenum := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
tiles[WPos].x := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
tiles[WPos].y := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
tiles[WPos].z := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
end;
// Парсим файл
procedure GetRail(FileNam : String);
var
List : TStringList;
i : Integer;
begin
List := TStringList.Create;
List.LoadFromFile(FileNam);
for i := 0 to List.Count-1 do GetMiningRail(List.strings[i],i);
arrayLength := i;
end;
// Копаем тайл, пока не выкопаем
function MineTile(tilenum : Integer; x : Integer; y : Integer; z : Integer) : Boolean;
begin
repeat
begin
if not Hidden then CheckHide;
ClearJournal;
ctime := Now;
k := 0;
if WarMode = true then SetWarMode(false);
if TargetPresent then CancelTarget;
WaitTargetTile(tilenum, x, y, z);
if UseType(Pickaxe1,$FFFF) = 0 then begin
if UseType(Pickaxe2,$FFFF) = 0 then begin
AddToSystemJournal('Потеряли кирку. Выходим.');
exit;
end;
end;
repeat
begin
wait(1000);
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);
mn7 := InJournalBetweenTimes(M_nothing7, ctime, Now);
mn8 := InJournalBetweenTimes(M_nothing8, ctime, Now);
mn9 := InJournalBetweenTimes(M_nothing9, ctime, Now);
mn10 := InJournalBetweenTimes(M_nothing10, ctime, Now);
mf1 := InJournalBetweenTimes(M_fizzles1, ctime, Now);
mf2 := InJournalBetweenTimes(M_fizzles2, ctime, Now);
ms1 := InJournalBetweenTimes(M_success, ctime, Now);
tf1 := InJournalBetweenTimes(M_tfail, ctime, Now);
end;
until (tf1<>-1) or (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1) or (mn7<>-1) or (mn8<>-1) or (mn9<>-1) or (mn10<>-1) or (mf1<>-1) or (mf2<>-1) or (ms1<>-1) or Dead or (k > 300);
end;
until (tf1<>-1) or (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1) or (mn7<>-1) or (mn8<>-1) or (mn9<>-1) or (mn10<>-1);
result := true;
end;
// Возвращаемся домой к сундуку
procedure GoHome;
begin
NewMoveXY(XNearSunduk, YNearSunduk, true, 1 ,true);
end;
// Выгружаемся
function Unload : Boolean;
var
tmpid : Cardinal;
tmpconnect : TDateTime;
begin
addtosystemjournal('Пришли на разгрузку');
Result := true;
waitconnection(3000);
tmpconnect := ConnectedTime;
UseObject(Sunduk);
wait(1000);
// Переместим руду
repeat
tmpid := Findtype(Ore1,backpack);
if tmpid = 0 then tmpid := Findtype(Ore2,backpack);
if tmpid = 0 then tmpid := Findtype(Ore3,backpack);
if tmpid = 0 then tmpid := Findtype(Ore4,backpack);
if tmpid = 0 then break;
waitconnection(3000);
MoveItem(tmpid, GetQuantity(tmpid), Sunduk, 0, 0, 0);
wait(1000);
CheckSave;
until tmpid = 0;
IgnoreReset;
end;
// Проверка веса
procedure CheckWeight;
begin
if Weight >= MyMaxWeight then
begin
AddToSystemJournal('Идём на разгрузку.');
GoHome;
Unload;
end;
end;
Begin
Init;
GetRail('D:\Games\Railes\Mining\' + CharName + '.txt');
repeat
begin
AddToSystemJournal('Начинаем обкопку.');
for l := 0 to arrayLength-1 do
begin
NewMoveXY(tiles[l].x, tiles[l].y, true, 1, false);
MineTile(tiles[l].tilenum, tiles[l].x, tiles[l].y, tiles[l].z);
CheckWeight;
end;
AddToSystemJournal('Всё выкопали. Возвращаемся на исходную.');
end;
Until Dead;
End.
Установка:
Для работы скрипта, нам требуется создать файл с координатами в каталоге (или изменить в строке 138 путь до файла и имя, какое вам больше нравится)
В моём случае, этоD:\Games\Railes\Mining\имя_персонажа.txt
D:\Games\Railes\Mining\Leonard.txt
После того, как файл был создан, переходим к наполнению файла координатами. Для этого, вам потребуется скрипт на Injection, представленный ниже:
Code: Select all
sub MarkMining()
uo.TextOpen()
if uo.GetDir() == 0 then
uo.TextPrint('0 ' + STR(uo.GetX('self')) + ' ' + STR(uo.GetY('self') - 1) + ' 0')
endif
if uo.GetDir() == 4 then
uo.TextPrint('0 ' + STR(uo.GetX('self')) + ' ' + STR(uo.GetY('self') + 1) + ' 0')
endif
if uo.GetDir() == 6 then
uo.TextPrint('0 ' + STR(uo.GetX('self') - 1) + ' ' + STR(uo.GetY('self')) + ' 0')
endif
if uo.GetDir() == 2 then
uo.TextPrint('0 ' + STR(uo.GetX('self') + 1) + ' ' + STR(uo.GetY('self')) + ' 0')
endif
if uo.GetDir() == 7 then
uo.TextPrint('0 ' + STR(uo.GetX('self') - 1) + ' ' + STR(uo.GetY('self') - 1) + ' 0')
endif
if uo.GetDir() == 3 then
uo.TextPrint('0 ' + STR(uo.GetX('self') + 1) + ' ' + STR(uo.GetY('self') + 1) + ' 0')
endif
if uo.GetDir() == 5 then
uo.TextPrint('0 ' + STR(uo.GetX('self') - 1) + ' ' + STR(uo.GetY('self') + 1) + ' 0')
endif
if uo.GetDir() == 1 then
uo.TextPrint('0 ' + STR(uo.GetX('self') + 1) + ' ' + STR(uo.GetY('self') - 1) + ' 0')
endif
uo.Print('Added')
endsub
Заходим в игру
Копируем скрипт для маркировки и для удобства, забиваем его на хоткей (в моем случае это F5):
Подходим вплотную к скале, и нажимаем F5. В нижем левом углу, видим надпись Added, значит скрипт отработал нормально.
Принцип работы прост- исходя из направления персонажа и текущих координат, осуществляется запись координат тайла, который требуется выкопать. Таким образом, переходим к следующему тайлу и так же нажимаем F5, записали. К следующему, следующему...
Когда промаркируете все координаты, копируем их из окна, который открыл для этого Inject (если окно не открыто, то ,textopen) и сохраняем в файл с координатами (см. выше). Подходим к сундуку, берём в руки кирку, запускаем. Если всё было сделано верно, то набрав максимальный вес, персонаж разгрузится и продолжить копать по кругу.