PDA

Просмотр полной версии : Крафтер


Sieg
17.03.2009, 02:13
Предлагаю на суд общественности вот такой вот небольшой крафтер-бот. Спорить не буду, скрипт сыроват, кое-где может и остался мусор, хотя, старался убрать всё лишнее.
Возможности: крафт и продажа сосок всех видов в автоматическом режиме, закупка соул/спирит оре.
Надо только закидывать кристаллы. Думаю, в будущем научу его делать себе Д, Ц и Б кристаллы. Только не судите слишком строго. С паскалем я практически впервые общаюсь - первый раз был в школе лет этак 10 назад. Потому, есть один огромный вопрос к знатокам: а есть ли возможность в этом самом FastScript'е запускать альтернативные потоки, которые имели бы доступ к данным основного потока? Если да, это ОЧЕНЬ сильно упростило бы дело написания ботов.
Просьба ко всем, кто будет пользоваться этим скриптом: переправьте в массиве pathX, pathY и pathZ последнюю точку пути. Или сам массив измените, чтоб бегал по другому маршруту. Иначе, все боты будут сидеть в одном месте.


const

crafterName = 'crafterBot';
shopMessage = 'Ваша реклама';
minMP = 200;
maxMPtoCraft = 500;
shopResetupTime = 200;

minSoulOre = 500;
minSpiritOre = 500;
maxSoulOre = 7000;
maxSpiritOre = 7000;

SSDprice = 30; //цены на соски. чего не понятного?
SSCprice = 60;
SSBprice = 120;
SSAprice = 240;
SSSprice = 1500;
BSSDprice = 125;
BSSCprice = 250;
BSSBprice = 300;
BSSAprice = 600;
BSSSprice = 3000;

maxSSD = 20000; // максимальное число шотов для крафта на продажу, которое бот будет
maxSSC = 20000; // стремиться поддерживать. Ноль означает не крафтить, но если в инвентаре уже есть
maxSSB = 0; // соски, он будет пытаться их продать.
maxSSA = 0; // Если установлено число больше 0, соответствующий рецепт должен быть изучен
maxSSS = 0;
maxBSSD = 20000;
maxBSSC = 20000;
maxBSSB = 0;
maxBSSA = 0;
maxBSSS = 0;

SSDid = 1463;
SSCid = 1464;
SSBid = 1465;
SSAid = 1466;
SSSid = 1467;
BSSDid = 3948;
BSSCid = 3949;
BSSBid = 3950;
BSSAid = 3951;
BSSSid = 3952;
soulOreID = 1785;
spiritOreID = 3031;

pathWayPoints = 11; //число точек пути в массиве path
buyPoint = 5; //точка пути, по достижению которой можно начинать закупку сырья

var
out:TForm;
m:TMemo;
infoUpdate, moveOn, mainLoop, crafting, shop, delayedProc, fixTrade :TTimer;
act:integer;
initMode, trading :boolean;

pathX, pathY, pathZ :array[1..pathWayPoints] of integer;
shopping :array[1..3] of String;

posX, posY, posZ, currentWayPoint, targetWayPoint, lastRSM :integer;

SSD, SSC, SSB, SSA, SSS, BSSD, BSSC, BSSB, BSSA, BSSS, soulOre, spiritOre :integer;
SSDoid, SSCoid, SSBoid, SSAoid, SSSoid, BSSDoid, BSSCoid, BSSBoid, BSSAoid, BSSSoid :integer;

MyID, MP, maxMP, traderId, buyListID, shopPhase, requestShopManage :integer;

i, count, resetupTimer :integer;


