PDA

Просмотр полной версии : Вопросик


mirt
29.03.2009, 14:58
В общем есть такой скриптик под интерлюдию для рыбалки и мне он очень нравиться. Но есть проблемка , он не работает под грацию.
В инете я находил скрипты под грацию, но они очень громоздкие и там оч. много чего не нужного. Просьба такая, у кого нибудь если будет время может адаптировать этот скриптик под грацию. Признаюсь сразу что в програмирование я полный 0. Единственная надежда осталась только на вас. И да, заранее извенюсь если уже что-то подобное было, ибо воспользовавшись поиском ничего не нашел.

//Автоматизация ловли рыбы by NLObP для Интерлюдии и L2PacketHack v.3.1.8//

{Скрипт распространяется как есть, и я не несу ответственности
за то, что ВЫ натворили у себя, его используя.

Возможности скрипта:
Может работать несколько одновременных скриптов.
При нападении моба может атаковать его и может лечиться бутылками (настраиваемо).
Потрошит пойманную рыбу.
Подбирает выпавшие предметы.

Необходимо затариться удочкой и крючками, фишин-шотами
выучить соответствующие скиллы рыбалки.
При желании защищаться купить подходящее оружие, щит, соулшоты, бутылки.

!!!ВНИМАНИЕ!!!
!!!Перед первым использованием требуется внести изменение в константые!!!}
const
Name='SHAHIDenish'; //имя чара для которого включаем скрипт
HPbutt=70; // при каком количестве хп в % юзать бутылку лечения
HPuse1=true; //использовать ли бутылки лечения? true-да, false-нет
weapon1=true; //использовать оружие? true-да, false-нет
shield1=false;//использовать щит? true-да, false-нет

{Для инициализации скрипта проделай ниже следующее!!!
Главное не перепутй!!! За последствия не ручаюсь!!!'
- правая клавиша мыши (ПКМ) на оружии; Если было включено использование!!!
- ПКМ на щите; Если было включено использование!!!
- ПКМ на бутылке; Если было включено использование!!!
- ПКМ на удочке;
- ПКМ на крючке.
В процессе рыбалки используй один раз фишин-шот.
При необходимости включи соул-шоты в автоматический режим.

Социальное действие YES - начать рыбалку.
Социальное действие NO - остановиться.

Enjoy!

Скрипт проверялся на локальном сервере Интерлюдии "RT-Server-C6"}

//************************************************** *************
const
fish=1312; //'2F 20 05 00 00 00 00 00 00 00';
pump=1313; //'2F 21 05 00 00 00 00 00 00 00';
reel=1314; //'2F 22 05 00 00 00 00 00 00 00';

//************************************************** *************
var
StartTime: TDateTime;
EndTime: TDateTime;

info, msg, stats: TMemo;
frm: TForm;

UpdType, ItemObjID, ItemID, Lvl: integer;
fish1, fish2, mob1, death1: integer;

timer: TTimer;
timer2: TTimer;

status, status2, RodInUse:boolean;
Lure, ColvoLure, Shot, ColvoShot: Integer;
i, j: integer;

//защита от мобов
HPobjID, RodObjID, LureObjID: integer;
WeaponID, ShieldID, WeaponObjID, ShieldObjID,AttackerID, AttackerObjID: Integer;
MaxHP, CurHP, MyID, but: integer ;
MyXpos, MyYpos, MyZpos: integer;
Lure1, Rod1: boolean;
AnderAttack,HPuse2, Weapon2, Shield2, Lure2, Rod2: boolean;

//************************************************** *************
//Вызывается при включении скрипта
//************************************************** *************
procedure Init;
begin
Shot:=0;
Status:=false;
Status2:=false;
RodInUse:=false;
rod1:=true;
lure1:=true;

HPuse2:=false; //задействовано true-да, false-нет
weapon2:=false;
shield2:=false;
rod2:=false;
lure2:=false;

anderattack:=false; //атакован?

//форма
frm := TForm.Create(nil);
frm.Caption := 'FishBOT Info!';
frm.BorderStyle := bsSizeable;
frm.Position := poScreenCenter;
frm.Width:=570;
frm.Height:=500;
info:=TMemo.Create(frm);
info.parent:=frm;
info.align:=alLeft;
info.ReadOnly:=true;
info.ScrollBars:=2;
info.Width:=385;
info.Height:=370;
msg:=TMemo.Create(frm);
msg.parent:=frm;
msg.align:=alBottom;
msg.ReadOnly:=true;
msg.ScrollBars:=2;
msg.Width:=570;
msg.Height:=100;
msg.Lines.Add('...');
stats:=TMemo.Create(frm);
stats.parent:=frm;
stats.align:=alRight;
stats.ReadOnly:=true;
stats.ScrollBars:=0;
stats.Width:=180;
stats.Height:=100;
frm.Show;

