Цитата:
Сообщение от DO12
Собсно здрасте!)
Я люблю рыбалку... (с) Не помню откуда
Так вот, использую скрипт на рыбалку в таком виде + к ниму скрипт на хилки
|
Посмотри в этой теме на 1 странице более свежий скрипт на рыбалку. В нем проверяется количество крючков и шотов. В остальном алгоритм тот же.
Цитата:
Рыба ловится не взирая на вылезающих мобов, всё казалось бы зашибись, кроме одного, достаточно часто вылезают 2 моба под ряд (Одного моба протягивает простая хилка), и всёб хорошо, грейтер хилка их протягивает, но я ЖАДНЫЙ и мне не хочется трарить денюжки заработаные не честным путём на то, чтоб заробатывать дальше) Вопрос заключается в следующем: Возможно ли сделать так, чтобы когда значение ХП было ниже максимума, рыба ловиься переставала, и снова начинала при полном восстановлении?
|
А это вариант для чаров, которые могут сами себя лечить:
Код:
//Автоматизация ловли рыбы by NLObP
//Возможность работы нескольких одновременных скриптов
//Добавлена проверка на кол-во крючков и шотов.
//Доработанная на предмет лечения самого себя
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656
//Необходимо затариться удочкой и крючками, шотами
//выучить соответствующие скиллы
//1 одеть и снять: удочку, крючек для определения ObjectID
//2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID
//3 делаем таргет на себя для лечения
//Социальное действие 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'; //исправить на имя чара
heal=1218; //Greater Battle Heal
fish=1312;
pump=1313;
reel=1314;
//******************************************************************************
var
timer: TTimer;
TimerHP: TTimer;
TimerMOB: TTimer;
status, status2, ScrInUse, UnderAttack: boolean;
Cmd, Lure, ColvoLure, Shot, ColvoShot, CharObjID: Integer;
CurMP, MaxMP, MaxHP, CurHP: integer;
//******************************************************************************
// Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
Shot:=0;
UnderAttack:=false;
Status:=false; //в процессе рыбалки или нет?
Status2:=false; //показывает, что скрипт готов к работе
ScrInUse:=false; //скрипт отключен
CharObjID:=0; //идентификатор ловца
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=false;
timer.interval:=10000; //время задержки (сделать достаточно большое, чтобы среагировать на атаку моба)
timerHP:=TTimer.Create(nil);
timerHP.OnTimer:=@OnTimerHP;
timerHP.enabled:=false;
timerHP.interval:=5000; //время между попытками лечиться
timerMOB:=TTimer.Create(nil);
timerMOB.OnTimer:=@OnTimerMOB;
timerMOB.enabled:=false;
timerMOB.interval:=60000; //ждем примерно минуту, пока моб нас колбасит
Say('1 одеть и снять: удочку, крючек!');
Say('2 в процессе рыбалки использовать один раз фишин-шот!');
Say('3 сделать таргет на себя для самолечения!');
end;
//******************************************************************************
// Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
timer.Free;
timerHP.Free;
timerMOB.Free;
end;
//******************************************************************************
Function ObjtoColvo(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 InitStats;
var
i: integer;
begin
//Запоминаем ИД
i:=18;
CharObjID:=ReadD(i);
//смещение переменное, зависит от имени (LenName*2+2)
i:=i+(Length(Name)*2+2)+44;
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
MaxMP:=ReadD(i);
CurMP:=ReadD(i);
if ScrInUse then begin
if not UnderAttack then begin
if (CurHP<MaxHP) then begin
timer.enabled:=false; //выключаем задержку между забросами
Status:=false;
TimerHP.enabled:=true;
TimerMOB.enabled:=true;
UnderAttack:=true;
end
else begin
if status=false then begin
TimerHP.enabled:=false;
timer.enabled:=true; //включаем задержку между забросами
end;
end;
end;
end;
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);
#$0B: CurMP:=ReadD(i*8+14);
#$0C: MaxMP:=ReadD(i*8+14);
end;
end;
if ScrInUse then begin
if not UnderAttack then begin
if (CurHP<MaxHP) then begin
timer.enabled:=false; //выключаем задержку между забросами
Status:=false;
TimerHP.enabled:=true;
TimerMOB.enabled:=true;
UnderAttack:=true;
end
else begin
if status=false then begin
TimerHP.enabled:=false;
timer.enabled:=true; //включаем задержку между забросами
end;
end;
end;
end;
end;
//******************************************************************************
procedure OnTimer(Sender: TObject);
begin
timer.enabled:=false; //выключаем задержку между забросами
status:=true;
Fishing;
end;
//******************************************************************************
procedure OnTimerMOB(Sender: TObject);
begin
UnderAttack:=false;
end;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
begin
// timerMOB.enabled:=true; //ждем примерно минуту, пока моб нас колбасит
//таргет на себя надо делать! Можно заранее на себя таргет сделать.
if (CurHP<MaxHP) then MagicSkillUse(heal); //каждые 10 сек лечимся, пока моб нас бъет в тесении 60 сек
end;
//******************************************************************************
procedure Fishing;
begin
if ColvoLure<>0 then MagicSkillUse(fish)
else begin
Status:=false;
ScrInUse:=false;
Say('Кончились крючки!');
end;
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 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;
//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
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
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); //количество крючков
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); //количество шотов
end;
//******************************************************************************
if (CharObjID<>0) and (ColvoLure<>0) and not status2 then
begin
Say('Автоматизация ловли рыбы готово к работе!');
status2:=true;
end;
//******************************************************************************
//ItemList
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then
begin
ColvoShot:=ObjtoColvo(Shot); //количество шотов
ColvoLure:=ObjtoColvo(Lure); //количество крючков
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 begin
timer.enabled:=true; //ждем N секунд межде рыбалками
end;
//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;
//******************************************************************************
//UserInfo
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then InitStats;
//******************************************************************************
//StatusUpdate
if FromServer and (ConnectName=Name) and (pck[1]=#$0E) and (CharObjID=ReadD(2)) then StatsUpdate;
//****************************************************************************
if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
Cmd:=ReadD(2);
case cmd of
//социальное действие Yes для начала ловли
6: begin
if CharObjID=0 then exit;
ScrInUse:=true;
Status:=true;
Fishing;
end;
//социальное действие No для окончания
5: begin
if CharObjID=0 then exit;
if Status then Fishing;
ScrInUse:=false;
Status:=false;
timer.enabled:=false;
end;
end;
end;
end.
ЗЫЖ
Проблемный момент прервать рыбную ловлю, когда тебя атакуют. :( Поэтому в этом скрипте предполагаем, что моб атакует в промежутке между рыбалками. Время между забросами нужно делать достаточным, чтобы заметить атаку моба. Выжидаем минуту с попытками самолечения и ловим снова. На 100% отладить не могу, в реале я ловлю гномом. Замечания, поправки приветствуются.