procedure OnTimer;
begin
m.Lines.Clear;
m.Lines.Add('Current position: '+IntToStr(posX)+', '+IntToStr(posY)+', '+IntToStr(posZ));
m.Lines.Add('Target waypoint: #'+IntToStr(targetWayPoint)+' ('+IntToStr(pathX[targetWayPoint])+', '+IntToStr(pathY[targetWayPoint])+', '+IntToStr(pathZ[targetWayPoint])+')');
m.Lines.Add('Current waypoint: #'+IntToStr(currentWayPoint));
m.Lines.Add('MP: '+IntToStr(MP)+'/'+IntToStr(maxMP));
m.Lines.Add('SSD count:'+IntToStr(SSD));
m.Lines.Add('SSC count:'+IntToStr(SSC));
m.Lines.Add('SSB count:'+IntToStr(SSB));
m.Lines.Add('SSA count:'+IntToStr(SSA));
m.Lines.Add('SSS count:'+IntToStr(SSS));
m.Lines.Add('BSSD count:'+IntToStr(BSSD));
m.Lines.Add('BSSC count:'+IntToStr(BSSC));
m.Lines.Add('BSSB count:'+IntToStr(BSSB));
m.Lines.Add('BSSA count:'+IntToStr(BSSA));
m.Lines.Add('BSSS count:'+IntToStr(BSSS));
m.Lines.Add('SpiritOre count:'+IntToStr(spiritOre));
m.Lines.Add('SoulOre count:'+IntToStr(soulOre));
m.Lines.Add('Last shop request: '+IntToStr(lastRSM));
if trading then m.Lines.Add('Trading...') else m.Lines.Add('Trading stopped.');
if infoUpdate.enabled then m.Lines.Add('infoUpdate: enabled') else m.Lines.Add('infoUpdate: disabled');
if moveOn.enabled then m.Lines.Add('moveOn: enabled') else m.Lines.Add('moveOn: disabled');
if mainLoop.enabled then m.Lines.Add('mainLoop: enabled') else m.Lines.Add('mainLoop: disabled');
if crafting.enabled then m.Lines.Add('crafting: enabled') else m.Lines.Add('crafting: disabled');
if shop.enabled then m.Lines.Add('shop: enabled') else m.Lines.Add('shop: disabled');

end;

procedure moveOnTimer;
var
dx, dy, dz, d :integer;
begin
dx:=posX-pathX[currentWayPoint];
dy:=posY-pathY[currentWayPoint];
dz:=posZ-pathZ[currentWayPoint];
d:=Round(sqrt(dx*dx+dy*dy));

if (d<40) and (sqrt(dz*dz)<500) then
begin
if (currentWayPoint=targetWayPoint) then moveOn.enabled:=false
else begin
currentWayPoint:=currentWayPoint+1;
if (currentWayPoint>pathWayPoints) then currentWayPoint:=1;
end;
exit;
end
else begin
buf:='';
WriteC(1);
WriteD(pathX[currentWayPoint]);
WriteD(pathY[currentWayPoint]);
WriteD(pathZ[currentWayPoint]);
WriteD(posX);
WriteD(posY);
WriteD(posZ);
WriteD(1);
SendToServerEx(crafterName);
end;
end;

procedure StartTrade;
begin
mainLoop.enabled:=false;
requestShopManage:=1;
buf:=#$73;
SendToServerEx(crafterName);
fixTrade.enabled:=true;
end;

procedure StartTrade2;
begin
requestShopManage:=0;
buf:=#$77;
WriteS(shopMessage);
SendToServerEx(crafterName);
delay(100);
buf:=#$74;
WriteD(0); WriteD(0);
count:=0;
if (SSD>0) then begin inc(count); WriteD(SSDoid); WriteD(SSD); WriteD(SSDprice); end;
if (SSC>0) then begin inc(count); WriteD(SSCoid); WriteD(SSC); WriteD(SSCprice); end;
if (SSB>0) then begin inc(count); WriteD(SSBoid); WriteD(SSB); WriteD(SSBprice); end;
if (SSA>0) then begin inc(count); WriteD(SSAoid); WriteD(SSA); WriteD(SSAprice); end;
if (SSS>0) and (count<4) then begin inc(count); WriteD(SSSoid); WriteD(SSS); WriteD(SSSprice); end;
if (BSSD>0) and (count<4) then begin inc(count); WriteD(BSSDoid); WriteD(BSSD); WriteD(BSSDprice); end;
if (BSSC>0) and (count<4) then begin inc(count); WriteD(BSSCoid); WriteD(BSSC); WriteD(BSSCprice); end;
if (BSSB>0) and (count<4) then begin inc(count); WriteD(BSSBoid); WriteD(BSSB); WriteD(BSSBprice); end;
if (BSSA>0) and (count<4) then begin inc(count); WriteD(BSSAoid); WriteD(BSSA); WriteD(BSSAprice); end;
if (BSSS>0) and (count<4) then begin inc(count); WriteD(BSSSoid); WriteD(BSSS); WriteD(BSSSprice); end;
if (count=0) then exit;
WriteD(count,6);
SendToServerEx(crafterName);
resetupTimer:=0;
trading:=true;
mainLoop.enabled:=true;
delayedProc.enabled:=false;
fixTrade.enabled:=false;
end;