//таймеры, можно поправить время по обстоятельствам
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=false;
timer.interval:=3000; //время задержки
timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2;
timer2.enabled:=true;
timer2.interval:=3000; //время задержки

info.Lines.Add('Автоматизация ловли рыбы by NLObP!');
info.Lines.Add('Для инициализации скрипта проделай ниже следующее!!!');
info.Lines.Add('Главное не перепутй!!! За последствия не ручаюсь!!!');
if (weapon1=true) then begin
info.Lines.Add('- правая клавиша мыши (ПКМ) на оружии;');
end;
if (shield1=true) then begin
info.Lines.Add('- ПКМ на щите;');
end;
if (HPuse1=true) then begin
info.Lines.Add('- ПКМ на бутылке;');
end;
info.Lines.Add('- ПКМ на удочке;');
info.Lines.Add('- ПКМ на крючке.');
info.Lines.Add('В процессе рыбалки используй один раз фишин-шот.');
if (weapon1=true) then begin
info.Lines.Add('Включи соул-шоты в автоматический режим.');
end;

//RequestItemList
buf:=hstr('0F');
SendToServerEx(Name);
end;

//************************************************** *************
//Вызывается при выключении скрипта
//************************************************** *************
procedure Free;
begin
timer.Free;
timer2.Free;
// msg.Free;
// stats.Free;
// info.Free;
// frm.Free;
end;

//************************************************** *************
procedure OnTimer2(Sender: TObject); //выводим в форму
begin
ShowInfo;
if (CurHP<but) then begin
if (HPuse1=true) then begin
UseItem(HPobjID);
end;
end;
end;

//************************************************** *************
procedure ShowInfo;
var
i: integer;
begin
//info.Lines.Clear;
stats.Lines.Clear;
stats.Lines.Add('Имя чара :'+Name);
stats.Lines.Add('Время старта :'+TimeToStr(starttime));
stats.Lines.Add('Время ловли :'+TimeToStr(time-starttime));
stats.Lines.Add('Поймали: '+IntToStr(fish1));
stats.Lines.Add('Сорвалось: '+IntToStr(fish2));
stats.Lines.Add('На нас напали: '+IntToStr(mob1)+' раз');
stats.Lines.Add('Погибли: '+IntToStr(death1)+' раз');
stats.Lines.Add('MaxHP: '+IntToStr(MaxHP));
stats.Lines.Add('CurHP: '+IntToStr(CurHP));
stats.Lines.Add('HPbutt :'+IntToStr(HPbutt)+' %хп');
stats.Lines.Add('but :'+IntToStr(but)+' ед.');
stats.Lines.Add('Кол-во Lure: '+IntToStr(ColvoLure)+' штук');
stats.Lines.Add('Кол-во Shots: '+IntToStr(ColvoShot)+' штук');
if (HPuse1=false) then stats.Lines.Add('Юзать бутылки?: НЕТ!') else stats.Lines.Add('Юзать бутылки?: ДА!');
if (weapon1=false) then stats.Lines.Add('Юзать оружие?: НЕТ!') else stats.Lines.Add('Юзать оружие?: ДА!');
if (shield1=false) then stats.Lines.Add('Юзать щит?: НЕТ!') else stats.Lines.Add('Юзать щит?: ДА!');
stats.Lines.Add('MyID: '+IntToStr(MyID));
stats.Lines.Add('MyXpos: '+IntToStr(MyXpos));
stats.Lines.Add('MyYpos: '+IntToStr(MyYpos));
stats.Lines.Add('MyZpos: '+IntToStr(MyZpos));
stats.Lines.Add('WeaponObjID: '+IntToStr(WeaponObjID));
stats.Lines.Add('ShieldObjID: '+IntToStr(ShieldObjID));
stats.Lines.Add('HPObjID: '+IntToStr(HPObjID));
stats.Lines.Add('RodObjID: '+IntToStr(RodObjID));
stats.Lines.Add('LureObjID: '+IntToStr(LureObjID));
end;

//************************************************** *************
procedure StatsUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do begin
case pck[i*8+10] of
#$09: CurHP:=ReadD(i*8+14);
#$0A: MaxHP:=ReadD(i*8+14);
end;
end;
if (MaxHP<>0) then // вычисляем процентное соотношение хп
begin
but:=Round((MaxHP/100)*HPbutt); // при каком количестве хп юзать бутылку лечения
end;
end;

