Внес изменения в рыбалку для работы на Интерлюде. Пробуйте.
Код:
//Автоматизация ловли рыбы для Interlude by NLObP
//возможность нескольких одновременных скриптов
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656
//Изменения для работы на Интерлюде
//Необходимо затариться удочкой и крючками, шотами
//выучить соответствующие скиллы
//1 одеть и снять: удочку, крючек, мечь, щит для определения ObjectID
//2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID
//Социальное действие YES - начать
//Социальное действие NO - остановиться
//Enjoy!
{Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.}
const
Name='NLObP'; //изменить на имя чара
fish=1312;
pump=1313;
reel=1314;
var
timer: TTimer;
status, status2, RodInUse: boolean;
Lure, ColvoLure, Shot, ColvoShot, CharObjID: Integer;
SocialID: Integer;
Cmd:string;
//******************************************************************************
//
//******************************************************************************
procedure Init; //Вызывается при включении скрипта
begin
Shot:=0;
Status:=false;
Status2:=false;
RodInUse:=false;
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=false;
timer.interval:=5000; //время задержки
Say('1 одеть и снять: удочку, крючек, мечь, щит для определения ObjectID!');
Say('2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID!');
end;
//******************************************************************************
//
//******************************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
timer.Free;
end;
//******************************************************************************
//пакет 2F=RequestMagicSkillUse:h(MagicID)d(CtrlPressed)b(ShiftPressed)
procedure MagicSkillUse(MagicID:integer);
begin
buf:=#$2F;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;
//******************************************************************************
procedure UseItem(ObjID:integer);
begin
buf:=#$14;
WriteD(ObjID);
WriteD(00);
SendToServerEx(Name);
end;
//******************************************************************************
//посылаем сообщение, которое видно только в окне бота
//можно использовать для отладки
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//******************************************************************************
procedure Fishing;
begin
if ColvoLure<>0 then MagicSkillUse(fish)
else begin
Status:=false;
RodInUse:=false;
Say('Кончились крючки!');
end;
end;
//******************************************************************************
procedure Pumping;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
MagicSkillUse(pump);
end;
//******************************************************************************
procedure Reeling;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
MagicSkillUse(reel);
end;
//******************************************************************************
//ItemList - Interlude
{
1 1 writeC(0x1B);
2 2 writeH(_showWindow ? 1 : 0);
4 2 writeH(_items.length);
for(L2ItemInstance temp : _items)
6 2 writeH(temp.getItem().getType1()); // item type1
8 4 writeD(temp.getObjectId());
12 4 writeD(temp.getItemId());
16 4 writeD(temp.getCount());
20 2 writeH(temp.getItem().getType2()); // item type2
22 2 writeH(temp.getCustomType1()); // item type3
24 2 writeH(temp.isEquipped() ? 1 : 0);
26 4 writeD(temp.getItem().getBodyPart()); // rev 415 slot 0006-lr.ear 0008-neck 0030-lr.finger 0040-head 0080-?? 0100-l.hand 0200-gloves 0400-chest 0800-pants 1000-feet 2000-?? 4000-r.hand 8000-r.hand
30 2 writeH(temp.getEnchantLevel()); // enchant level
//race tickets
32 2 writeH(temp.getCustomType2()); // item type3
34 4 writeD(0); // augmentation id
38 4 writeD(temp.getLifeTimeRemaining()); // shadow weapon life time
42
}
Function ObjtoColvoIL(ItemObjID:integer): integer;
var
i: integer;
begin
if ItemObjID=0 then exit;
for i:=0 to ReadD(4)-1 do begin
if ItemObjID=ReadD(i*36+8) then begin
Result:=ReadD(i*36+16); //количество
exit;
end;
end;
Result:=0;
end;
//ItemList - C4
{
1 1 writeC(0x1b);
2 2 writeH(0x01);
4 2 writeH(count);
for (L2ItemInstance temp : _items)
6 2 writeH(temp.getItem().getType1()); // item type1
8 4 writeD(temp.getObjectId());
12 4 writeD(temp.getItemId());
16 4 writeD(temp.getCount());
20 2 writeH(temp.getItem().getType2()); // item type2
22 2 writeH(temp.getCustomType1()); // item type3
24 2 writeH(0x01);
26 4 writeD(temp.getItem().getBodyPart()); // rev 415 slot 0006-lr.ear 0008-neck 0030-lr.finger 0040-head 0080-?? 0100-l.hand 0200-gloves 0400-chest 0800-pants 1000-feet 2000-?? 4000-r.hand 8000-r.hand
30 2 writeH(temp.getEnchantLevel()); // enchant level
//race tickets
32 2 writeH(temp.getCustomType2()); // item type3
}
Function ObjtoColvoC4(ItemObjID:integer): integer;
var
i: integer;
begin
if ItemObjID=0 then exit;
for i:=0 to ReadD(4)-1 do begin
if ItemObjID=ReadD(i*28+8) then begin
Result:=ReadD(i*28+16); //количество
exit;
end;
end;
Result:=0;
end;
//******************************************************************************
procedure OnTimer(Sender: TObject);
begin
Fishing;
timer.enabled:=false;
end;
//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//не обрабатываем пустые пакеты
if pck='' then exit;
//****************************************************************************
//если от сервака принят пакет с UserInfo. Запоминаем собственный ИД
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then CharObjID:=ReadD(18);
//****************************************************************************
{необходимо уточнить ItemID для своего сервера!!!
6519=Green Colored Lure - Low Grade A
6520=Green Colored Lure - Medium Grade
6521=Green Colored Lure - High Grade
6522=Purple Colored Lure - Low Grade
6523=Purple Colored Lure - Medium Grade
6524=Purple Colored Lure - High Grade
6525=Yellow Colored Lure - Low Grade
6526=Yellow Colored Lure - Medium Grade
6527=Yellow Colored Lure - High Grade}
//InventoryUpdate(27):w(count)w(1add2mod3remove)w(itemType1)h(ObjectID)i(ItemId)d(Count)
//запоминаем ObjectID Lure и ColvoLure
if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)>=6519) and (ReadD(12)<=6527)) then begin
Lure:=ReadD(8);
ColvoLure:=ReadD(16); //количество крючков
//Say('Крючков='+inttostr(ColvoLure));
end;
//****************************************************************************
{необходимо уточнить ItemID для своего сервера!!!
6535=Fishing Shot: non-grade
6536=Fishing Shot: D-grade
6537=Fishing Shot: C-grade
6538=Fishing Shot: B-grade
6539=Fishing Shot: A-grade
6540=Fishing Shot: S-grade}
//InventoryUpdate(27):w(count)w(1add2mod3remove)w(itemType1)h(ObjectID)i(ItemId)d(Count)
//запоминаем ObjectID Fishing Shot и ColvoShot
if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)>=6535) and (ReadD(12)<=6540)) then begin
Shot:=ReadD(8);
ColvoShot:=ReadD(16); //количество шотов
//Say('Шотов='+inttostr(ColvoShot));
end;
//****************************************************************************
if (CharObjID<>0) and (ColvoLure<>0) and not status2 then begin //(Shot<>0) and (ColvoShot<>0) and
Say('Автоматизация ловли рыбы готово к работе!');
status2:=true;
end;
//******************************************************************************
//ItemList (1B)
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
ColvoShot:=ObjtoColvoIL(Shot); //количество шотов
//Say('Shot='+inttostr(ColvoShot));
ColvoLure:=ObjtoColvoIL(Lure); //количество крючков
//Say('Lure='+inttostr(ColvoLure));
end;
//****************************************************************************
//ловим рыбу
if Status and FromServer and (ConnectName=Name) and (CharObjID<>0) then begin
//FishingEnd
if (pck[1]+pck[2]=#$FE#$14) and (CharObjID=ReadD(4)) then timer.enabled:=true; //FishingEnd ждем N секунд межде рыбалками
//FishinHPRegen
if (pck[1]+pck[2]=#$FE#$16) and (CharObjID=ReadD(4)) and (pck[15]+pck[16]=#$00#$00) then pumping;
if (pck[1]+pck[2]=#$FE#$16) and (CharObjID=ReadD(4)) and (pck[15]+pck[16]=#$00#$01) then reeling;
end;
//****************************************************************************
if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
SocialID:=ReadD(2);
case SocialID of
//социальное действие Yes для начала ловли
6: begin
if CharObjID=0 then exit;
Status:=true;
RodInUse:=true;
Fishing;
end;
//социальное действие No для окончания
5: begin
if CharObjID=0 then exit;
if Status and RodInUse then Fishing;
Status:=false;
RodInUse:=false;
timer.enabled:=false;
end;
end;
end;
end.