procedure StopTrade;
begin
mainLoop.enabled:=false;
buf:=HStr('1D 01 00 00 00');
SendToServerEx(crafterName);
delay(200);
requestShopManage:=2;
buf:=#$73;
SendToServerEx(crafterName);
fixTrade.enabled:=true;
end;

procedure StopTrade2;
begin
requestShopManage:=0;
buf:=#$76;
SendToServerEx(crafterName);
delay(100);
trading:=false;
mainLoop.enabled:=true;
delayedProc.enabled:=false;
fixTrade.enabled:=false;
end;

procedure mainLoopTick;
var
toCraft :boolean;
begin
if moveOn.enabled then exit;

if (currentWayPoint=buyPoint) then
begin
mainLoop.enabled:=false;
targetWayPoint:=pathWayPoints;
shop.enabled:=true;
exit;
end;

if(soulOre<minSoulOre) or (spiritOre<minSpiritOre) then
begin
if (SSD+SSC+SSB+SSA+SSS+BSSD+BSSC+BSSB+BSSA+BSSS=0) then
begin buf:=HStr('1D 01 00 00 00'); SendToServerEx(crafterName); end
else StopTrade;
targetWayPoint:=buyPoint;
moveOn.enabled:=true;
exit;
end;

resetupTimer:=resetupTimer+10;
toCraft:=false;
if (SSD<maxSSD) then toCraft:=true;
if (SSC<maxSSC) then toCraft:=true;
if (SSB<maxSSB) then toCraft:=true;
if (SSA<maxSSA) then toCraft:=true;
if (SSS<maxSSS) then toCraft:=true;
if (BSSD<maxBSSD) then toCraft:=true;
if (BSSC<maxBSSC) then toCraft:=true;
if (BSSB<maxBSSB) then toCraft:=true;
if (BSSA<maxBSSA) then toCraft:=true;
if (BSSS<maxBSSS) then toCraft:=true;
if toCraft and (MP>maxMPtoCraft) and trading then
begin
mainLoop.enabled:=false;
crafting.enabled:=true;
exit;
end;
if (trading=false) then begin StartTrade; exit; end;
if (resetupTimer<shopResetupTime) then exit;
if (SSD+SSC+SSB+SSA+SSS+BSSD+BSSC+BSSB+BSSA+BSSS=0) then begin
buf:=HStr('1D 01 00 00 00');
SendToServerEx(crafterName);
exit;
end;
StopTrade;
end;

procedure craftingTick;
var
nocraft :boolean;
begin
nocraft:=true;
if (SSD<maxSSD) then begin buf:=HStr('AF 14 00 00 00'); SendToServerEx(crafterName); delay(33); nocraft:=false; end;
if (SSC<maxSSC) then begin buf:=HStr('AF 15 00 00 00'); SendToServerEx(crafterName); delay(33); nocraft:=false; end;
if (SSB<maxSSB) then ;
if (SSA<maxSSA) then ;
if (SSS<maxSSS) then ;
if (BSSD<maxBSSD) then begin buf:=HStr('AF 43 01 00 00'); SendToServerEx(crafterName); delay(33); nocraft:=false; end;
if (BSSC<maxBSSC) then begin buf:=HStr('AF 44 01 00 00'); SendToServerEx(crafterName); delay(33); nocraft:=false; end;
if (BSSB<maxBSSB) then ;
if (BSSA<maxBSSA) then ;
if (BSSS<maxBSSS) then ;

if (MP<minMP) or nocraft then
begin
crafting.enabled:=false;
mainLoop.enabled:=true;
exit;
end;
end;

