klizmabeqa1992
-
Posts
19 -
Credits
0 -
Joined
-
Last visited
-
Feedback
0%
Content Type
Articles
Profiles
Forums
Store
Posts posted by klizmabeqa1992
-
-
delpi cod :
{ Юля Сегодня, 11:46
Помню этот небольшой скриптик принес мне просто бешеное богатсво на сервере
где я играла, но поскольку я больше не играю, то выкладываю в массы суть
проста, программа ведет учет всех персов в округе, когда по вашему
персу-торговцу кликают, она пишет в френдчат ему предложение купить стрелу
и обешание за это рассказать анекдотик. за покупку программа конечно же как
и обешала рассказывает анекдотик. как показывает практика, самая идеальная
цена чтобы клиенты купили как можно больше ваших стрел, для х1 - это не
более 3к, для х5 - 10к. а для привлечения внимания именно к вашему
торговцу, в титуле (для этого вам надо быть в клане) постоянно мигает
рожица и надпись "АНЕКДОТЫ". Все анекдоты грузяться с папки c:\l2jokes (в
аттаче уже готовый архив с 237 анекдотами), каждый анекдот в отдельном
файле, не более 255 символов. Пользуйтесь на здоровье
}
// copyright © 2006, 2007 Puella
var curpos: byte;
TITLE_DATA2: array [0..16] of string;
const
jokes_max = 237;
var
f: TStringList;
jokes: array [1..jokes_max] of string;
jokes_real: integer;
IDs: array [1..2000] of cardinal;
Names: array [1..2000] of String;
count: Integer;
MyID: Cardinal;
MyName: String;
m: TMemo;
t: TTimer;
InTimer: Boolean;
procedure OnTimerProc;
begin
InTimer := true;
buf := #$55;
WriteS(MyName);
WriteS(TITLE_DATA2[curpos]);
SendToServer;
curpos := curpos + 1;
if curpos > 16 then curpos := 0;
InTimer := false;
end;
procedure Init;
var i: byte;
begin
randomize;
count := 0;
f := TStringList.Create;
jokes_real := 0;
for i := 1 to jokes_max do
begin
try
f.LoadFromFile('C:\l2jokes\' + IntToStr(i) + '.txt');
jokes_real := jokes_real + 1;
except
end;
jokes[jokes_real] := f.Text;
end;
f.free;
TITLE_DATA2[0] := '@(o_O)@';
TITLE_DATA2[1] := '@(O_o)@';
TITLE_DATA2[2] := '@(o_O)@';
TITLE_DATA2[3] := '@(O_o)@';
TITLE_DATA2[4] := '';
TITLE_DATA2[5] := 'ANEKDOTI';
TITLE_DATA2[6] := '';
TITLE_DATA2[7] := 'ANEKDOTI';
TITLE_DATA2[8] := '';
TITLE_DATA2[9] := 'ANEKDOTI';
TITLE_DATA2[10] := '';
TITLE_DATA2[11] := '@(o_O)@';
TITLE_DATA2[12] := '@(O_o)@';
TITLE_DATA2[13] := '@(o_O)@';
TITLE_DATA2[14] := '@(O_o)@';
TITLE_DATA2[15] := '@(o_O)@';
TITLE_DATA2[16] := '@(O_o)@';
curpos := 0;
t := TTimer.Create(nil);
t.Enabled := false;
t.Interval := 2000;
t.OnTimer := @OnTimerProc;
ShowTab;
m:=TMemo.Create(UserTab);
m.parent:=UserTab;
m.align:=alClient;
m.ReadOnly:=true;
m.ScrollBars:=ssBoth;
m.lines.add('Анекдотов загружено: ' + inttostr(jokes_real));
end;
procedure Free;
begin
m.Free;
HideTab;
t.OnTimer := nil;
t.Enabled := false;
t.Interval := 0;
t.Free;
end;
function FindPlayer(ObjID: cardinal): integer;
var k: cardinal;
begin
result := -1;
if Count > 0 then
for k := 1 to Count do
if IDs[k] = ObjID then
begin
result := k;
break
end;
end;
var
i, k: integer;
objid: cardinal;
name: string;
begin
if FromServer then
case pck[1] of
#$64:
begin
i := 2;
if ReadD(i) = 380 then {S1_PURCHASED_S3_S2_s}
begin
i := i + 4*2;
name := ReadS(i);
if (name = '') then
begin
// внесем в лог (blacklist)
m.Lines.Add(TimeToStr(now)+': '+name+' purchased (BLACKLISTED)');
end
else
begin
while (InTimer = true) do i := i;
buf := #$CC;
i := int(random * jokes_real) + 1;
WriteS(jokes);
WriteS(name);
SendToServer;
if (Length(m.Lines.Text) > 60000) then m.Lines.Text := '<cleared>';
// внесем в лог
m.Lines.Add(TimeToStr(now)+': '+name+' purchased');
m.Lines.Add('> ' + jokes);
end;
end
end;
#$03: // CharInfo
begin
i := 4 + 4 * 4 - 2;
objid := ReadD(i);
i := FindPlayer(ObjID);
if i = -1 then
begin
i := 4 + 4 * 5 - 2;
name := ReadS(i);
// blacklist
if (name = '') then
begin
// (none)
end
else begin
// добавление
count := count + 1;
IDs[count] := ObjID;
Names[count] := name;
//m.Lines.Add(IntToStr(count) + ' - ' + Format('%x', [ObjId])+' = '+ Names[count]);
end;
end;
end;
#$04: //UserInfo
begin
i := 2 + 4*4;
MyID := ReadD(i);
MyName := ReadS(i);
t.Enabled := true;
end;
#$12: // ObjectDelete
begin
i := 2;
objid := ReadD(i);
i := FindPlayer(objid);
if i <> -1 then
begin
IDs := IDs[count];
Names := Names[count];
count := count - 1;
end
end;
#$29: //TargetSeleted
begin
i := 2;
objid := ReadD(i);
if ReadD(i) <> MyID then exit;
i := FindPlayer(objid);
if i <> -1 then
begin
while (InTimer = true) do i := i;
buf := #$CC;
WriteS('Привет, '+names+'! Я бот! Купи у меня стрел и я, в благодарность за это, расскажу тебе анекдот или стишок на тему LineAge2! ;)');
WriteS(names);
SendToServer;
// внесем в лог
m.Lines.Add(TimeToStr(now)+': '+names);
end
end;
end;
end.
-
Скрипт собирать Рекомендации.для ХБ
в башку стукнуло наверно над в туалет
СУТЬ переделать скрипты расказывающие анекдоты
на собирание РЕКов.
В титул пишу За РЕК скажу Анекдот
чел рекает и ему в пм анекдот.норм наверн будит
я туп могу ток поменять в скрипте чтото как писать незнаю неумею необучен
анекдоты два скрипта как основа для примера
kod:
//by VORON
//скрипт который рассказывает анекдоты без бана:
///////////////////////////////////////////////////////////////////////////
var
temp: array [1..20] of string;
timer1: TTimer;
x: integer;
procedure Init; //Вызывается при включении скрипта
begin
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer; //
timer1.enabled:=true; //
timer1.interval:=1000;
temp[1]:='" Водка в стиле IT: ';
temp[2]:='0.1л - demo ';
temp[3]:='0.25л - trial version ';
temp[4]:='0.5л - personal edition ';
temp[5]:='0.7л - professional edition ';
temp[6]:='1.0л - network edition ';
temp[7]:='1.75л - enterprise ';
temp[8]:='3л - for small business ';
temp[9]:='5л - corporate edition ';
temp[10]:='Бутыль самогона - home edition ';
temp[11]:='"На посошок" - Service pack ';
temp[12]:='Рассол с утра - Recovery tool ';
temp[13]:='Закуска - plugins ';
temp[14]:='Пиво - patch ';
temp[15]:='Coca-cola, Fanta, 7 UP - trojan viruses';
temp[16]:='';
x:=1;
end;
procedure OnTimer(Sender: TObject);
begin
///
if temp[x] <> '' then
begin
buf:=hstr('38');
writes(temp[x]);
buf:=buf + hstr('01 00 00 00'); ///9- али // 3-пати // 01 - общий
sendtoserverex('ник');
end;
x:=x+1;
if x>= 19 then x:=19; //ЭТА СТРОКА ДЛЯ ТОГО ЧТОБ XELAT заценил глубину мысли! незнаю я синтаксиса-) и учиться лень-) там какойто АНТИЛ надо применять-) а зачем? и так все пашет.
end;
procedure Free; //Вызывается при выключении скрипта
begin
timer1.Free;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
end.
-
я сам недавно нашел этот сайт и стал
пользоваться l2phxписать необучен скрипты
собрал это как в конструкторе из деталей
АВТО ТРЕЙД
delphi Код:
//АВТО ТРЕЙД
//скрипт вкл у чара кому передаете вещи
// кинь трейд. чар автоматом подтвердит
//положи вещь в трейд и нажми ОК и все
// ХБ
procedure Init; //Вызывается при включении скрипта
begin
end;
procedure Free; //Вызывается при выключении скрипта
begin
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if FromServer and (pck[1]=#$70) then begin//вам кинули трейд
buf:=#$55;
WriteD(1); // принять ТРЕЙД
SendToServer;
pck:='';
exit;
end;
begin
if FromServer and (pck[1]=#$62) and (pck[2]=#$79)then begin//вам потвердили обмен
buf:=#$1C;
WriteD(1); // подтвердить обмен
SendToServer;
end;
end;
end.
-
Нашел скриптик на харде, кидает в вх две стопки, вдруг кому пригодится еще
PHP код:
var
beg,id, id2,amount:string;
SocialID, Status: Integer;
procedure SendMsg(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClient;
end;
begin
if FromClient and (pck[1]=#$1B) then
begin
SocialID:=ReadD(2);
case ord(pck[2]) of
$06:begin
Status:=1;
SendMsg('ITS ON');
end;
$05:begin
Status:=0;
SendMsg('ITS OFF');
end;
end;
end;
if Status=1 then
begin
if FromClient and (pck[01]=#$31) then
begin
beg:=pck[01] + hstr('02') +pck[03]+pck[04]+pck[05];
id:=pck[06]+pck[07]+pck[08]+pck[09];
amount:=pck[10]+pck[11]+pck[12]+pck[13];
pck:='';
buf:=beg + id + amount + id + hstr('01000000');
SendToServer;
end;
if FromServer and (pck[01]=#$42) then
begin
beg:=hstr('3203000000');
id:=pck[38]+pck[39]+pck[40]+pck[41];
amount:=pck[20]+pck[21]+pck[22]+pck[23];
id2:=pck[78]+pck[79]+pck[80]+pck[81];
buf:=beg + id + amount + id2 + hstr('01000000')+ id2 + hstr('01000000');
SendToServer;
end;
end;
end.
-
Добрый день. У меня такая проблема, я хотел написать такой скрипт c такими задачами: cтоят 2 npc рядом, 1-ый Gatekeper (gk) и 2-ой Game-shop (gs). Так вот при помощи скрипта мой чар должен сначала 1 раз купить кристалы у (gs), потом обменять их на свитки у (gk) 16 раз(столько влазит до перевеса) то есть ему нада сначала сделать таргет на (gk) потом еще раз чтоб открыть диалог, потом выбрать обмен и только потом отправить пакет на обмен. После нада о5 же такую манипуляцю c таргетом и диалогом на (gs) и продать их всех. После о5 к (gk) (так как кристаллы еще остались) меняем 16 раз на свитки и о5 в (gs) продаем.Ну вот тут можно закончить чтоб проще было, дальше я сам смогу разобраться и доделать. Ну а в идеале он должен о5 1 раз купить кристаллы у (gs) и ити менять и продавать и так по кругу до бесконечности. Впринципе вот такой вот скрипт его можно сделать доработав вот етот скрипт на покупку только поправте пожалуйста и покажите куда мне пакеты вставлять на (таргет, выбор, покупку, обмен, продажу,) Буду очень признателен! Думаю такой скрипт многим пригодиться так как его легко сможет каждый редактировать под свои задачи.
delphi Код:
const
Name='nick';
var
timer:TTimer;
procedure Init;
begin
timer:=TTimer.Create(nil);
timer.interval:=50;
timer.OnTimer:=@fireTimer;
timer.enabled:=true;
end;
procedure Free;
begin
timer.Free;
end;
procedure fireTimer(Sender: TObject);
begin
buf:=hstr('покупка');
SendToServer;
end;
begin
if FromServer and (ConnectName=Name) and (pck = HStr('нет денег')) then begin
timer.enabled:=false;
end;
end.
-
program autotarget;
// Автоматическое взятие в таргет атакующего вас игрока или моба
// Чтобы включить скрипт используйте в игре социальное действие - Yes
// Чтобы выключить скрипт используйте в игре социальное действие - No
// Автор: Furious
// Версия: 0.4
// Для Грации by NLObP 09.08.2009г.
const
Name='NLObP'; //имя чара, с соблюдением регистра букв
var
Attacker, MyOID, ObjectID, MyX, MyY, MyZ, i: Integer;
Status: boolean;
procedure Init; //Вызывается при включении скрипта
begin
status:=false;
end;
procedure TargetAttacker(Attacker: Integer);
begin
//c1F=Action:d(ObjectID)d(OriginX)d(OriginY)d(OriginZ)c(ActionID)
buf:=#$1F;
WriteD(Attacker);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(00);
SendToServerEx(Name);
end;
//******************************************************************************
//основная часть скрипта, вызывается при приходе каждого пакета, если скрипт включен
begin
//не обрабатываем пустые пакеты
if pck='' then exit;
if (ConnectName=Name) and FromServer then
begin
case pck[1] of
//32=UserInfo:d(X)d(Y)d(Z)d(isInAirShip)d(ObjectID)...
#$32: begin
i:=2;
MyX:=ReadD(i);
MyY:=ReadD(i);
MyZ:=ReadD(i);
ReadD(i); //пропускаем isInAirShip
MyOID:=ReadD(i);
end;
//33=Attack:d(AttackerID)d(TargetID)...
//48=MagicSkillUse:d(CharID)d(TargetID)...
#$33,#$48: begin
if Status then
begin
Attacker:=ReadD(2);
ObjectID:=ReadD(6);
if (Attacker<>ObjectID) and (MyOID=ObjectID) then TargetAttacker(Attacker);
end;
end;
end; //case
end; //if
if (ConnectName=Name) and FromClient then
begin
case pck[1] of
//34=RequestSocialAction:d(Action:Get.Func09)
#$34: begin
case ReadD(2) of
5: Status:=false;
6: Status:=true;
end;
end;
//59=ValidatePosition:d(X)d(Y)d(Z)...
#$59: begin
MyX:=ReadD(2); //получаю координату х моего чара
MyY:=ReadD(6); //получаю координату у моего чара
MyZ:=ReadD(10); //получаю координату z моего чара
end;
end; //case
end; //if
end.
-
дан пакет например
60 60 87 70 48 6C D2 D0 4D 73 00 00 00 95 9E 01 00 55 54 03 00 38 F2 FF FF
нужно заменить выделенные биты
и послать новый пакет на серв и убить старый.
Помогите плиз в написании
-
list=HStr('49 50 00 4D 00 20 00 22 00 6D 00 61 00 67 00 65 00 20 00 6F 00 72 00 20 00 22 00 66 00 69 00 67 00 68 00 74 00 65 00 72 00 00 00 03 00 00 00');
HolyResistance=HStr('39 70 05 00 00 00 00 00 00 00');
UnholyResistance=HStr('39 71 05 00 00 00 00 00 00 00');
ResistFire=HStr('39 A7 04 00 00 00 00 00 00 00');
ResistWind=HStr('39 A5 04 00 00 00 00 00 00 00');
ResistAqua=HStr('39 9E 04 00 00 00 00 00 00 00');
ElementalProtection=HStr('39 48 05 00 00 00 00 00 00 00');
DivineProtection=HStr('39 49 05 00 00 00 00 00 00 00');
ArcaneProtection=HStr('39 4A 05 00 00 00 00 00 00 00');
MentalShield=HStr('39 0B 04 00 00 00 00 00 00 00');
ResistShock=HStr('39 EB 04 00 00 00 00 00 00 00');
ImproveShieldDefense=HStr('39 DF 05 00 00 00 00 00 00 00');
ImproveMagic=HStr('39 DC 05 00 00 00 00 00 00 00');
ImproveCombat=HStr('39 DB 05 00 00 00 00 00 00 00');
ImproveCondition=HStr('39 DD 05 00 00 00 00 00 00 00');
ImproveMovement=HStr('39 E0 05 00 00 00 00 00 00 00');
WildMagic=HStr('39 17 05 00 00 00 00 00 00 00');
Acumen=HStr('39 3D 04 00 00 00 00 00 00 00');
EarthChant=HStr('39 6F 05 00 00 00 00 00 00 00');
ProphecyofWater=HStr('39 4B 05 00 00 00 00 00 00 00');
NoblesseBlessing=HStr('39 2B 05 00 00 00 00 00 00 00');
ChantofProtection=HStr('39 B5 05 00 00 00 00 00 00 00');
DanceofAquaGuard=HStr('39 33 01 00 00 00 00 00 00 00');
SongofElemental=HStr('39 11 02 00 00 00 00 00 00 00');
SongofEarth=HStr('39 08 01 00 00 00 00 00 00 00');
SongofWarding=HStr('39 0B 01 00 00 00 00 00 00 00');
SongofWind=HStr('39 0C 01 00 00 00 00 00 00 00');
SongofInvocation=HStr('39 0E 01 00 00 00 00 00 00 00');
SongofVitality=HStr('39 30 01 00 00 00 00 00 00 00');
DanceofConcentration=HStr('39 14 01 00 00 00 00 00 00 00');
SirenDance=HStr('39 6D 01 00 00 00 00 00 00 00');
DanceMystic=HStr('39 11 01 00 00 00 00 00 00 00');
SongofRenewal=HStr('39 5D 01 00 00 00 00 00 00 00');
Guidance=HStr('39 D8 04 00 00 00 00 00 00 00');
WarChant=HStr('39 6E 05 00 00 00 00 00 00 00');
ImproveCriticalAttack=HStr('39 DE 05 00 00 00 00 00 00 00');
ChantofBloodAwakening=HStr('39 EF 05 00 00 00 00 00 00 00');
ProphecyofFire=HStr('39 4C 05 00 00 00 00 00 00 00');
SongofFlameGuard=HStr('39 32 01 00 00 00 00 00 00 00');
SongofHunter=HStr('39 0D 01 00 00 00 00 00 00 00');
DanceofFury=HStr('39 13 01 00 00 00 00 00 00 00');
DanceofFire=HStr('39 12 01 00 00 00 00 00 00 00');
DanceoftheWarrior=HStr('39 0F 01 00 00 00 00 00 00 00');
SongofChampion=HStr('39 6C 01 00 00 00 00 00 00 00');
RequestAnswerJoinParty=HStr('43 01 00 00 00');
-
0x23 (RequestBypassToServer)
23 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 39 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 31 00 34 00 30 00 30 00 31 00 00 00
-
B0 39 4A 00 00 01 00 00 00 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-
0x23 (RequestBypassToServer)
23 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 31 00 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 31 00 39 00 30 00 30 00 31 00 00 00
-
Доброго времени суток!
Помогите если не затруднит.Как реализовать скрипт на авто закупку из ГМ шопа?На сервере проблем с деньгами нет 21кол=2.1ккк.
Итак:Есть ГМ шоп в пункте обменник нужно поменять 20 кол на адену,потом из пункта шоп выбрать к примеру свитки->заточки и купить 100 блес Ы випон.Пробывал ловить по 1му пакету и отправлять на сервер смог получить только нажатие кнопочки купить,пробывал словить ряд пакетов(очищаю лог пакетов произвожу обмен коинов на адену и покупку скролов,копирую все полученные пакеты и отправляю серверу),результат нулевой.
Играю на сервере l2rx.com хроники камаэль-Хелбаунд.
-
Всем добрый вечер.
Так как я вообщем в l2phx не очень прошу помощи...
Нужен скрипт примерно по такому алгоритму....(сервер GM PvP(почти каждый ГМ)) :
1. Сам себя выбераеш в таргет
2. Убиваеш себя скилом (как бы в игре через //use_skill)
3. Потом опять выбераеш себя в таргет
4. Ресаеш себя (тоже через //use_skill)
И как бы возвращаешься к 1 пункту.
Если я написал не в тот раздел отпишите я перенесу...
P.S. Готов дать вознаграждение
-
cod:
//----------------------------------------------------------------
const
ItemID = 9455; // ItemID шмотки
myname = 'ник;
//----------------------------------------------------------------
var
ItemBase: array of integer;
Crystal: boolean;
//------------------------------------------------------------------
procedure SendMsg2(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClientEx(myname);
end;
//----------------------------------------------------------------
procedure Init; //Вызывается при включении скрипта
begin
SendMsg2('Начало инициализации скрипта, откройте инвентарь' );
Crystal:=false;
end;
//-----------------------------------------------------------------
procedure Free; //Вызывается при выключении скрипта
begin
end;
//----------------------------------------------------------------
procedure CreateItemBase; //Создает базу ObjectID и ItemID, опять же не проверяет пакет на правильность для экономия ресурсов
var
i,j: integer;
begin
j:=8;
SetLength(ItemBase,int((length(pck)-5)/14)); //1ый байт - идентификатор пакета, следующие 4 байта хз, далее для каждого итема отводится 28 байт, размер массива должен быть в 2 раза больше, чем итемов.
-
закупаемся книжками, выставляем уровень заточки и ник
точим на +1, скрипт продолжает пока не точнет до указанного уровня
ЗЫ точить надо с нуля, иначе счетчик не правильно считать начнет
delpi code:
const
nik='xxxxx';
Enchant=13;
var
SubID, SkillID, SkillLvl, CurrEnch: integer;
procedure Init; //Вызывается при включении скрипта
begin
end;
procedure OnTimer01(Sender: TObject);
begin
end;
procedure Free; //Вызывается при выключении скрипта
begin
CurrEnch:=0;
end;
procedure OnConnect(WithClient: Boolean); //Вызывается при установке соединения
begin
end;
procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения
begin
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if FromServer and (pck[1]=#$62) then case pck[2] of
#$A0: //точнулся
if CurrEnch<Enchant then
begin
CurrEnch:=CurrEnch+1;
Buf:=#$D0;
WriteH(SubID);
WriteD(SkillID);
WriteD(SkillLvl+CurrEnch);
SendToServerEx(nik);
end;
#$A1: //не точнулся
begin
CurrEnch:=1;
Buf:=#$D0;
WriteH(SubID);
WriteD(SkillID);
WriteD(SkillLvl+CurrEnch);
SendToServerEx(nik);
end;
end;
if FromClient and (pck[1]=#$D0) then
begin
SubID:=ReadH(2);
SkillID:=ReadD(4);
SkillLvl:=ReadD(8)-1;
CurrEnch:=1;
end;
end.
-
Идея не нова.
оформил краткий гайд по интерфейсу, работе с последней (на данный момент) версией.
так же включил несколько полезностей взятых с форума.
валяеться тут http://l2phx.pp.ru/arhive/l2ph_help/
комунить да пригодится.
Обновлен в соостветствии с 3.5.23
важно: Страница "Перечень поддерживаемых функций/процедур, переменные." дополнена новыми переменными, функциями\процедурами и краткими пояснениями к ним.
-
всем привет,будьте добры,нужна помощь.
я играю на серве и меня там всё устраивает даже ла2 phx робит) вот, но минус то что там пушки безопасно до 15 точятся и если она(пушка) ломается например на 16 то пушка не на 0 скидывается а остаётся на 15 и сразу же точишь на 16 её, будьте добры помогите разобраться, и la2phx точит но он наичнает "тупить")
Добавлено через 2 минуты
l2phx.3.4.1.61-это phx которым я вхожу в ла2 и щас покажу сам скрипт
Добавлено через 3 минуты
а не он не вместится)ну вы меня поняли надеюсь) что мне изменить подскажите плиз
-
l2hpx error :S
Крафтер
in Request Hacks & Cheats [Russian]
Posted
Предлагаю на суд общественности вот такой вот небольшой крафтер-бот. Спорить не буду, скрипт сыроват, кое-где может и остался мусор, хотя, старался убрать всё лишнее.
Возможности: крафт и продажа сосок всех видов в автоматическом режиме, закупка соул/спирит оре.
Надо только закидывать кристаллы. Думаю, в будущем научу его делать себе Д, Ц и Б кристаллы. Только не судите слишком строго. С паскалем я практически впервые общаюсь - первый раз был в школе лет этак 10 назад. Потому, есть один огромный вопрос к знатокам: а есть ли возможность в этом самом FastScript'е запускать альтернативные потоки, которые имели бы доступ к данным основного потока? Если да, это ОЧЕНЬ сильно упростило бы дело написания ботов.
Просьба ко всем, кто будет пользоваться этим скриптом: переправьте в массиве pathX, pathY и pathZ последнюю точку пути. Или сам массив измените, чтоб бегал по другому маршруту. Иначе, все боты будут сидеть в одном месте.
kod:
const
crafterName = 'crafterBot';
shopMessage = 'Ваша реклама';
minMP = 200;
maxMPtoCraft = 500;
shopResetupTime = 200;
minSoulOre = 500;
minSpiritOre = 500;
maxSoulOre = 7000;
maxSpiritOre = 7000;
SSDprice = 30; //цены на соски. чего не понятного?
SSCprice = 60;
SSBprice = 120;
SSAprice = 240;
SSSprice = 1500;
BSSDprice = 125;
BSSCprice = 250;
BSSBprice = 300;
BSSAprice = 600;
BSSSprice = 3000;
maxSSD = 20000; // максимальное число шотов для крафта на продажу, которое бот будет
maxSSC = 20000; // стремиться поддерживать. Ноль означает не крафтить, но если в инвентаре уже есть
maxSSB = 0; // соски, он будет пытаться их продать.
maxSSA = 0; // Если установлено число больше 0, соответствующий рецепт должен быть изучен
maxSSS = 0;
maxBSSD = 20000;
maxBSSC = 20000;
maxBSSB = 0;
maxBSSA = 0;
maxBSSS = 0;
SSDid = 1463;
SSCid = 1464;
SSBid = 1465;
SSAid = 1466;
SSSid = 1467;
BSSDid = 3948;
BSSCid = 3949;
BSSBid = 3950;
BSSAid = 3951;
BSSSid = 3952;
soulOreID = 1785;
spiritOreID = 3031;
pathWayPoints = 11; //число точек пути в массиве path
buyPoint = 5; //точка пути, по достижению которой можно начинать закупку сырья
var
out:TForm;
m:TMemo;
infoUpdate, moveOn, mainLoop, crafting, shop, delayedProc, fixTrade :TTimer;
act:integer;
initMode, trading :boolean;
pathX, pathY, pathZ :array[1..pathWayPoints] of integer;
shopping :array[1..3] of String;
posX, posY, posZ, currentWayPoint, targetWayPoint, lastRSM :integer;
SSD, SSC, SSB, SSA, SSS, BSSD, BSSC, BSSB, BSSA, BSSS, soulOre, spiritOre :integer;
SSDoid, SSCoid, SSBoid, SSAoid, SSSoid, BSSDoid, BSSCoid, BSSBoid, BSSAoid, BSSSoid :integer;
MyID, MP, maxMP, traderId, buyListID, shopPhase, requestShopManage :integer;
i, count, resetupTimer :integer;
procedure OnTimer;
begin
m.Lines.Clear;
m.Lines.Add('Current position: '+IntToStr(posX)+', '+IntToStr(posY)+', '+IntToStr(posZ));
m.Lines.Add('Target waypoint: #'+IntToStr(targetWayPoint)+' ('+IntToStr(pathX[targetWayPoint])+', '+IntToStr(pathY[targetWayPoint])+', '+IntToStr(pathZ[targetWayPoint])+')');
m.Lines.Add('Current waypoint: #'+IntToStr(currentWayPoint));
m.Lines.Add('MP: '+IntToStr(MP)+'/'+IntToStr(maxMP));
m.Lines.Add('SSD count:'+IntToStr(SSD));
m.Lines.Add('SSC count:'+IntToStr(SSC));
m.Lines.Add('SSB count:'+IntToStr(SSB));
m.Lines.Add('SSA count:'+IntToStr(SSA));
m.Lines.Add('SSS count:'+IntToStr(SSS));
m.Lines.Add('BSSD count:'+IntToStr(BSSD));
m.Lines.Add('BSSC count:'+IntToStr(BSSC));
m.Lines.Add('BSSB count:'+IntToStr(BSSB));
m.Lines.Add('BSSA count:'+IntToStr(BSSA));
m.Lines.Add('BSSS count:'+IntToStr(BSSS));
m.Lines.Add('SpiritOre count:'+IntToStr(spiritOre));
m.Lines.Add('SoulOre count:'+IntToStr(soulOre));
m.Lines.Add('Last shop request: '+IntToStr(lastRSM));
if trading then m.Lines.Add('Trading...') else m.Lines.Add('Trading stopped.');
if infoUpdate.enabled then m.Lines.Add('infoUpdate: enabled') else m.Lines.Add('infoUpdate: disabled');
if moveOn.enabled then m.Lines.Add('moveOn: enabled') else m.Lines.Add('moveOn: disabled');
if mainLoop.enabled then m.Lines.Add('mainLoop: enabled') else m.Lines.Add('mainLoop: disabled');
if crafting.enabled then m.Lines.Add('crafting: enabled') else m.Lines.Add('crafting: disabled');
if shop.enabled then m.Lines.Add('shop: enabled') else m.Lines.Add('shop: disabled');
end;
procedure moveOnTimer;
var
dx, dy, dz, d :integer;
begin
dx:=posX-pathX[currentWayPoint];
dy:=posY-pathY[currentWayPoint];
dz:=posZ-pathZ[currentWayPoint];
d:=Round(sqrt(dx*dx+dy*dy));
if (d<40) and (sqrt(dz*dz)<500) then
begin
if (currentWayPoint=targetWayPoint) then moveOn.enabled:=false
else begin
currentWayPoint:=currentWayPoint+1;
if (currentWayPoint>pathWayPoints) then currentWayPoint:=1;
end;
exit;
end
else begin
buf:='';
WriteC(1);
WriteD(pathX[currentWayPoint]);
WriteD(pathY[currentWayPoint]);
WriteD(pathZ[currentWayPoint]);
WriteD(posX);
WriteD(posY);
WriteD(posZ);
WriteD(1);
SendToServerEx(crafterName);
end;
end;
procedure StartTrade;
begin
mainLoop.enabled:=false;
requestShopManage:=1;
buf:=#$73;
SendToServerEx(crafterName);
fixTrade.enabled:=true;
end;
procedure StartTrade2;
begin
requestShopManage:=0;
buf:=#$77;
WriteS(shopMessage);
SendToServerEx(crafterName);
delay(100);
buf:=#$74;
WriteD(0); WriteD(0);
count:=0;
if (SSD>0) then begin inc(count); WriteD(SSDoid); WriteD(SSD); WriteD(SSDprice); end;
if (SSC>0) then begin inc(count); WriteD(SSCoid); WriteD(SSC); WriteD(SSCprice); end;
if (SSB>0) then begin inc(count); WriteD(SSBoid); WriteD(SSB); WriteD(SSBprice); end;
if (SSA>0) then begin inc(count); WriteD(SSAoid); WriteD(SSA); WriteD(SSAprice); end;
if (SSS>0) and (count<4) then begin inc(count); WriteD(SSSoid); WriteD(SSS); WriteD(SSSprice); end;
if (BSSD>0) and (count<4) then begin inc(count); WriteD(BSSDoid); WriteD(BSSD); WriteD(BSSDprice); end;
if (BSSC>0) and (count<4) then begin inc(count); WriteD(BSSCoid); WriteD(BSSC); WriteD(BSSCprice); end;
if (BSSB>0) and (count<4) then begin inc(count); WriteD(BSSBoid); WriteD(BSSB); WriteD(BSSBprice); end;
if (BSSA>0) and (count<4) then begin inc(count); WriteD(BSSAoid); WriteD(BSSA); WriteD(BSSAprice); end;
if (BSSS>0) and (count<4) then begin inc(count); WriteD(BSSSoid); WriteD(BSSS); WriteD(BSSSprice); end;
if (count=0) then exit;
WriteD(count,6);
SendToServerEx(crafterName);
resetupTimer:=0;
trading:=true;
mainLoop.enabled:=true;
delayedProc.enabled:=false;
fixTrade.enabled:=false;
end;
procedure StopTrade;
begin
mainLoop.enabled:=false;
buf:=HStr('1D 01 00 00 00');
SendToServerEx(crafterName);
delay(200);
requestShopManage:=2;
buf:=#$73;
SendToServerEx(crafterName);
fixTrade.enabled:=true;
end;
procedure StopTrade2;
begin
requestShopManage:=0;
buf:=#$76;
SendToServerEx(crafterName);
delay(100);
trading:=false;
mainLoop.enabled:=true;
delayedProc.enabled:=false;
fixTrade.enabled:=false;
end;
procedure mainLoopTick;
var
toCraft :boolean;
begin
if moveOn.enabled then exit;
if (currentWayPoint=buyPoint) then
begin
mainLoop.enabled:=false;
targetWayPoint:=pathWayPoints;
shop.enabled:=true;
exit;
end;
if(soulOre<minSoulOre) or (spiritOre<minSpiritOre) then
begin
if (SSD+SSC+SSB+SSA+SSS+BSSD+BSSC+BSSB+BSSA+BSSS=0) then
begin buf:=HStr('1D 01 00 00 00'); SendToServerEx(crafterName); end
else StopTrade;
targetWayPoint:=buyPoint;
moveOn.enabled:=true;
exit;
end;
resetupTimer:=resetupTimer+10;
toCraft:=false;
if (SSD<maxSSD) then toCraft:=true;
if (SSC<maxSSC) then toCraft:=true;
if (SSB<maxSSB) then toCraft:=true;
if (SSA<maxSSA) then toCraft:=true;
if (SSS<maxSSS) then toCraft:=true;
if (BSSD<maxBSSD) then toCraft:=true;
if (BSSC<maxBSSC) then toCraft:=true;
if (BSSB<maxBSSB) then toCraft:=true;
if (BSSA<maxBSSA) then toCraft:=true;
if (BSSS<maxBSSS) then toCraft:=true;
if toCraft and (MP>maxMPtoCraft) and trading then
begin
mainLoop.enabled:=false;
crafting.enabled:=true;
exit;
end;
if (trading=false) then begin StartTrade; exit; end;
if (resetupTimer<shopResetupTime) then exit;
if (SSD+SSC+SSB+SSA+SSS+BSSD+BSSC+BSSB+BSSA+BSSS=0) then begin
buf:=HStr('1D 01 00 00 00');
SendToServerEx(crafterName);
exit;
end;
StopTrade;
end;
procedure craftingTick;
var
nocraft :boolean;
begin
nocraft:=true;
if (SSD<maxSSD) then begin buf:=HStr('AF 14 00 00 00'); SendToServerEx(crafterName); delay(33); nocraft:=false; end;
if (SSC<maxSSC) then begin buf:=HStr('AF 15 00 00 00'); SendToServerEx(crafterName); delay(33); nocraft:=false; end;
if (SSB<maxSSB) then ;
if (SSA<maxSSA) then ;
if (SSS<maxSSS) then ;
if (BSSD<maxBSSD) then begin buf:=HStr('AF 43 01 00 00'); SendToServerEx(crafterName); delay(33); nocraft:=false; end;
if (BSSC<maxBSSC) then begin buf:=HStr('AF 44 01 00 00'); SendToServerEx(crafterName); delay(33); nocraft:=false; end;
if (BSSB<maxBSSB) then ;
if (BSSA<maxBSSA) then ;
if (BSSS<maxBSSS) then ;
if (MP<minMP) or nocraft then
begin
crafting.enabled:=false;
mainLoop.enabled:=true;
exit;
end;
end;
procedure shoppingTick;
begin
if(shopPhase<4) then
begin
buf:=shopping[shopPhase];
SendToServerEx(crafterName);
inc(shopPhase);
exit;
end;
if(buyListID=0) then exit;
shopPhase:=1;
shop.enabled:=false;
buf:=#$1F;
WriteD(buyListID);
WriteD(0); i:=0;
if(soulOre<maxSoulOre) then
begin
WriteD(soulOreID); WriteD(maxSoulOre-soulOre);
inc(i);
end;
if(spiritOre<maxSpiritOre) then
begin
WriteD(spiritOreID); WriteD(maxSpiritOre-spiritOre);
inc(i);
end;
WriteD(i,6);
SendToServerEx(crafterName);
buyListID:=0;
moveOn.enabled:=true;
mainLoop.enabled:=true;
end;
procedure fixOnTimer;
begin
buf:=#$76;
SendToServerEx(crafterName);
delay(200);
buf:=#$73;
SendToServerEx(crafterName);
end;
procedure Init; //Вызывается при включении скрипта
begin
out := TForm.Create(nil);
out.Caption := 'Status';
out.BorderStyle := bsSizeable;
out.Position := poScreenCenter;
out.Width:=400;
out.Height:=600;
m:=TMemo.Create(out);
m.parent:=out;
m.align:=alClient;
m.ReadOnly:=true;
m.ScrollBars:=ssBoth;
out.Show;
infoUpdate:=TTimer.Create(nil);
infoUpdate.OnTimer:=@OnTimer;
infoUpdate.interval:=1000;
moveOn:=TTimer.Create(nil);
moveOn.OnTimer:=@moveOnTimer;
moveOn.interval:=1000;
moveOn.enabled:=false;
mainLoop:=TTimer.Create(nil);
mainLoop.OnTimer:=@mainLoopTick;
mainLoop.interval:=10000;
mainLoop.enabled:=false;
crafting:=TTimer.Create(nil);
crafting.OnTimer:=@craftingTick;
crafting.interval:=333;
crafting.enabled:=false;
shop:=TTimer.Create(nil);
shop.OnTimer:=@shoppingTick;
shop.interval:=500;
shop.enabled:=false;
delayedProc:=TTimer.Create(nil);
delayedProc.OnTimer:=nil;
delayedProc.interval:=333;
delayedProc.enabled:=false;
fixTrade:=TTimer.Create(nil);
fixTrade.OnTimer:=@fixOnTimer;
fixTrade.interval:=30000;
fixTrade.enabled:=false;
posX:=0; posY:=0; posZ:=0;
SSD:=0; SSC:=0; SSB:=0; SSA:=0; SSS:=0; BSSD:=0; BSSC:=0; BSSB:=0; BSSA:=0; BSSS:=0;
act:=0;
MyID:=0;
traderId:=0;
shopPhase:=1;
buyListID:=0;
currentWayPoint:=pathWayPoints;
targetWayPoint:=pathWayPoints;
pathX[1]:= 80687; pathY[1]:= 148621; pathZ[1]:= -3490;
pathX[2]:= 79833; pathY[2]:= 148476; pathZ[2]:= -3559;
pathX[3]:= 79804; pathY[3]:= 148213; pathZ[3]:= -3559;
pathX[4]:= 80247; pathY[4]:= 148172; pathZ[4]:= -3534;
pathX[5]:= 80466; pathY[5]:= 147892; pathZ[5]:= -3533;
pathX[6]:= 80185; pathY[6]:= 148185; pathZ[6]:= -3534;
pathX[7]:= 79787; pathY[7]:= 148246; pathZ[7]:= -3559;
pathX[8]:= 79867; pathY[8]:= 148584; pathZ[8]:= -3559;
pathX[9]:= 80885; pathY[9]:= 148624; pathZ[9]:= -3495;
pathX[10]:= 81749; pathY[10]:= 148292; pathZ[10]:= -3493;
pathX[11]:= 0; pathY[11]:= 0; pathZ[11]:= -3493;
shopping[3]:=HStr('21 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 30 00 00 00');
infoUpdate.enabled:=true;
initMode:=true;
trading:=false;
buf:=#$0F;
SendToServerEx(crafterName);
{delay(100);
buf:=HStr('A0 03 00 00 00');
SendToServerEx(crafterName);}
end;
procedure Free; //Вызывается при выключении скрипта
begin
mainLoop.Free;
crafting.Free;
infoUpdate.Free;
moveOn.Free;
m.Free;
out.Free;
fixTrade.Free;
delayedProc.Free;
shop.free;
end;
procedure OnConnect(WithClient: Boolean); //Вызывается при установке соединения
begin
end;
procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения
begin
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if (ConnectName<>crafterName) then exit;
case FromServer of
true: begin //Обработка пакетов сервера
if (pck[1]=#$04) then
begin
maxMP:=ReadD(84);
MP:=ReadD(88);
if initMode=false then exit;
posX:=ReadD(2);
posY:=ReadD(6);
posZ:=ReadD(10);
initMode:=false;
MyID:=ReadD(18);
moveOn.enabled:=true;
mainLoop.enabled:=true;
resetupTimer:=0;
exit;
end;
if (pck[1]=#$1B) then //Загрузка инвентаря
begin
count:=ReadH(4);
for i:=0 to count-1 do
case ReadD(i*28+12) of
SSDid: begin SSD:=ReadD(i*28+16); SSDoid:=ReadD(i*28+8); end;
SSCid: begin SSC:=ReadD(i*28+16); SSCoid:=ReadD(i*28+8); end;
SSBid: begin SSB:=ReadD(i*28+16); SSBoid:=ReadD(i*28+8); end;
SSAid: begin SSA:=ReadD(i*28+16); SSAoid:=ReadD(i*28+8); end;
SSSid: begin SSS:=ReadD(i*28+16); SSSoid:=ReadD(i*28+8); end;
BSSDid: begin BSSD:=ReadD(i*28+16); BSSDoid:=ReadD(i*28+8); end;
BSSCid: begin BSSC:=ReadD(i*28+16); BSSCoid:=ReadD(i*28+8); end;
BSSBid: begin BSSB:=ReadD(i*28+16); BSSBoid:=ReadD(i*28+8); end;
BSSAid: begin BSSA:=ReadD(i*28+16); BSSAoid:=ReadD(i*28+8); end;
BSSSid: begin BSSS:=ReadD(i*28+16); BSSSoid:=ReadD(i*28+8); end;
soulOreID: begin soulOre:=ReadD(i*28+16); end;
spiritOreID: begin spiritOre:=ReadD(i*28+16); end;
end;
exit;
end;
if (pck[1]=#$27) then //Обновление инвентаря
begin
count:=ReadH(2);
for i:=0 to count-1 do
begin
act:=ReadH(i*30+4);
case ReadD(i*30+12) of
SSDid: case act of
1: SSD:=SSD+ReadD(i*30+16);
2: SSD:=ReadD(i*30+16);
3: SSD:=SSD-ReadD(i*30+16);
end;
SSCid: case act of
1: SSC:=SSC+ReadD(i*30+16);
2: SSC:=ReadD(i*30+16);
3: SSC:=SSC-ReadD(i*30+16);
end;
SSBid: case act of
1: SSB:=SSB+ReadD(i*30+16);
2: SSB:=ReadD(i*30+16);
3: SSB:=SSB-ReadD(i*30+16);
end;
SSAid: case act of
1: SSA:=SSA+ReadD(i*30+16);
2: SSA:=ReadD(i*30+16);
3: SSA:=SSA-ReadD(i*30+16);
end;
SSSid: case act of
1: SSS:=SSS+ReadD(i*30+16);
2: SSS:=ReadD(i*30+16);
3: SSS:=SSS-ReadD(i*30+16);
end;
BSSDid: case act of
1: BSSD:=BSSD+ReadD(i*30+16);
2: BSSD:=ReadD(i*30+16);
3: BSSD:=BSSD-ReadD(i*30+16);
end;
BSSCid: case act of
1: BSSC:=BSSC+ReadD(i*30+16);
2: BSSC:=ReadD(i*30+16);
3: BSSC:=BSSC-ReadD(i*30+16);
end;
BSSBid: case act of
1: BSSB:=BSSB+ReadD(i*30+16);
2: BSSB:=ReadD(i*30+16);
3: BSSB:=BSSB-ReadD(i*30+16);
end;
BSSAid: case act of
1: BSSA:=BSSA+ReadD(i*30+16);
2: BSSA:=ReadD(i*30+16);
3: BSSA:=BSSA-ReadD(i*30+16);
end;
BSSSid: case act of
1: BSSS:=BSSS+ReadD(i*30+16);
2: BSSS:=ReadD(i*30+16);
3: BSSS:=BSSS-ReadD(i*30+16);
end;
soulOreID: case act of
1: soulOre:=soulOre+ReadD(i*30+16);
2: soulOre:=ReadD(i*30+16);
3: soulOre:=soulOre-ReadD(i*30+16);
end;
spiritOreID: case act of
1: spiritOre:=spiritOre+ReadD(i*30+16);
2: spiritOre:=ReadD(i*30+16);
3: spiritOre:=spiritOre-ReadD(i*30+16);
end;
end;
end;
exit;
end;
if (pck[1]=#$0E) and (ReadD(2)=MyID) then
begin
count:=ReadD(6);
for i:=0 to (count-1) do
case ReadD(10+i*8) of
11: MP:=ReadD(14+i*8);
12: maxMP:=ReadD(14+i*8);
end;
exit;
end;
if (pck[1]=#$9A) and (ReadD(2)=MyID) then begin
count:=ReadD(14);
for i:=0 to count-1 do
case ReadD(i*30+26) of
SSDid: SSDoid:=ReadD(i*30+22);
SSCid: SSCoid:=ReadD(i*30+22);
SSBid: SSBoid:=ReadD(i*30+22);
SSAid: SSAoid:=ReadD(i*30+22);
SSSid: SSSoid:=ReadD(i*30+22);
BSSDid: BSSDoid:=ReadD(i*30+22);
BSSCid: BSSCoid:=ReadD(i*30+22);
BSSBid: BSSBoid:=ReadD(i*30+22);
BSSAid: BSSAoid:=ReadD(i*30+22);
BSSSid: BSSSoid:=ReadD(i*30+22);
end;
case requestShopManage of
0: exit;
1: delayedProc.OnTimer:=@StartTrade2;
2: delayedProc.OnTimer:=@StopTrade2;
end;
delayedProc.enabled:=true;
exit;
end;
if (pck[1]=#$11) then buyListID:= ReadD(6);
end; //end of case 'true'
false: begin //Обработка пакетов клиента
if (pck[1]=#$48) then
begin
posX:=ReadD(2);
posY:=ReadD(6);
posZ:=ReadD(10);
exit;
end;
if (pck[1]=#$04) and (traderId=0) then
begin
traderId:=ReadD(2);
buf:=#$04;
WriteD(traderID);
WriteD(posX);
WriteD(posY);
WriteD(posZ);
WriteC(0);
shopping[1]:=buf;
shopping[2]:=buf;
end;
end; //end of case 'false'
end; //end of case
end.