Сразу оговорюсь, скрипт сырой. Сообщения о синтаксических, логических ошибках и прочих глюках приветствуются.
Суть скрипта: чар копает в випке стоя на месте. При достижении веса, бредёт к сундуку и скидывает в него руду сортируя её по трём мешкам. При нобоходимости хавает свинку и грузится скролами и инвизками. Отрыв элема, пьёт инвизку и мучает его вортами, после чего масс диспел и лут с земли.
Для старта скрипта, грузим чара скролами масс диспела и ворта и инвизками, количество на усмотрение, у меня пока 30. Кирку в лапу и стартуем скрипт.
Что править в скрипте:
Sunduk = $4013D752; id сундука
MyBox = $40050E38; ящик с тремя мешками для руды и там же лежат скролы и инвизы.
IronBag = $40077033; id мешка для железа, он лежит в ящике!!!
OtherBag = $400767FA; id мешка для прочей руды
BestBag = $40076C6B; id мешка для выхи, туда же падает и плут
EdaBag = $402D75B6; id мешка со свинками, он лежит в сундуке
EdaType = $09BB; // Pig тип еды если свинки не устраивают
DiamondBag = $404C837D; id мешка для камней, он лежит в сундуке
ToolBag = $401CF9A9; id мешка с кирками, тоже лежит в сундуке. Чар хавает кирки обоих положений, но не проверял
SundukX = 5134; координаты места перед сундуком с которого он может разгружаться, я подхожу вплотную.
SundukY = 1087;
BaseX = 5142; координаты места на котором копает чар
BaseY = 1084;
KillElems = 'Yes'; // Убивать элементаля (в паке должны быть инвизки, скролы вортекса, скролы масс диспела)
KillAnyElem = 'Yes'; // Убивать чужого элементаля (в паке должны быть инвизки, скролы вортекса, скролы масс диспела)
ScrollAmmount = 30; количество скролов для догрузки
InvisAmmount = 30; то же для инвизок.
Скрипт - прямой порт с инжекта моего скрипта, поэтому может показаться корявым для стэлса. Ещё раз повторяю, все замечания приветствуются.
Code: Select all
Program MiningVIPs;
const
M_nothing1 = 'There is no ore here to mine';
M_nothing2 = 'That is too far';
M_nothing3 = 'Try mining in rock';
M_nothing4 = 'You cannot mine so close';
M_nothing5 = 'You have no line';
M_nothing6 = 'reach';
M_fizzles1 = 'You loosen some rocks';
M_needwait = 'You decide not to mine';
M_success = 'in your pack.';
MaxDistance = 3;
MaxCount = 10; // максимальное кол-во физлов одной точки
PickType1 = $0E85; // Типы кирок
PickType2 = $0E86;
Sunduk = $4013D752; // Sunduk of ore
MyBox = $40050E38; // Box
IronBag = $40077033;
OtherBag = $400767FA;
BestBag = $40076C6B;
EdaBag = $402D75B6;
EdaType = $09BB; // Pig
DiamondBag = $404C837D;
ToolBag = $401CF9A9;
SundukX = 5134;
SundukY = 1087;
BaseX = 5142;
BaseY = 1084;
//MaxWeight = 700; // Max Weight
KillElems = 'Yes'; // Убивать элементаля (в паке должны быть инвизки, скролы вортекса, скролы масс диспела)
KillAnyElem = 'Yes'; // Убивать чужого элементаля (в паке должны быть инвизки, скролы вортекса, скролы масс диспела)
InvisType = $0F0E; // Тип инвизки
InvisColor = $0631;
VortScType=$1F66;
MDScType=$1F62;
ScColor=$0000; // Цвет скрола вортекса
ScrollAmmount = 30;
InvisAmmount = 30;
var
ScriptStartTime : TDateTime;
PickAxeObj : Cardinal;
Counter, x, y : Integer;
MaxWeight : Word;
Hungry : Boolean;
ctime: TDateTime;
{$Include 'checklag.inc'}
procedure ToHide;
begin
if Hidden then exit;
if WarMode = true then SetWarMode(false);
repeat
UseSkill('Hiding');
wait(4500);
CheckLag;
until Hidden or (not Connected);
end;
procedure UnloadAll;
var
Colors : array of word;
// Ores : array of word;
i : word;
Ext : boolean;
Container : cardinal;
Ammo : integer;
// Colors[0]="0x09F0" ; Gorgan
// Colors[1]="0x09D3" ; Steel
// Colors[3]="0x0BA7" ; Eldar
// Colors[4]="0x08AF" ; Plut
// Colors[5]="0x0085" ; Dragon
// Colors[6]="0x0060" ; Aqua
// Colors[7]="0x09E6" ; Elvin
// Colors[8]="0x010F" ; Krinit
// Colors[9]="0x09DA" ; Vulkan
// Colors[10]="0x09EC" ; Blood Crest
// Colors[11]="0x008F" ; Sand Rock
// Colors[12]="0x09B9" ; Acid
// Colors[13]="0x09A4" ; Crystaline
begin
Colors := [$09F0,$09D3,$0BA7,$08AF,$0085,$0060,$09E6,$010F,$09DA,$09EC,$008F,$09B9,$09A4 ];
// Ores := [$19BA,$19B8,$19B9,$19B7];
MoveXY(SundukX,SundukY,false,0,false);
// ToHide;
UseObject(Sunduk);
CheckLag;
UseObject(MyBox);
CheckLag;
UseObject(EdaBag);
CheckLag;
AddToSystemJournal('zzzzz');
// Unload Ore
for i := $19B7 to $19BA do
begin
Ext := false;
repeat
begin
FindType(i,backpack);
if FindCount > 0 Then
begin
Container := OtherBag;
case GetColor(FindItem) of
$0000 : Container := IronBag;
$09F0 : Container := BestBag; // Gorgan
$09D3 : Container := BestBag; // Steel
$0BA7 : Container := BestBag; // Eldar
$08AF : Container := BestBag; // Plut
$0085 : Container := BestBag; // Dragon
$0060 : Container := BestBag; // Aqua
$09E6 : Container := BestBag; // Elvin
$010F : Container := BestBag; // Krinit
$09DA : Container := BestBag; // Vulkan
$09EC : Container := BestBag; // Blood Crest
$008F : Container := BestBag; // Sand Rock
$09B9 : Container := BestBag; // Acid
$09A4 : Container := BestBag; // Crystaline
end;
//addtosystemjournal('Cont = ' + INTTOSTR(Container) + ' i= '+ INTTOSTR(i));
MoveItem(FindItem,-1,Container,0,0,0);
wait(1000);
CheckLag;
end
else Ext := true;
end;
until Ext;
end;
// Unload Diamonds
Container := DiamondBag;
for i := $0F0F to $0F26 do
begin
FindType(i,backpack);
if FindCount > 0 Then
begin
MoveItem(FindItem,-1,Container,0,0,0);
wait(1000);
CheckLag;
end;
end;
Container := MyBox;
// Unload Empty Bootle
FindTypeEx($0F0E,$0000,backpack,false);
if FindCount > 0 Then
begin
MoveItem(FindItem,-1,Container,0,0,0);
wait(1000);
CheckLag;
end;
// Unload Money
FindType($0EED,backpack);
if FindCount > 0 Then
begin
MoveItem(FindItem,-1,Container,0,0,0);
wait(1000);
CheckLag;
end;
// Eda
If Hungry Then begin
Container := EdaBag;
UseObject(Container);
wait(1000);
FindType(EdaType,Container);
wait(1000);
//addtosystemjournal('Count = ' + INTTOSTR(finditem));
if FindCount > 0 Then
begin
MoveItem(FindItem,1,backpack,0,0,0);
wait(1000);
UseObject(FindItem);
CheckLag;
Hungry := false;
addtosystemjournal('Запитонил свинку.');
end;
end;
//
// Load Resource
//
// Vortex
Count(VortScType); // FindFullQuantity
addtosystemjournal('Count Vort backpck = ' + INTTOSTR(FindFullQuantity));
Ammo := FindFullQuantity;
If Ammo < ScrollAmmount Then begin
Container := MyBox;
FindTypeEx(VortScType,ScColor,Container,false);
wait(1000)
If FindCount > 0 Then begin
MoveItem(FindItem,ScrollAmmount-Ammo,backpack,0,0,0);
wait(1000);
CheckLag;
end;
end;
// Mass Dispell
Count(MDScType); // FindFullQuantity
addtosystemjournal('Count MD backpck = ' + INTTOSTR(FindFullQuantity));
Ammo := FindFullQuantity;
If Ammo < ScrollAmmount Then begin
Container := MyBox;
FindTypeEx(MDScType,ScColor,Container,false);
wait(1000)
If FindCount > 0 Then begin
MoveItem(FindItem,ScrollAmmount-Ammo,backpack,0,0,0);
wait(1000);
CheckLag;
end;
end;
// Invis
Count(InvisType); // FindFullQuantity
addtosystemjournal('Count Invis backpck = ' + INTTOSTR(FindFullQuantity));
Ammo := FindFullQuantity;
If Ammo < InvisAmmount Then begin
Container := MyBox;
FindTypeEx(InvisType,InvisColor,Container,false);
wait(1000)
addtosystemjournal('Count Invis MyBox = ' + INTTOSTR(FindFullQuantity));
If FindCount > 0 Then begin
MoveItem(FindItem,InvisAmmount-Ammo,backpack,0,0,0);
wait(1000);
CheckLag;
end;
end;
MoveXY(BaseX, BaseY, false, 0, false);
end;
procedure NewPickAxe;
begin
addtosystemjournal('Побрёл за новой киркой...');
wait(3000);
MoveXY(SundukX,SundukY,false,0,false);
UseObject(Sunduk);
CheckLag;
UseObject(ToolBag);
CheckLag;
FindType(PickType1,ToolBag);
If FindCount > 0 Then MoveItem(FindItem,1,backpack,0,0,0);
MoveXY(BaseX, BaseY, false, 0, false);
end;
//----------- Summon Energy Vortex, kill elem and loot him -----------
procedure KillElem;
var
m, i : word;
// ctime: TDateTime;
// DIM Ore[4]
// Ore[0]='0x19B7' ; 1 ore
// Ore[1]='0x19BA' ; 2 ore
// Ore[2]='0x19B8' ; 3 ore
// Ore[3]='0x19B9' ; 4 and more ore
// VAR i, Exit,l
label povtor, jdat, dispel;
begin
FindDistance := 15;
UseType($0f0e, $0631); //inviz
//0x000D vortex
povtor:
ctime := now;
m := Mana;
FindType($0010, ground);
If FindCount > 0 Then
begin
WaitTargetObject(finditem);
UseType($1f66, ScColor);
while Mana >= m do wait(300);
If InJournalBetweenTimes('spell fizzles', ctime, Now) > 0 Then goto povtor;
wait(1000);
end;
jdat:
FindType($0010, ground)
wait(300);
If FindCount > 0 Then
begin
FindType($000D, ground)
wait(300);
If FindCount > 0 Then
begin
wait(1000);
goto jdat;
end
Else goto povtor;
End;
dispel:
ctime := now;
m := Mana;
FindType($000D, ground)
If FindCount > 0 Then
begin
WaitTargetObject(finditem);
UseType($1F62, ScColor);
While Mana >= m do wait(300);
If InJournalBetweenTimes('spell fizzles', ctime, Now) > 0 Then goto dispel;
End;
for i := $19B7 to $19BA do
begin
FindType(i,ground);
CheckLag;
if FindCount > 0 Then
begin
if GetDistance(finditem) > 3 Then MoveXY(GetX(finditem), GetY(finditem), false, 0, false);
MoveItem(FindItem,-1,backpack,0,0,0);
wait(1000);
CheckLag;
end;
FindType($0EED,ground);
CheckLag;
if FindCount > 0 Then
begin
MoveItem(FindItem,-1,backpack,0,0,0);
wait(1000);
CheckLag;
end;
end;
MoveXY(BaseX, BaseY, false, 0, false);
end;
//
//
// ----------------------------+++++++++++++++++++++++++++-------------------------------
//
//
begin
//sub digitstay(MaxWeight,MaxDistance,KillElemental,KillAnyElemental,ElemSignal,BaseX,BaseY)
// VAR x,y,z='0',TileNum='1339'
// VAR Last=0,LastTimer, ContFlag=1, Counter, PickAxeType
// VAR MaxTimer=110, MaxCount=10 ; количество попыток копания
MaxWeight :=700;
SetRunUnmountTimer(200);
SetWalkUnmountTimer(400);
Hungry := false;
MoveXY(BaseX,BaseY,false,0,false);
//Выбор кирки
// FindType(PickType1,backpack);
// PickAxeObj := FindItem;
//addtosystemjournal(INTTOSTR(PickAxeObj));
// If FindCount = 0 Then FindType(PickType2,Self);
// PickAxeObj := FindItem;
//addtosystemjournal(INTTOSTR(PickAxeObj));
repeat
For x := -MaxDistance to MaxDistance do
For y := -MaxDistance to MaxDistance do
begin
Counter := 0;
Repeat
CheckLag;
ToHide;
ctime := now;
WaitTargetTile(1342, GetX(self)+x, GetY(self)+y, GetZ(self));
UseType(PickType1,0);
// UseObject(PickAxeObj);
// UseObject(ObjAtLayerEx(RhandLayer,self));
Repeat
wait(500);
until (InJournalBetweenTimes('Try mining|You put|You loosen|There is no|That is too|OOPS|attacking you|destroyed', ctime, now)<>-1);
Counter := Counter+1;
If (InJournalBetweenTimes('You are hungry', ctime, now) >0) Then Hungry := true;
If (InJournalBetweenTimes('destroyed', ctime, now) >0) Then NewPickAxe;
If (InJournalBetweenTimes('something with ore|attacking you', ctime, now) > 0) then KillElem;
FindType($0010, ground)
If FindCount > 0 Then KillElem;
If Weight > MaxWeight then UnloadAll;
Until (InJournalBetweenTimes('Try mining|There is no|That is too', ctime , now)<>-1) OR (Counter > MaxCount);
end;
until Dead;
end.