//************************************************** *************
procedure UseItem(ObjID:integer);
begin
buf:=#$14;
WriteD(ObjID);
WriteD(00);
SendToServerEx(Name);
end;

//************************************************** *************
//2F=RequestMagicSkillUse:dMagicID)d(CtrlPressed)b(S hiftPressed)
procedure MagicSkillUse(MagicID:integer);
begin
buf:=#$2F;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;

//************************************************** *************
procedure Pumping;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot)
else msg.Lines.Add('Кончились шоты!'); //просто сообщаем, без шотов можно ловить
MagicSkillUse(pump);
end;

//************************************************** *************
procedure Reeling;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot)
else msg.Lines.Add('Кончились шоты!'); //просто сообщаем, без шотов можно ловить
MagicSkillUse(reel);
end;

//************************************************** *************
procedure Fishing;
begin
if ColvoLure<>0 then begin
RodInUse:=true;
MagicSkillUse(fish);
end
else begin
Status:=false;
info.Lines.Add('Кончились крючки!');
exit; //прекращаем рыбалку
end;
end;

//************************************************** *************
procedure OnTimer(Sender: TObject);
begin
Fishing;
timer.enabled:=false;
end;

//************************************************** *************
//04=Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ )b(ShiftFlag)
procedure Target(Attacker: Integer);
begin
buf:=#$04;
WriteD(Attacker);
WriteD(MyXpos);
WriteD(MyYpos);
WriteD(MyZpos);
WriteC(00);
SendToServerEx(Name);
end;

//************************************************** *************
//0A=Attack:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ )b(ShiftFlag)
procedure Attack(Attacker: Integer);
begin
buf:=#$0A;
WriteD(Attacker);
WriteD(MyXpos);
WriteD(MyYpos);
WriteD(MyZpos);
WriteC(00);
SendToServerEx(Name);
end;

//************************************************** *************
procedure TargetAttacker(Attacker: Integer);
begin
msg.Lines.Add('Attacker='+IntToStr(Attacker)+' Player='+IntToStr(MyID));
timer.enabled:=false;
Target(Attacker);
Attack(Attacker);
end;

//************************************************** *************
procedure GiveWeapon;
begin
if WeaponObjID=0 then exit;
msg.Lines.Add('Берём='+IntToStr(WeaponObjID));
delay(700);
UseItem(WeaponObjID);
end;

//************************************************** *************
procedure GiveShield;
begin
if ShieldObjID=0 then exit;
msg.Lines.Add('Берём='+IntToStr(ShieldObjID));
delay(700);
UseItem(ShieldObjID);
end;

//************************************************** *************
procedure GiveRod;
begin
if RodObjID=0 then exit;
msg.Lines.Add('Берём='+IntToStr(RodObjID));
delay(1000);
UseItem(RodObjID);
end;

//************************************************** *************
procedure GiveLure;
begin
if LureObjID=0 then exit;
msg.Lines.Add('Берём='+IntToStr(LureObjID));
delay(1000);
UseItem(LureObjID);
end;

//************************************************** *************
function rastoyanie(xpos1, ypos1, xpos2, ypos2:extended):integer; //возвращает переменную rezu которая является растоянием между 2 точками
begin
result:= Round(Sqrt(((xpos1-xpos2)*(xpos1-xpos2))+((ypos1-ypos2)*(ypos1-ypos2))));
end;

//************************************************** *************
// вызывается при приходе каждого пакета, если скрипт включен
//************************************************** *************
begin
//************************************************** **************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//************************************************** **************************
if (ConnectName=Name) and FromServer then begin
case pck[1] of
#$04: begin
//пакет с инфой о моём чаре
i:=2;
MyXpos:=ReadD(i); //получаю координату х моего чара
MyYpos:=ReadD(i); //получаю координату у моего чара
MyZpos:=ReadD(i); //получаю координату z моего чара
//Запоминаем ИД
i:=18;
MyID:=ReadD(i); //получаю ид моего чара
//смещение переменное, зависит от имени (LenName*2+2)
i:=i+(Length(Name)*2+2)+48; //44 для С4
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
//************************************************** **************************
//проверка на готовность скрипта
if (MyID<>0) and (ColvoLure<>0) and not status2 then begin
info.Lines.Add('Скрипт инициализирован!');
info.Lines.Add('Социальное действие YES - начать рыбалку!');
info.Lines.Add('Социальное действие NO - остановиться!');
status2:=true;
end;
end;
//************************************************** *************
//05=Attack:d(AttackerID)h(targetID)d(Damage)b(Flags )d(X)d(Y)d(Z)d(ListHits)h(targetID)d(damage)b(flag s)
#$05: begin
if (MyID=ReadD(6)) and (MyID<>ReadD(2)) then begin
timer.enabled:=false;
if not anderattack then begin
AttackerObjID:=ReadD(2);
msg.Lines.Add('На нас напали! ObjectID='+IntToStr(AttackerObjID));
giveweapon;
giveshield;
TargetAttacker(AttackerObjID);
anderattack:=true;
inc(mob1);
end;
end;
end;
//************************************************** *************
//пакет Die (моб умер)
//06=Die:h(CharID)d(d)d(HAsHideout)d(HasCastle)d(fla gs)d(sweepable)d(access)
#$06: begin
msg.Lines.Add('Пакет Die! ObjectID='+IntToStr(AttackerObjID));
if (AttackerObjID=ReadD(2)) then begin
msg.Lines.Add('Убили моба! ObjectID='+IntToStr(AttackerObjID));
anderattack:=false;
GiveRod;
GiveLure;
timer.enabled:=true;
end;
if (MyID=ReadD(2)) then begin
info.Lines.Add('Нас убили в '+TimeToStr(time));
inc(death1);
timer.enabled:=false;
//reviverequest; //оживаем после смерти
end;
end;
//************************************************** *************

