Рыцарь
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
|
Re: ДА БУДЕТ БОТ!
Вот три моих скрипта на рыбалку. Реально работающих. Первые два относятся к прцессу рыбалки, а третий как вспомогательный. Почему в отдельных скриптах? Чтобы можно было тиражировать на сколько угодно чаров простым копированием и переименованием скриптов. Придумывал сам и использовал готовые скрипты. Спасибо всем.
1)fishin.txt
Код:
//Автоматизация ловли рыбы by NLObP
//Возможность работы нескольких одновременных скриптов
//Добавлена проверка на кол-во крючков и шотов.
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656
//Необходимо затариться удочкой и крючками, шотами
//выучить соответствующие скиллы
//1 одеть и снять: удочку, крючек для определения ObjectID
//2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID
//3 в процессе боя использовать Healing Potion для определения ObjectID
//Социальное действие YES или 1 в чат - начать
//Социальное действие NO или 2 в чат - остановиться
//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='2F 20 05 00 00 00 00 00 00 00';
pump='2F 21 05 00 00 00 00 00 00 00';
reel='2F 22 05 00 00 00 00 00 00 00';
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 одеть и снять: удочку, крючек!');
Say('2 в процессе рыбалки использовать один раз фишин-шот!');
end;
//******************************************************************************
// Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
timer.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 Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//******************************************************************************
procedure UseItem(ObjID:integer);
begin
buf:=#$14;
WriteD(ObjID);
WriteD(00);
SendToServerEx(Name);
end;
//******************************************************************************
procedure Pumping;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
//else Say('Кончились шоты!');
buf:=HStr(pump);
SendToServerEx(Name);
end;
//******************************************************************************
procedure Reeling;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
//else Say('Кончились шоты!');
buf:=HStr(reel);
SendToServerEx(Name);
end;
//******************************************************************************
procedure Fishing;
begin
if ColvoLure<>0 then begin
RodInUse:=true;
buf:=HStr(fish);
SendToServerEx(Name);
end
else begin
Status:=false;
Say('Кончились крючки!');
exit; //прекращаем рыбалку
end;
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
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
ColvoShot:=ObjtoColvo(Shot); //количество шотов
//Say('Shot='+inttostr(ColvoShot));
ColvoLure:=ObjtoColvo(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;
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.
2)fish_open.txt
Код:
//Автоматизация потрошения рыбы by NLObP
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656
//Как только поймаете рыбку, она потрошиться.
{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'; //имя чара
//*******************************************************************
var
ItemObjID, time1: integer;
status: boolean;
//*******************************************************************
procedure Init; //Вызывается при включении скрипта
begin
time1:=0;
status:=false;
end;
//*******************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
end;
//*******************************************************************
function Wait(var tick:integer; Timewait: Integer): Boolean;
// сквозная проверка без остановки скрипта (c)dmitry501
// modifed by Sh00rGo
var
t: integer;
begin
result:=false;
t:=Round(Time*86400);
if t>(tick+Timewait/1000) then begin
if tick>0 then result:=true;
tick:=t;
end;
end;
//*******************************************************************
procedure UseItem(ObjectID:integer);
begin
buf:=#$14;
WriteD(ObjectID);
WriteD(0);
SendToServerEx(Name);
end;
//*******************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//*******************************************************************
begin
//*******************************************************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//*******************************************************************
//потрошим рыбу
//необходимо уточнить ItemID рыб для своего сервера!!!
if FromServer and (pck[1]+pck[2]=#$27#$01) and (ConnectName=Name) and ((ReadD(12)>=6411) and (ReadD(12)<=6518)) then
begin
ItemObjID:=ReadD(8);
status:=true;
end;
//*******************************************************************
if Wait(time1,2000) and status then begin
UseItem(ItemObjID);
status:=false;
end;
end.
3)use_hp.txt
Код:
//автоматическое использование НР пробирок by NLObP
// 1-Изменяем Name='NLObP';
// 2-бросаем, подбираем или выпиваем Heal Potion
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656
const
Name='NLObP';
var
ColvoHP, CharObjID, ItemObjID: integer;
MaxHP, CurHP: integer;
TimerHP: TTimer;
Status: boolean;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
begin
if ColvoHP=0 then exit;
buf:=#$14;
WriteD(ItemObjID);
WriteD(00);
SendToServerEx(Name);
ColvoHP:=ColvoHP-1; //количество хилок
if ColvoHP=0 then begin
Say('Хилок='+inttostr(ColvoHP));
Say('Кончились хилки! Закупите Heal Potion!');
end;
end;
//******************************************************************************
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
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);
//Say('MaxHP='+inttostr(MaxHP)+'CurHP='+inttostr(CurHP));
if ItemObjID=0 then exit;
if (CurHP<MaxHP-50) then TimerHP.enabled:=true else TimerHP.enabled:=false;
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 ItemObjID=0 then exit;
if (CurHP<=MaxHP-50) then TimerHP.enabled:=true else TimerHP.enabled:=false;
end;
//******************************************************************************
procedure ObjtoColvo(ItemObjID: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 ColvoHP:=ReadD(i*28+16); //количество хилок
end;
end;
//******************************************************************************
// Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
status:=false;
CharObjID:=0;
ItemObjID:=0;
timerHP:=TTimer.Create(nil);
timerHP.OnTimer:=@OnTimerHP;
timerHP.enabled:=false;
timerHP.interval:=5000; //время отката лечения
Say('Для начала работы скрипта бросаем, подбираем или выпиваем Heal Potion!');
end;
//******************************************************************************
// Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
timerHP.Free;
end;
//******************************************************************************
// Вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//******************************************************************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//******************************************************************************
//InventoryUpdate
if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)=1060) or (ReadD(12)=1061)) then begin //Healing Potion, Lesser Healing Potion
ItemObjID:=ReadD(8);
ColvoHP:=ReadD(16); //количество хилок
if status then exit;
Say('Автоматическое использование Нeal Рotion готово к работе!');
Say('Хилок='+inttostr(ColvoHP));
status:=true;
end;
//******************************************************************************
//ItemList
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
ObjtoColvo(ItemObjID); //количество хилок
//Say('Хилок='+inttostr(ColvoHP));
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;
end.
Кач магического дракона.
training_dragon.txt
Код:
//Автоматический кач 'Hatchling of the Stars' by NLObP
// Для работы скрипта:
// 1 - Саммоним дракона
// 2 - кладем ему еду, броню, когти
// На автомате, при нападении хозяина на моба дракон автоматически ассистит
// при необходимости лечит себя, после боя следует за хозяином.
//******************************************************************************
// константы и переменные скрипта
//******************************************************************************
const
Owner='NLObP'; //ник перса хозяина
Pet='';
var
OwnerID, PetID, TargetID : Integer; //ИД хозяина, пета, ИД таргета
CoordX, CoordY, CoordZ : String; //координаты пета
Cmd :String; //команда пету
CurHP, MaxHP, i : Integer;
tick: Integer;
timerA: TTimer;
timerHP: TTimer;
//******************************************************************************
// Подпрограммы
//******************************************************************************
//все сообщения ботов в приватном чате патилидера
//видны только нам
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(ConnectName);
WriteS(msg);
SendToClientEx(Owner);
end;
//******************************************************************************
procedure OnTimerA(Sender: TObject);
begin
//пакет RequestActionUse;
buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
SendToServerEX(Owner);
//Say('магическая атака пета');
end;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
begin
buf:=hstr('45 EE 03 00 00 00 00 00 00 00'); //пет лечиться
SendToServerEX(Owner);
end;
//******************************************************************************
// Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
OwnerID:=0;
PetID:=0;
timerA:=TTimer.Create(nil);
timerA.OnTimer:=@OnTimerA; //
timerA.enabled:=false; //
timerA.interval:=1000; //время отката магии пета
timerHP:=TTimer.Create(nil);
timerHP.OnTimer:=@OnTimerHP; //
timerHP.enabled:=false; //
timerHP.interval:=2000; //время отката лечения пета
end;
//******************************************************************************
// Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
timerA.Free;
timerHP.Free;
end;
//******************************************************************************
// Вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//не обрабатываем пустые пакеты
if pck='' then exit;
//******************************************************************************
//если от сервака принят пакет с UserInfo
if FromServer and (OwnerID=0) and (ConnectName=Owner) and (pck[1]=#$04) then begin
//Запоминаем собственный ИД
OwnerID:=ReadD(18);
Say('Скрипт готов к работе!');
end;
//******************************************************************************
//пакет Attack
//атаковать, если хозяин напал на цель
if FromServer and (ConnectName=Owner) and (pck[1]=#$05) and (OwnerID=ReadD(2)) then begin
if (TargetID<>0) and (OwnerID<>TargetID) then begin
buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
SendToServerEX(Owner);
TimerA.enabled:=true;
//Say('Включили таймер');
end;
end;
//******************************************************************************
//пакет MagicSkillUse
//атаковать, если хозяин напал на цель магией
if FromServer and (ConnectName=Owner) and (pck[1]=#$48) and (OwnerID=ReadD(2)) then begin
if (TargetID<>0) and (OwnerID<>TargetID) then begin
buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
SendToServerEX(Owner);
//Say('Атакую цель!');
TimerA.enabled:=true;
//Say('Включили таймер');
end;
end;
//******************************************************************************
//пакет TargetSelect
//если принят пакет со сменой таргета
if FromServer and (ConnectName=Owner) and (pck[1]=#$a6) then begin
//запоминаем ИД таргета для ассиста
TargetID:=ReadD(2);
//Say('Это ИД таргета.');
end;
//******************************************************************************
//пакет TargetUnselected
//командир отменил цель
if FromServer and (ConnectName=Owner) and (pck[1]=#$2a) and (OwnerID=ReadD(2)) then begin
TargetID:=0;
buf:=hstr('45 11 00 00 00 00 00 00 00 00'); //stop current action
SendToServerEX(Owner);
//Say('Стоп!');
TimerA.enabled:=false;
//Say('Выключили таймер');
end;
//******************************************************************************
//если от сервака принят пакет с PetInfo
if FromServer and (PetID=0) and (ConnectName=Owner) and (pck[1]=#$b1) then begin
//Запоминаем ИД пета
PetID:=ReadD(6);
//смещение переменное, зависит от имени Пета(LenName*2+2) и имени Чара(LenName*2+2)
//126 байт до имени Пета(LenName*2+2) и имени Чара(LenName*2+2) после 20 байт (+1 начало CurHP)
i:=126+(Length(Pet)*2+2)+(Length(Owner)*2+2)+20+1;
CurHP:=ReadD(i);
MaxHP:=ReadD(i);
if (CurHP<MaxHP)
then TimerHP.enabled:=true
else TimerHP.enabled:=false;
//Say('Запомнил ИД и жизнь пета');
end;
//******************************************************************************
//пакет PetStatusUpdate
//проверяем на жизнь пета
if FromServer and (ConnectName=Owner) and (pck[1]=#$b5) and (PetID=ReadD(6)) then begin
//смещение переменное, зависит от имени Пета(LenName*2+2)
//21 байт до имени Пета(LenName*2+2) после 8 байт (+1 начало CurHP)
i:=21+(Length(Pet)*2+2)+8+1;
CurHP:=ReadD(i);
MaxHP:=ReadD(i);
//Say('Считываем параметры пета');
if (CurHP<MaxHP)
then TimerHP.enabled:=true
else TimerHP.enabled:=false;
end;
end.
Автоматизация заточки предметов.
zatochka.txt
Код:
//Автоматизация заточки предметов до необходимого уровня by NLObP
//Затачиваем поочереди все предметы с Weapon ID пока не переломаем или не заточим
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS"
//Необходимо затариться оружием, заточками и валерьянкой
//Открываем инвентарь для инициализации скрипта
//Социальное действие 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';
Scroll=957; // 957 - ItemID Crystall Scroll Enchant Weapon (Grade D)
Weapon=129; // 129 - ItemID Sword of Revolution D-grade
MaxEnchLvl=20; //max уровень заточки
max=250; //max количество предметов в базе
var
// WpnObjID: array[1..maxwpn,1..maxwpn] of integer; //Weapon ObjID
WpnBase: array[1..2,1..max] of integer; //Weapon ObjID,lvl
ScrlBase: array[1..max] of integer; //Scroll ObjID
add: boolean; //прошла заточка?
timer: TTimer;
CurEnchLvl, ColvoWpn, ColvoScrl, CurWpn, CurScrl: integer;
//******************************************************************************
procedure Init; //Вызывается при включении скрипта
var
i:integer;
begin
//Enchant:=false;
CurEnchLvl:=0;
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimerHP;
timer.enabled:=false;
timer.interval:=2500; //время задержки
Say('Для инициализации скрипта, откройте инвентарь');
end;
//******************************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
WpnBase:=nil;
ScrlBase:=nil;
timer.Free;
end;
//******************************************************************************
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//******************************************************************************
procedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemID
var
i, ss, ww, j, ObjID, ItemID, lvl, ListCount: integer;
begin
ss:=1; //индекс в массиве скроллов
ww:=1; //индекс в массиве предметов
j:=4; //смещение для ListCount
ListCount:=ReadH(j); //количество итемов не должно превышать max!
if ListCount>max then ListCount:=max;
j:=8; //смещение для ObjectID
//Пробегаем по Инвентарю и сохраняем ObjectID соответствующие необходимым ItemID
for i:=1 to ListCount do begin
ObjID:=ReadD(j); //ObjectID
ItemID:=ReadD(j); //ItemID
j:=j+14;
Lvl:=ReadD(j); //Level
case ItemID of
scroll: begin
ScrlBase[ss]:=ObjID;
ss:=ss+1;
//Say('ColvoScrl='+IntToStr(ss));
end;
weapon: begin
WpnBase[1,ww]:=ObjID;
WpnBase[2,ww]:=lvl;
ww:=ww+1;
//Say('ColvoWpn='+IntToStr(ww));
end;
end;
j:=j+2; //для С4
// j:=j+10; //для Интерлюдии
end;
ColvoWpn:=ww-1;
ColvoScrl:=ss-1;
Say('>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//******************************************************************************
procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID
var
i, ii, j, ss, ww, ObjID, ItemID, Lvl, ListCount, UpdType: integer;
begin
ListCount:=ReadH(2); //количество итемов
//Пробегаем по Инвентарю и сохраняем пары ObjectID - Lvl
j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
// Say('Апдейт базы!');
for i:=1 to ListCount do begin
UpdType:=ReadH(j);
j:=j+2;
ObjID:=ReadD(j);
ItemID:=ReadD(j);
j:=j+14;
Lvl:=ReadH(j);
// Say('Предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ItemID));
case UpdType of
1:case ItemID of
weapon: begin
ColvoWpn:=ColvoWpn+1;
//Say('Добавили предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
for ii:=1 to max do
if WpnBase[1,ii]=0 then begin WpnBase[1,ii]:=ObjID; WpnBase[2,ii]:=lvl; end;
end;
scroll: begin
ss:=ss+1;
//Say('Добавили скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));
for ii:=1 to max do
if ScrlBase[ii]=0 then ScrlBase[ii]:=ObjID;
end;
end;
2:case ItemID of
weapon:
for ii:=1 to max do
if WpnBase[1,ii]=ObjID then WpnBase[2,ii]:=lvl;
scroll:
//Say('Внимание! Изменения в скролле!?');
end;
//удален
3:case ItemID of
weapon: begin
ColvoWpn:=ColvoWpn-1;
for ii:=1 to max do
if WpnBase[1,ii]=ObjID then begin WpnBase[1,ii]:=0; WpnBase[2,ii]:=0; end;
//Say('Удаляем предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
end;
scroll: begin
ColvoScrl:=ColvoScrl-1;
for ii:=1 to max do
if ScrlBase[ii]=ObjID then ScrlBase[ii]:=0;
//Say('Удаляем скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));
end;
end;
end;
j:=j+2; //для С4
// j:=j+10; //для Интерлюдии
end;
Say('>>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//******************************************************************************
function GetNextWeapon: integer; //Выдает ObjID предмета, если не найден в базе, выдает -1,
//достигли макс уровня заточки -2, подбираем мин текущий уровень заточки -3
var
i: integer;
begin
Result:=-1;
if CurEnchLvl>=MaxEnchLvl then begin
Result:=-2;
exit;
end;
for i:=1 to max do begin
//находим первый подходящий предмет
if (WpnBase[1,i]<>0) and (WpnBase[2,i]=CurEnchLvl) then begin
Result:=WpnBase[1,i];
exit;
end;
end;
CurEnchLvl:=CurEnchLvl+1;
Result:=-3;
end;
//******************************************************************************
function GetNextScroll: integer; //Выдает ObjID скролла, если не найден в базе, выдает -1
var
i: integer;
begin
Result:=-1;
for i:=1 to max do begin
//находим первый подходящий предмет
if (ScrlBase[i]<>0) then begin
Result:=ScrlBase[i];
exit;
end;
end;
end;
//******************************************************************************
procedure UseItem(ObjectID: integer);
begin
buf:=#$14;
WriteD(ObjectID);
WriteD(0);
SendToServerEx(Name);
end;
//******************************************************************************
procedure RequesEnchantItem(ObjectID: integer);
begin
buf:=#$58;
WriteD(ObjectID);
SendToServerEx(Name);
end;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
var
wpn, scrl:integer;
begin
if ColvoScrl=0 then begin
Say('Кончились скроллы! Прервано!');
timer.enabled:=false;
exit;
end;
if ColvoWpn=1 then begin
Say('Остался последний предмет! Прервано!');
timer.enabled:=false;
exit;
end;
Scrl:=GetNextScroll;
if scrl=-1 then begin
Say('Нет такой заточки! Прервано!');
timer.enabled:=false;
exit;
end;
Wpn:=GetNextWeapon;
case wpn of
-1: begin
Say('Нет такого предмета! Прервано!');
timer.enabled:=false;
exit;
end;
-2: begin
Say('Достигли максимальный уровень заточки! Прервано!');
timer.enabled:=false;
exit;
end;
-3: begin
//Say('Подбираем текущий уровень заточки!');
timer.enabled:=true;
exit;
end;
end;
//************************************************
UseItem(Scrl);
RequesEnchantItem(Wpn);
//************************************************
Say('Заточили предмет! Weapon='+IntToStr(Wpn));
end;
//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//****************************************************************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//****************************************************************************
//социальное действие yes для начало точки
if FromClient and (ConnectName=Name) and (pck=HStr('1B 06 00 00 00')) then begin
CurEnchLvl:=0;
Say('Команда Старт!!!');
timer.enabled:=true;
end;
//****************************************************************************
//социальное действие no для начало точки
if FromClient and (ConnectName=Name) and (pck=HStr('1B 05 00 00 00')) then begin
Say('Команда Стоп!!!');
timer.enabled:=false;
end;
//****************************************************************************
//ItemList
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) then CreateItemBase; //создание базы предметов
// if (ColvoWpn=0) or (ColvoScrl=0) then exit; //если нет базы итемов, скрипт дальше не пустит
//****************************************************************************
//если удалились предметы, стираем в базе предметов пары ObjectID - ItemID
if FromServer and (ConnectName=Name) and (pck[1]=#$27) then UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета
end.
|