kpa9pt, один хер, те кому они были бы полезны, не смогут разобраться как их юзать, а тот кто сможет - сам напишет
Лан, завтра мб напишу статью сюда про скрипт заточки выложу куски и всё по шагам разберу, всёравно там мало кому такой нужен будет скрипт, мало кто точит б щиты покупая в люксоре их и доставая из вх точки в видде 5к штук)
Итак как обещал скрипт пошагово на авто заточку Щитов Б грейда из люксора.
З.Ы.: Писал довольно давно и не выйдет очень красиво в (духе здесь и сейчас) написать описание. З.Ы2.: Тогда я относился скептически к объявлению переменных в процедуре и поэтому там с ними просто дикий "анал карнавал". З.Ы3.: Сейчас я понимаю что скрипт можно было бы написать намного проще красивее и лучше но переписывать уже поздно поэтому то что есть:
Писать буду в стиле с чего начать и как продолжить.
Шаг 1.
Нужно записать процедуру для отправки пакета заточки щита, чтобы дальше в циклах обработки её вызывать. Вот она:
PHP код:
procedure UseItem(ItemID:integer); begin buf:=#$19; Writed(ItemID); Writed(0); SendToServerEx(name); end;
procedure Enchant(Id:integer); begin buf:=#$D0; Writeh(76); Writed(Id); SendToServerEx(name); end;
procedure Ench(ID:integer); begin buf:=#$5F; Writed(ID); Writed(0); SendToServerEx(name); end;
Три шага заточки: юзнуть точку, выбрать щит и заточить.
Шаг 2.
Итак, вещь точится и теперь дальше нужно как-то отслеживать уровень её заточки чтобы знать когда остановиться.
А также кол-во заточек в инвентаре т.к. мой несчастный гном сразу 5к не мог взять , был дикий перевес и я периодически доставал их из WareHouse.
Это видно в пакете Itemlist или в пакете InventaryUpdate - пишем их процедуры которые будут вызываться всякий раз как приходит их пакет.
PHP код:
procedure Itemlist; begin j:=0; Itemlist:=readh(4); list1:=6; for i:=1 to Itemlist do begin reading:=false; if (Readd(list1+4)=ItemforEnchID) then begin Items[1,j]:=Readd(list1);//OID Items[2,j]:=Readh(list1+26);//Enchlvl inc(j); reading:=true; end; if (Readd(list1+4)=Scroll) then begin ScrollID:=Readd(list1); ScrollCount:=Readd(list1+8); reading:=true; end; if reading then begin inc(list1,64); end else begin inc(list1,68); end; end; end;
PHP код:
procedure InventaryUpdate; begin j:=0; Itemlist2:=Readh(2); list2:=6; for v:=1 to Itemlist2 do begin recording2:=false; for j:=0 to 96 do begin list2:=6+(v-1)*70; if (Items[1,j]=Readd(list2)) then begin case Readh(list2-6) of 1://Add begin
end; 2://Mode begin Items[2,j]:=Readh(list2+26); end; 3://Dell begin Items[1,j]:=0; Items[2,j]:=0; end; end; recording2:=true; end else begin
end; end; if (Readd(list2-4)=ScrollID) then begin case Readh(list2-6) of 1://Add begin
end; 2://Mode begin ScrollCount:=readd(list2+8); end; 3://Dell begin ScrollID:=0; ScrollCount:=0;
Дальше допустим у нас закончились щиты или заточки, тогда надо писать процедуры на покупку щитов и доставание заточек и там же скидывание готовых на нужный уровень (например на 7) на склад.
Итак первое это будто мы уже около нпс люксора.
PHP код:
procedure Shield;
begin
buf:=#$1F;
Writed(NPC2id);
Writed(MyX);
Writed(MyY);
Writed(MyZ);
Writec(0);
SendToServerEx(name);
Ну это всеголиш начало диалогов с этими NPC. Сам процес покупки щитов или складывания их на клад происходит когда приходит пакет "HTML от нпс".
Вот его обработка:
PHP код:
procedure HTML;
begin
If (Readd(2)=NPCid) and firstnpc then
begin
buf:=#$22;
Writes('pochi001a.htm');
SendToServerEx(name);
firstnpc:=false;
end;
If (Readd(2)=NPCid) and npcscroll then
begin
buf:=#$22;
Writes('pochi001a.htm');
SendToServerEx(name);
npcscroll:=false;
end;
if (Readd(2)=NPCid) and (ReadS(6)='<html><body>Warehouse Keeper Pochi:<br><center><a action="bypass -h deposit">Deposit an item. (Private Warehouse)</a><br><a action="bypass -h withdraw">Withdraw an item. (Private Warehouse)</a><br><br><a action="link pochi001.htm">Return</a></center><br><br>Смотритель Склада Почи:<br><center><a action="bypass -h deposit">Сдать предмет на хранение. (Личный Склад)</a><br><a action="bypass -h withdraw">Забрать предмет. (Личный Склад)</a><br><br><a action="link pochi001.htm">Вернуться</a></center></body></html>') then
begin
if scrollcount<>0 then
begin
buf:=#$23;
WriteS('deposit');
SendToServerEx(name);
end
else
begin
buf:=#$23;
WriteS('withdraw');
SendToServerEx(name);
end;
end;
If (Readd(2)=NPC2id) then
begin
for n:=1 to 40 do
begin
buf:=#$B0;
Writed(2);
Writed(13);
Writeq(1);
writeh(0);
Writed(0);
Writed(0);
Writeh(65534);
writeh(0);
writeh(0);
writeh(0);
writeh(0);
writeh(0);
writeh(0);
writeh(0);
sendToServerEx(name);
end;
fromwh:=false;
buf:=#$14;
sendtoserverex(name);
end;
pck:='';
buf:=#$14;
SendToServerEx(name);
end;
Самые глазастые увидят, что щиты тут не убираются и заточки не берутся из вх. Да это так это происходит когда приходят два пакета соответственно на массив вещей что у тебя есть, чтобы скинуть их, и на массив вещей которые на складе, чтобы от туда что-то взять.
Вот две процедуры обработки, где скидываются вещи и берутся:
PHP код:
procedure put;
begin
j:=0;
Itemlist3:=readh(12);
list3:=14;
MaxGoodItems:=0;
for o:=1 to Itemlist3 do
begin
if (lvlENCHANT=Readd(list3+30)) then
begin
GoodItems[j]:=Readd(list3+68);
inc(j);
inc(MaxgoodItems);
end;
list3:=14+o*72
end;
procedure output;
begin
Itemlist4:=Readh(12);
List4:=14;
for l:=1 to Itemlist4 do
begin
if (Scroll=Readd(list4+4)) then
begin
ScrollOID:=Readd(list4+68);
//exit;
end;
inc(list4,72);
end;
Опять таки, тут не всё, остальное в двух таймерах интервалов 5 сек:
PHP код:
procedure OnTimerToGO(Sender:Tobject);
begin
WHput;
TimerToGo.enabled:=false;
buf:=#$14;
sendtoserverex(name);
end;
procedure OnTimerToGO2(Sender:Tobject);
begin
WHoutput;
TimerToGo2.enabled:=false;
buf:=#$14;
sendtoserverex(name);
end;
Ну и наконец:
PHP код:
procedure WHput;
begin
if GoodItems[0]<>0 then
begin
buf:=#$3B;
Writed(MaxGoodItems);
for b:=0 to (MaxGoodItems-1) do
begin
Writed(GoodItems[b]);
Writed(1);
Writed(0);
end;
SendToserverEx(name);
end;
buf:=#$56;
Writed(33);
Writed(0);
Writec(0);
SendToserverEx(name);
gofromWH;
fromwh:=true;
end;
procedure WHoutput;
begin
if Scrollcount=0 then
begin
buf:=#$3C;
Writed(1);
Writed(ScrollOID);
Writed(400);
Writed(0);
SendToServerEx(name);
end;
gofromwh;
end;
Шаг 4.
Напишем процедуры перемещения от склада к нпс люксора и наоборот.
З.Ы.: Написаны они ужасно))
PHP код:
procedure goWH;
begin
buf:=#$14;
SendToServerEx(name);
if (Loc1x-70<MyX) and (MyX<Loc1x+70) and (Loc1y-70<Myy) and (Myy<Loc1y+70) and (Loc1z-70<Myz) and (Myz<Loc1z+70) then
begin
MoveBackwardToLocation(Loc2x,loc2y,loc2z);
end;
if (Loc2x-70<MyX) and (MyX<Loc2x+70) and (Loc2y-70<Myy) and (Myy<Loc2y+70) and (Loc2z-70<Myz) and (Myz<Loc2z+70) then
begin
MoveBackwardToLocation(loc3x,loc3y,loc3z);
end;
if (Loc3x-70<MyX) and (MyX<Loc3x+70) and (Loc3y-70<Myy) and (Myy<Loc3y+70) and (Loc3z-70<Myz) and (Myz<Loc3z+70) then
begin
MoveBackwardToLocation(loc4x,loc4y,loc4z);
end;
if (Loc4x-70<MyX) and (MyX<Loc4x+70) and (Loc4y-70<Myy) and (Myy<Loc4y+70) and (Loc4z-70<Myz) and (Myz<Loc4z+70) then
begin
WH;
end;
end;
procedure gofromWH;
begin
buf:=#$14;
SendToServerEx(name);
if (Loc4x-70<MyX) and (MyX<Loc4x+70) and (Loc4y-70<Myy) and (Myy<Loc4y+70) and (Loc4z-70<Myz) and (Myz<Loc4z+70) then
begin
MoveBackwardToLocation(loc3x,loc3y,loc3z);
end;
if (Loc3x-70<MyX) and (MyX<Loc3x+70) and (Loc3y-70<Myy) and (Myy<Loc3y+70) and (Loc3z-70<Myz) and (Myz<Loc3z+70) then
begin
MoveBackwardToLocation(loc2x,loc2y,loc2z);
end;
if (Loc2x-70<MyX) and (MyX<Loc2x+70) and (Loc2y-70<Myy) and (Myy<Loc2y+70) and (Loc2z-70<Myz) and (Myz<Loc2z+70) then
begin
MoveBackwardToLocation(loc1x,loc1y,loc1z);
end;
if (Loc1x-70<MyX) and (MyX<Loc1x+70) and (Loc1y-70<Myy) and (Myy<Loc1y+70) and (Loc1z-70<Myz) and (Myz<Loc1z+70) then
begin
Shield;
end;
Ну и наконец процедура для того чтобы это дело всё точилось и он соображал когда надо бежать за точками или щитами
PHP код:
procedure OnTimerEnch(Sender:Tobject);
begin
for jj:=0 to (lvlENCHANT-1) do
begin
for ii:=0 to 96 do
begin
if (Items[2,ii]=jj) and (Items[1,ii]<>0) and (Scrollid<>0) and (ScrollCount<>0) then
begin
UseItem(ScrollID);
Enchant(Items[1,ii]);
Ench(Items[1,ii]);
exit;
end;
end;
end;
if (Scrollcount=0) then
begin
wantscroll;
end;
if (jj=(lvlENCHANT-1)) and (ii=96) and not fromwh then
begin
goWH;
end;
if (jj=(lvlENCHANT-1)) and (ii=96) and fromwh then
begin
gofromWH;
end;
end;
P.S.: Скрипт запускается по OldSchool соц действиями, написал вроде бы всё что надо было. Кто жаждет разобраться пишите вопросы сюда.
P.S.: Скрипт писался на rpg-club на хрониках GF или HF уже не помню.