//************************************************** *************
#$0E: begin
if (MyID=ReadD(2)) then StatsUpdate; //обновление информации о хп
end;
//************************************************** *************
//1B=ItemListPacket:w(window)w(ListCount)w(itemType1 )h(ObjectID)i(ItemID)d(count)w(itemType2)w(CustTyp e1)w(isEquipped)d(BodyPart)w(EnchantLevel)w(CustTy pe2)d(Augment)d(--)
//ItemList
#$1B: begin
msg.Lines.Add('ItemListPacket');
for i:=0 to ReadH(4)-1 do begin
ItemObjID:=ReadD(i*36+8);
ItemID:=ReadD(i*36+12);
Lvl:=ReadD(i*36+16); //количество
msg.Lines.Add('Предмет! ObjectID='+IntToStr(ItemObjID)+' ItemID='+IntToStr(ItemID)+' ColvoItem='+IntToStr(Lvl));
case ItemID of
7807..7809,6519..6527: begin
Lure:=ItemObjID;
ColvoLure:=Lvl;
end;
6535..6540: begin
Shot:=ItemObjID;
ColvoShot:=Lvl;
end;
end;
end;
end;
//************************************************** *************
//27=InventoryUpdate:w(count)w(1add2mod3remove)w(ite mType1)d(ObjectID)i(ItemId)d(Count)w(itemType2)w(c usType1)w(isEquipped)d(BodyPart)w(EnchantLevel)w(c usType2)-(8)
//необходимо уточнить ItemID для своего сервера!!!
//запоминаем ObjectID Lure и ColvoLure