procedure shoppingTick;
begin
if(shopPhase<4) then
begin
buf:=shopping[shopPhase];
SendToServerEx(crafterName);
inc(shopPhase);
exit;
end;
if(buyListID=0) then exit;
shopPhase:=1;
shop.enabled:=false;
buf:=#$1F;
WriteD(buyListID);
WriteD(0); i:=0;
if(soulOre<maxSoulOre) then
begin
WriteD(soulOreID); WriteD(maxSoulOre-soulOre);
inc(i);
end;
if(spiritOre<maxSpiritOre) then
begin
WriteD(spiritOreID); WriteD(maxSpiritOre-spiritOre);
inc(i);
end;
WriteD(i,6);
SendToServerEx(crafterName);
buyListID:=0;
moveOn.enabled:=true;
mainLoop.enabled:=true;
end;

procedure fixOnTimer;
begin
buf:=#$76;
SendToServerEx(crafterName);
delay(200);
buf:=#$73;
SendToServerEx(crafterName);
end;

procedure Init; //Вызывается при включении скрипта
begin
out := TForm.Create(nil);
out.Caption := 'Status';
out.BorderStyle := bsSizeable;
out.Position := poScreenCenter;
out.Width:=400;
out.Height:=600;
m:=TMemo.Create(out);
m.parent:=out;
m.align:=alClient;
m.ReadOnly:=true;
m.ScrollBars:=ssBoth;
out.Show;

infoUpdate:=TTimer.Create(nil);
infoUpdate.OnTimer:=@OnTimer;
infoUpdate.interval:=1000;

moveOn:=TTimer.Create(nil);
moveOn.OnTimer:=@moveOnTimer;
moveOn.interval:=1000;
moveOn.enabled:=false;

mainLoop:=TTimer.Create(nil);
mainLoop.OnTimer:=@mainLoopTick;
mainLoop.interval:=10000;
mainLoop.enabled:=false;

crafting:=TTimer.Create(nil);
crafting.OnTimer:=@craftingTick;
crafting.interval:=333;
crafting.enabled:=false;

shop:=TTimer.Create(nil);
shop.OnTimer:=@shoppingTick;
shop.interval:=500;
shop.enabled:=false;

delayedProc:=TTimer.Create(nil);
delayedProc.OnTimer:=nil;
delayedProc.interval:=333;
delayedProc.enabled:=false;

fixTrade:=TTimer.Create(nil);
fixTrade.OnTimer:=@fixOnTimer;
fixTrade.interval:=30000;
fixTrade.enabled:=false;

posX:=0; posY:=0; posZ:=0;
SSD:=0; SSC:=0; SSB:=0; SSA:=0; SSS:=0; BSSD:=0; BSSC:=0; BSSB:=0; BSSA:=0; BSSS:=0;
act:=0;
MyID:=0;
traderId:=0;
shopPhase:=1;
buyListID:=0;

currentWayPoint:=pathWayPoints;
targetWayPoint:=pathWayPoints;

pathX[1]:= 80687; pathY[1]:= 148621; pathZ[1]:= -3490;
pathX[2]:= 79833; pathY[2]:= 148476; pathZ[2]:= -3559;
pathX[3]:= 79804; pathY[3]:= 148213; pathZ[3]:= -3559;
pathX[4]:= 80247; pathY[4]:= 148172; pathZ[4]:= -3534;
pathX[5]:= 80466; pathY[5]:= 147892; pathZ[5]:= -3533;

pathX[6]:= 80185; pathY[6]:= 148185; pathZ[6]:= -3534;
pathX[7]:= 79787; pathY[7]:= 148246; pathZ[7]:= -3559;
pathX[8]:= 79867; pathY[8]:= 148584; pathZ[8]:= -3559;
pathX[9]:= 80885; pathY[9]:= 148624; pathZ[9]:= -3495;
pathX[10]:= 81749; pathY[10]:= 148292; pathZ[10]:= -3493;
pathX[11]:= 0; pathY[11]:= 0; pathZ[11]:= -3493;

shopping[3]:=HStr('21 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 30 00 00 00');

infoUpdate.enabled:=true;
initMode:=true;
trading:=false;
buf:=#$0F;
SendToServerEx(crafterName);
{delay(100);
buf:=HStr('A0 03 00 00 00');
SendToServerEx(crafterName);}
end;