//************************************************** *************
//ловим рыбу
#$FE: begin
if Status and (MyID<>0) then begin
case pck[2] of
//FE14=ExFishingEnd:w(subID)h(charObjtId)b(isWin)
#$14: begin
//FishingEnd
if ReadC(8) then inc(fish1) else inc(fish2);
if (MyID=ReadD(4)) then timer.enabled:=true; //FishingEnd ждем N секунд между ловлей рыбы
end;
#$16: begin
//FishinHPRegen
if (MyID=ReadD(4)) and (pck[15]+pck[16]=#$00#$00) then begin
delay(500);
pumping;
end;
if (MyID=ReadD(4)) and (pck[15]+pck[16]=#$00#$01) then begin
delay(500);
reeling;
end;
end;
end;
end;
end;
end;
end;

//************************************************** **************************
if (ConnectName=Name) and FromClient then begin
case pck[1] of
#$14: begin
//Оружие
if Weapon1 and not weapon2 then begin
WeaponObjID:=ReadD(2);
weapon2:=true;
end else begin
//щит
if Shield1 and not shield2 then begin
ShieldObjID:=ReadD(2);
shield2:=true;
end else begin
//бутылка лечения
if HPuse1 and not hpuse2 then begin
HPObjID:=ReadD(2);
HPuse2:=true;
end else begin
//крючек
if Rod1 and not rod2 then begin
RodObjID:=ReadD(2);
Rod2:=true;
end else begin
//УДОЧКА
if Lure1 and not lure2 then begin
LureObjID:=ReadD(2);
Lure2:=true;
end; end; end; end; end;
end;
#$1B: begin
case ReadD(2) of
//социальное действие Yes для начала ловли
6: begin
if not status2 then exit;
Status:=true;
timer.enabled:=true;
StartTime:=time;
info.Lines.Add('FishBot включен!!!');
end;
//социальное действие No для окончания
5: begin
if not status2 then exit;
if Status and RodInUse then Fishing;
Status:=false;
RodInUse:=false;
timer.enabled:=false;
info.Lines.Add('FishBot выключен!!!');
end;
end;
end;
//ValidatePosition пакет от клиента с моими кординатами
#$48: begin
//обновляем ВСЕ растояния в BD если мы сошли с места
MyXpos:=ReadD(2); //получаю координату х моего чара
MyYpos:=ReadD(6); //получаю координату у моего чара
MyZpos:=ReadD(10); //получаю координату z моего чара
end;
end;
end;
end.

NLObP
29.03.2009, 17:31
В общем есть такой скриптик под интерлюдию для рыбалки и мне он очень нравиться. Но есть проблемка , он не работает под грацию.

Скрипт для грации здесь (http://coderx.ru/showpost.php?p=20791&postcount=46).

Если именно указанный тобой скрипт нужен, то попробуй заменить ID пакетов из скрипта на ID пакетов для грации, должно работать. Значения ID пакетоd возьми из packetsT0.ini и packetsT1.ini

mirt
29.03.2009, 19:29
В том скрипте рыбалки, да в прочем как и в этом, не хочет считывается инвентарь. Т.е. в скрипте под грацию, там надо выбрать удочку оружие и т.п., но на самом деле все пусто. То же происходит и в этом скрипте. Судя по покетам которые приходят с сервера запрос идет правильный, т.к. там полностью показывается UserInfo.

NLObP
29.03.2009, 21:31
В скриптах проблема в том, что пакет ItemListPacket уже давно пришел и скрипт после включения его не видит. Любым доступным способом после включения скрипта вызови приход этого пакета: снять (одеть)оружие, бросить (поднять) предмет, купить предмет в магазине. В скрипте для грации посылается пакет 6E, чтобы получить необходимые пакеты, в скриптах для с4 и интерлюда 0F, в зависимости от сервера помагает/не помагает.

mirt
29.03.2009, 22:47
В общем намучавшись я так ни к чему и не пришел. Отправка пакета стоит 6E. Сервер Lineagez.
Мне чем подходит этот маленький скрипт, тем что там нету бегать по локации. На абисе он идеально раболтал под l2phx 3.2.0. Перепроверил id, вроде те же остались. А насчет выбрасывания шмота/поупки и т.п. не помогает. Да запустив скрипт под грацию раза так с 3 у меня появилась возможность выбирать удочку, при этом я проверил id все совпало. А вот все оружие, шоты, банки и т.д. вообще не мог выбрать. После этого ничего не получалось. Если Вам не сложно подправьте под интерлюд скрипт. Хотя у меня такое ощущение, что там все как надо.

З.Ы. Забыл сказать, что на интерлюде, при запуске скрипта, в окошке сразу прописывались все нужные id. Заранее благодарю.
З.Ы. Под граций в скрипте в окошке пишется S>Пакет InventoryUpdate #$21
ListCount=1. Как я понимаю скрипт ItemListPacket проходит.

NLObP
29.03.2009, 23:06
Если Вам не сложно подправьте под интерлюд скрипт. Хотя у меня такое ощущение, что там все как надо.

Нет ни времени, не желания. Попробуй для начала все *.ini файлы пакетхака заменить на такиеже, но с данными твоего клиента. Скрипт для грации работал на локальном сервере и на руофе более часа (до ввода ШК). После посылки пакета 6F должны приходить все необходимые пакеты об инвентаре и об окружающих НПЦ и после них скрипт полностью готов к работе. Может быть там какая-то особенная грация?

mirt
30.03.2009, 00:53
Я тут еще покапался малеха и нашел фичу в l2phx далеко не все есть ID в том числе и на крючки. При этом скрипт под грацию показывает что то похожее на работу при одном условии: его нужно запустить сразу после входа в игру, при этом нужно выбросить с инвентаря что нибудь. Можно начинать выбор. Единственное что мне удается найти так id удочки, и то он не показывает ее название. Если потом нажать старт он пишет что начинаем ловлю, но.. из-за того что нету крючков, а так же соулшотов, он просто тупо стоит. Если же его запустить после любого действия, то выбора уже совсем не будет.

Добавлено через 30 минут
Скачал более позднюю версию. Блин все равно не видет крючки(

NLObP
30.03.2009, 02:33
Попробуй для начала все *.ini файлы пакетхака заменить на такиеже, но с данными твоего клиента.

Ты сделал себе items.ini, npcid.ini? Ведь может быть просто не соответствие этих данных или их отсутствие.