procedure Free; //Вызывается при выключении скрипта
begin
mainLoop.Free;
crafting.Free;
infoUpdate.Free;
moveOn.Free;
m.Free;
out.Free;
fixTrade.Free;
delayedProc.Free;
shop.free;
end;

procedure OnConnect(WithClient: Boolean); //Вызывается при установке соединения
begin

end;

procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения
begin

end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if (ConnectName<>crafterName) then exit;
case FromServer of
true: begin //Обработка пакетов сервера

if (pck[1]=#$04) then
begin
maxMP:=ReadD(84);
MP:=ReadD(88);
if initMode=false then exit;

posX:=ReadD(2);
posY:=ReadD(6);
posZ:=ReadD(10);
initMode:=false;
MyID:=ReadD(18);

moveOn.enabled:=true;
mainLoop.enabled:=true;
resetupTimer:=0;
exit;
end;

if (pck[1]=#$1B) then //Загрузка инвентаря
begin
count:=ReadH(4);
for i:=0 to count-1 do
case ReadD(i*28+12) of
SSDid: begin SSD:=ReadD(i*28+16); SSDoid:=ReadD(i*28+8); end;
SSCid: begin SSC:=ReadD(i*28+16); SSCoid:=ReadD(i*28+8); end;
SSBid: begin SSB:=ReadD(i*28+16); SSBoid:=ReadD(i*28+8); end;
SSAid: begin SSA:=ReadD(i*28+16); SSAoid:=ReadD(i*28+8); end;
SSSid: begin SSS:=ReadD(i*28+16); SSSoid:=ReadD(i*28+8); end;
BSSDid: begin BSSD:=ReadD(i*28+16); BSSDoid:=ReadD(i*28+8); end;
BSSCid: begin BSSC:=ReadD(i*28+16); BSSCoid:=ReadD(i*28+8); end;
BSSBid: begin BSSB:=ReadD(i*28+16); BSSBoid:=ReadD(i*28+8); end;
BSSAid: begin BSSA:=ReadD(i*28+16); BSSAoid:=ReadD(i*28+8); end;
BSSSid: begin BSSS:=ReadD(i*28+16); BSSSoid:=ReadD(i*28+8); end;
soulOreID: begin soulOre:=ReadD(i*28+16); end;
spiritOreID: begin spiritOre:=ReadD(i*28+16); end;
end;
exit;
end;

if (pck[1]=#$27) then //Обновление инвентаря
begin
count:=ReadH(2);
for i:=0 to count-1 do
begin
act:=ReadH(i*30+4);
case ReadD(i*30+12) of
SSDid: case act of
1: SSD:=SSD+ReadD(i*30+16);
2: SSD:=ReadD(i*30+16);
3: SSD:=SSD-ReadD(i*30+16);
end;
SSCid: case act of
1: SSC:=SSC+ReadD(i*30+16);
2: SSC:=ReadD(i*30+16);
3: SSC:=SSC-ReadD(i*30+16);
end;
SSBid: case act of
1: SSB:=SSB+ReadD(i*30+16);
2: SSB:=ReadD(i*30+16);
3: SSB:=SSB-ReadD(i*30+16);
end;
SSAid: case act of
1: SSA:=SSA+ReadD(i*30+16);
2: SSA:=ReadD(i*30+16);
3: SSA:=SSA-ReadD(i*30+16);
end;
SSSid: case act of
1: SSS:=SSS+ReadD(i*30+16);
2: SSS:=ReadD(i*30+16);
3: SSS:=SSS-ReadD(i*30+16);
end;
BSSDid: case act of
1: BSSD:=BSSD+ReadD(i*30+16);
2: BSSD:=ReadD(i*30+16);
3: BSSD:=BSSD-ReadD(i*30+16);
end;
BSSCid: case act of
1: BSSC:=BSSC+ReadD(i*30+16);
2: BSSC:=ReadD(i*30+16);
3: BSSC:=BSSC-ReadD(i*30+16);
end;
BSSBid: case act of
1: BSSB:=BSSB+ReadD(i*30+16);
2: BSSB:=ReadD(i*30+16);
3: BSSB:=BSSB-ReadD(i*30+16);
end;
BSSAid: case act of
1: BSSA:=BSSA+ReadD(i*30+16);
2: BSSA:=ReadD(i*30+16);
3: BSSA:=BSSA-ReadD(i*30+16);
end;
BSSSid: case act of
1: BSSS:=BSSS+ReadD(i*30+16);
2: BSSS:=ReadD(i*30+16);
3: BSSS:=BSSS-ReadD(i*30+16);
end;
soulOreID: case act of
1: soulOre:=soulOre+ReadD(i*30+16);
2: soulOre:=ReadD(i*30+16);
3: soulOre:=soulOre-ReadD(i*30+16);
end;
spiritOreID: case act of
1: spiritOre:=spiritOre+ReadD(i*30+16);
2: spiritOre:=ReadD(i*30+16);
3: spiritOre:=spiritOre-ReadD(i*30+16);
end;
end;
end;
exit;
end;

if (pck[1]=#$0E) and (ReadD(2)=MyID) then
begin
count:=ReadD(6);
for i:=0 to (count-1) do
case ReadD(10+i*8) of
11: MP:=ReadD(14+i*8);
12: maxMP:=ReadD(14+i*8);
end;
exit;
end;

if (pck[1]=#$9A) and (ReadD(2)=MyID) then begin
count:=ReadD(14);
for i:=0 to count-1 do
case ReadD(i*30+26) of
SSDid: SSDoid:=ReadD(i*30+22);
SSCid: SSCoid:=ReadD(i*30+22);
SSBid: SSBoid:=ReadD(i*30+22);
SSAid: SSAoid:=ReadD(i*30+22);
SSSid: SSSoid:=ReadD(i*30+22);
BSSDid: BSSDoid:=ReadD(i*30+22);
BSSCid: BSSCoid:=ReadD(i*30+22);
BSSBid: BSSBoid:=ReadD(i*30+22);
BSSAid: BSSAoid:=ReadD(i*30+22);
BSSSid: BSSSoid:=ReadD(i*30+22);
end;

case requestShopManage of
0: exit;
1: delayedProc.OnTimer:=@StartTrade2;
2: delayedProc.OnTimer:=@StopTrade2;
end;
delayedProc.enabled:=true;
exit;
end;

if (pck[1]=#$11) then buyListID:= ReadD(6);

end; //end of case 'true'

false: begin //Обработка пакетов клиента

if (pck[1]=#$48) then
begin
posX:=ReadD(2);
posY:=ReadD(6);
posZ:=ReadD(10);
exit;
end;

if (pck[1]=#$04) and (traderId=0) then
begin
traderId:=ReadD(2);
buf:=#$04;
WriteD(traderID);
WriteD(posX);
WriteD(posY);
WriteD(posZ);
WriteC(0);
shopping[1]:=buf;
shopping[2]:=buf;
end;

end; //end of case 'false'
end; //end of case

end.


Добавлено через 1 час 59 минут
Ой, забыл... После старта скрипта надо выделить трейдера Helvetia в гиране, которая торгует сырьем для сосок. И еще я забыл совсем убрать команды чата - они были для отладочных целей сделаны. лучше их не юзать, я хз какой эффект от них будет основному алгоритму.
Первый блин комом :mega_shok:

TyCoH
17.03.2009, 03:06
У меня возник очень не скромный и нубский вопрос, как это все дело заюзать ? )

Sieg
17.03.2009, 19:34
Как и все остальные скрипты.

Добавлено через 4 часа 44 минуты
Исправил баг: бот после некоторого времени перестает садиться на торг. ИМХО не надо крафтить во время продажи =)

Кстати, этого бота мастерил под С4 и л2пнх v.3.3.2
Более старшие версии ни в какую не хотят работать с моим клиентом линяги.

Добавлено через 1 час 10 минут
Эхх... баг на баге и багом погоняет. Исправил ошибку, которая возникала, когда скупали все соски одного вида. Не обновлялся ID этих сосок после последующего их крафта.

Dimka
25.03.2009, 11:09
Sieg, Подскажи пож, загрузил чара, активировал скрипт, выделил Helvetia у меня открывается инвентарь и гном начинает ломиться в угол. Что не так?:)

Sieg
25.03.2009, 13:14
Dimka, читай внимательнее 1й пост

Просьба ко всем, кто будет пользоваться этим скриптом: переправьте в массиве pathX, pathY и pathZ последнюю точку пути. Или сам массив измените, чтоб бегал по другому маршруту. Иначе, все боты будут сидеть в одном месте.

Dimka
26.03.2009, 11:30
Dimka, читай внимательнее 1й пост

pathX[1]:= 80455; pathY[1]:= 147927; pathZ[1]:= -3504;
pathX[2]:= 80110; pathY[2]:= 147632; pathZ[2]:= -3504;
pathX[3]:= 79686; pathY[3]:= 147618; pathZ[3]:= -3528;
pathX[4]:= 80435; pathY[4]:= 146949; pathZ[4]:= -3528;
pathX[5]:= 81529; pathY[5]:= 146925; pathZ[5]:= -3528;

pathX[6]:= 81546; pathY[6]:= 147789; pathZ[6]:= -3464;
pathX[7]:= 82262; pathY[7]:= 147783; pathZ[7]:= -3464;
pathX[8]:= 82864; pathY[8]:= 147698; pathZ[8]:= -3464;
pathX[9]:= 82936; pathY[9]:= 147851; pathZ[9]:= -3464;
pathX[10]:= 82893; pathY[10]:= 147902; pathZ[10]:= -3464;
pathX[11]:= 0; pathY[11]:= 0; pathZ[11]:= -3464;

Я вот эти координаты поменял, но он всё равно после старта ломится в угол :o Если можешь объясни подробней что не так. Или аську оставь :pleasantry:

Sieg
26.03.2009, 15:38
PathX[11], PathY[11], PathZ[11] - вот их менять надо. Он у тебя в угол утыкается потому, что пытается бежать к координатам [0, 0, -3464], а это оооооооооочень далеко от Гирана.

Dimka
26.03.2009, 16:31
Во я нуб :D Так он начинает свой путь от 11 к 1? 11 это координаты около нпс в магазе? Спасибо тебе что объясняешь нупику :) Тестил на Абуссе х5

Sieg
26.03.2009, 23:00
Нет, он так не делает. Последняя точка - это место постоянного торга, где гном сидит 99% всего своего времени, торгуя сосками. Я сделал так, что при включении скрипта гном первым делом бежит к этой точке. В последствии, если ему надо сходить за покупками, он идет по порядку: 1, 2, 3, .... 11. Логично, что последняя точка пути - это место продажи.

Dimka
27.03.2009, 09:09
Всё настроил бегает закупается, садится на трейд, но из 5 видов сосок ставит только один вид, если сам накидываешь трейд, то после реситапа ставит опять один вид сосок :confused:

Sieg
27.03.2009, 14:12
Обновил скрипт в первом посте. Исправлен ряд ошибок, я уж и забыл каких..
Dimka, глянь, что у тебя в окне статуса показывает, которое открывается при старте скрипта. А еще лучше сюда скапируй всю инфу.

nezabudkin
27.03.2009, 16:49
Sieg, пробуй от команды delay избавляться, ибо тормозит она работу всего пакетхака. На форуме много примеров как без нее обойтись! Не бойся много таймеров напихать в код.

Sieg
27.03.2009, 19:38
Там delay не так уж и часто использован. А где есть, то задержки не больше 100мс, так что не надо гнать. У меня ничего не тормозит.

Anton5
05.04.2009, 12:52
Я сам месяца 3-4 назад писал подобный скрипт(около 1000 строк поучилось), но через некоторое время забил.(нашёл более простой способ заработка)
Что хотел зделать: бот садится крафтить все виды сосок(на тот момент мог только D, C)(на складе лежат необходимые ресурсы), сидят персы в разных городах(Дион, Гиран), как у одного из них кончаются соски(продавал D, C обычные и маг соски) он бежит кним(делает ТП если надо), пополняет запас и возврашается на место крафта и крафтит.

Автору РЕСПЕКТ

PS я сам когда начинал писать данный скрипт тоже практически не знал Паскаль, потихоньку разбирался. Сравнил свой и твой скрит, твой написан лучше(в моём чёртногу сломит) Ещё раз РЕСПЕКТ Правдо я его врятли буду использовать, нетребуется.