PDA

Просмотр полной версии : гайд по скриптам


M6vsKGB
22.04.2009, 13:11
замечательно.. удалили тему -_-

ну тогда подскажите где есть гайд по написанию скриптов для phx?

Grinch
22.04.2009, 13:26
паскаль дельфи и т.д. выбирай какой нравится, этто не валкерт тут нету команд.

M6vsKGB
22.04.2009, 15:40
эх ма =\
а я их не знаю =(

alexteam
22.04.2009, 15:46
как раз и научишся.
а темку я грохнул (во всяком случае я сегодня чтото грохнул), ибо контекст был более похож на "сделайте и дайте".

M6vsKGB
22.04.2009, 17:02
alexteam,
ну ок пордскажи какие комнды использовать сам сделаю ^^
у меня только с этим проблема >.<

ну или напишите гайдик небольшой =) или скажите какие команды нужны для:
отправки покетов
диалога с нпс (продажи н-ного числа предметов)
ну и узнавать сколько денег в инвентаре

ну и наверное нужно будет делать привязку к чару?

alexteam
22.04.2009, 17:51
ну ок пордскажи какие комнды использовать сам сделаю ^^
у меня только с этим проблема >.<разве только с этим %)

ну или напишите гайдик небольшой =) или скажите какие команды перечень стандартных встроенных в пх процедур и функций есть в мануале (http://l2phx.pp.ru/arhive/l2ph_help/index.htm#page=scripting.htm).
в качестве примера "как писать и шо есть шо" можно взять один из скриптов из раздела скриптинг.

диалога с нпс (продажи н-ного числа предметов)таких "команд" нету, их нужно реализовывать самому.

ну и узнавать сколько денег в инвентаретоже самое. нужно перехватывать требуемый пакет содержащий перечень предметов в инвентаре и выдергивать оттуда кол-во.

ну и наверное нужно будет делать привязку к чару?опять же встроенные константы.

M6vsKGB
22.04.2009, 18:32
воо кул!!!то что нужно может чонить и рожу)
если какието траблы будут помогите?)))

Добавлено через 8 минут
воо кул!!!то что нужно может чонить и рожу)
если какието траблы будут помогите?)))

только вот сходу тройка вапросов:


тоже самое. нужно перехватывать требуемый пакет содержащий перечень предметов в инвентаре и выдергивать оттуда кол-во.

и как это сделать =)

и диалог с нпс:
я так думаю нуно отловить парочку покетсов во время того как ты в окне л2 ведешь диалог с нпс?

ид предмета из файлика в корне phx узнавать?

вот ^^

alexteam
22.04.2009, 18:40
каким образом распознать пакет по id - любой скрипт из раздела скриптинг.
поля пакета считываются встроенными функциями. как ? - бери пример. в том же разделе.
подробней по полям в том же гайде (http://l2phx.pp.ru/arhive/l2ph_help/index.htm#page=interlude.htm)

M6vsKGB
22.04.2009, 22:41
alexteam,
неудаляй тему плиз я в нее потом скину то что получилось или не получилось) на рецензию и коректировку)

const
Name='Kopper';
ItemID=158; //
MoneyID=111; //
max=100; //
maxm=2000000000; //
var
ItemBase:array[1..max] of integer;
ItemBaseS:array[1..max] of string;
Sell: string;
KolvoI,KolvoM: integer;
procedure Init;
var i:integer;
begin
buf:=hstr('0F');
SendToServerEx(Name);
end;
procedure Free;
var i:integer;
begin
KolvoI:=0;
KolvoM:=0;
for i:=1 to max do begin
ItemBase[i]:=0;
end;
end;
procedure CreateItemBase;
var i,ss,j,ObjID,ItmID,ListCount,Count:integer;
begin
Item:=0;
ss:=1;
j:=4;
ListCount:=ReadH(j);
if ListCount>max then ListCount:=max;
j:=8;
for i:=1 to ListCount do begin
ObjID:=ReadD(j);
ItmID:=ReadD(j);
Count:=ReadD(j);
j:=j+14;
case ItmID of
ItemID: begin
ItemBase[ss]:=ObjID;
ss:=ss+1;
Kolvoi:=Kolvoi+1;
end;
// MoneyID: begin
// KolvoM=Count;
// end;
end;
j:=j+6;
end;
end;
procedure UpdateItemBase;
var i,ii,j,ObjID,ItmID,ListCount,Count,UpdType: integer;
begin
ListCount:=ReadH(2);
j:=4;
for i:=1 to ListCount do begin
UpdType:=ReadH(j);
j:=j+2;
ObjID:=ReadD(j);
ItmID:=ReadD(j);
Count:=ReadD(j);
j:=j+14;
case UpdType of
1:case ItmID of
ItemID: begin
for ii:=1 to max do
if ItemBase[ii]=0 then begin
ItemBase[ii]:=ObjID;
KolvoI:=KolvoI+1;
break;
end;
end;
end;
MoneyID: begin
KolvoM:=Count;
end;
end;
end;
j:=j+6;
end;
procedure CollectSells;
var l: integer;
begin
if KolvoI=90 and KolvoM<maxm then begin
Sell:=hstr('1E')+hstr('00 00 00 00 50 00 00 00');
for l:=1 to max do
Sell:=Sell+HStr(IntToStr(ItemBase[l]))+hstr('9E 00 00 00 01 00 00 00');
end;
end;
procedure SellItems;
var k: integer;
begin
if KolvoI=90 and KolvoM<maxm then begin
buf:=hstr('21 6E 00 70 00 63 00 5F 00 32 00 36 00 38 00 34 00 36 00 39 00 33 00 35 00 32 00 5F 00 53 00 65 00 6C 00 6C 00 00 00');
SendToServerEx(Name);
delay(200);
buf:=Sell;
SendToServerEx(Name);
end;
Free;
UpdateItemBase;
SendServ;
end;
procedure SendServ;
begin
while KolvoI<90 and KolvoM<maxm do
buf:=hstr('C6 C0 13 00 00 19 00 00 00 01 00 00 00 81 00 00 00');
SendToServerEx(Name);
buf:=hstr('A7 30 7D 8D 12 C0 A5 5F 03 01 00 00 00');
SendToServerEx(Name);
delay(200);
Free;
UpdateItemBase;
end;

чего й то он у мну не запускается=(
ненашел ИД денег.. где его взять хз=\ через ПХ тоже не получается..только ОбжектИД как его использовать..
не могу понять такую фигню как считывается вот эта фигня..
ObjID:=ReadD(j);
ItmID:=ReadD(j);
Count:=ReadD(j);
там же вроде все берется из одного значения: в общем это для мну космос.. побудьте коперниками обьясните)

alexteam
22.04.2009, 22:51
итемайди у денег - 57 (в ItemsID.ini они описаны... как бы..)
колво можно узнать из пакета инвентаря идущего на клиент, либо по апдейту.
ххх:=ReadD(j); читает 4 байта из буфера по позиции j и смещает j на 4.
зы. я в скриптах не очень.. я больше по внутренней остнастке пх.

M6vsKGB
22.04.2009, 22:56
блин он у мну не запускается=(
было бы страно если бы запустился=(

alexteam
22.04.2009, 23:00
понятное дело не запускаеться...
как минимум из за отсутсвия процедур init, free и begin end. в котором обрабатывается пакет.

M6vsKGB
23.04.2009, 19:53
аа фсе вкурил!!=):yahoo:
пойду спать, завтро доделаю, и буду мучить завтро!))
так что прошу быть на месте :D

спасибо!;)

Добавлено через 20 часов 44 минуты
ну вот еще адын вариант.. только он чота выдает ашибку=((
const
Name='Kooper';
ItemID=148;
AdenID=54;
max=100;
var
ItemBaseS:array[1..max] of integer;
KolvoI, KolvoM: integer;
procedure Init;
begin
end;
procedure Free;
begin
end;
procedure GiveAden;
var o: integer;
begin
ItemBase;
for o:=1 to max-10 do begin
buf:=hstr('C6 C0 13 00 00 19 00 00 00 01 00 00 00 81 00 00 00');
SendToServerEx(Name);
buf:=hstr('A7 30 7D 8D 12 C0 A5 5F 03 01 00 00 00');
SendToServerEx(Name);
delay(200);
UpdateItemBase;
end;
delay(1000);
SellItem;
end;
procedure ItemBase;
var i,ss,j,ObjID,ItmID,ListCount,Count,aug:integer;
begin
ss:=1;
j:=4;
ListCount:=ReadH(j);
if ListCount>max then ListCount:=max;
j:=8;
for i:=1 to ListCount do begin
ObjID:=ReadD(j);
ItmID:=ReadD(j);
Count:=ReadD(j);
j:=j+14;
aug:=ReadD(j);
case ItmID of
ItemID: begin
ItemBaseS[ss]:=ObjID;
inc(ss);
end;
AdenID: begin
KolvoM:=Count;
end;
end;
j:=j+6;
end;
end;
procedure UpdateItemBase;
var i,ii,j,ObjID,ItmID,ListCount,Count,UpdType,aug: integer;
begin
ListCount:=ReadH(2);
j:=4;
for i:=1 to ListCount do begin
UpdType:=ReadH(j);
j:=j+2;
ObjID:=ReadD(j);
ItmID:=ReadD(j);
Count:=ReadD(j);
j:=j+14;
aug:=ReadD(j);
case UpdType of
1:case ItmID of
ItemID: begin
for ii:=1 to max do
if ItemBaseS[ii]=0 then begin
ItemBaseS[ii]:=ObjID;
KolvoI:=KolvoI+1;
break;
end;
end;
AdenID: begin
KolvoM:=Count;
end;
end;
end;
end;
j:=j+6;
end;
procedure SellItem;
var i: integer;
ll,ss1: string;
begin
buf:=HStr('1E 00 00 00 00');
ll:=HStr(IntToStr(KolvoI));
WriteD(ll);
for i:=1 to max do begin
ss1:=HStr(IntToStr(ItemBaseS[i]));
WriteD(ssq);
ll:=HStr('9E 00 00 00 01 00 00 00');
WriteD(ll);
end;
SendToServerEx(Name);
Clear;
end;
procedure Clear;
var i: integer;
begin
for i:=1 to max do begin
ItemBaseS[i]:=0;
end;
KolvoI:=0;
end;
begin
if FromClient and (pck[1]=#$04) then begin
GiveAden;
end;
if KolvoM=2147483648 then begin
exit;
end;
end.


вот тут ошибка
buf:=HStr('1E 00 00 00 00');
ll:=HStr(IntToStr(KolvoI));
WriteD(ll); <пишет что Incompatible types :"Integer", "String"
ну я так понимаю что это тип ненравится, но я же вроде перевел уже в строку чего он парится??

alexteam
23.04.2009, 20:01
WriteD пишет число в буфер. а ты пытаешся передать процедуре строчку.

M6vsKGB
23.04.2009, 21:53
йй ну и деревня=((


мхх чота ничего не идеет=(((((((((((((((
может я чонить пропустил =(

Добавлено через 22 минуты
почему то когда я выделяю торговца ПХ начинает бурно работать, но когда я жму действие он ничег оне делает=(

точнее не хочет он продавать а еще точнее не хочет делать базу предметов=((

Добавлено через 1 час 27 минут
procedure SellItem;
var i: integer;
ll: string;
begin
buf:=HStr('1E 00 00 00 00');
WriteD(KolvoI);
for i:=1 to max do begin
WriteD(ItemBase[1,i]);
ll:=HStr('9E 00 00 00 01 00 00 00');
WriteS(ll);
end;
SendToServerEx(Name);
end;
прально написано?
где ItemBase[1,i] ObjID предмета
KolvoI количество предметов

NLObP
24.04.2009, 10:13
M6vsKGB, скрипт писать надо с создания заготовки, в пакетхаке это создать "новый скрипт".


procedure Init; //Вызывается при включении скрипта
begin

end;

procedure Free; //Вызывается при выключении скрипта
begin

end;

procedure OnConnect(WithClient: Boolean); //Вызывается при установке соединения
begin

end;

procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения
begin

end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin

end.


Далее, начинаешь наполнять переменными, вспомогательными функциями/процедурами, таймерами и в основном теле обработчиками пакетов.



//имя программы (не обязательно)
program newscript;

//здесь надо описывать константы
const
Name='Имя чара';
maxitems=250; //max количество предметов в базе
{...}

//далее описывать переменные
var
MyX, MyY, MyZ : integer;

//требуется для поддержки БД BuyList
BaseBuyItems: array[1..maxitems, 1..2] of integer; //все предметы в инвентаре продавца
BuyListID: integer; //ID списка на продажу (всегда новый)

{...}

procedure Init; //Вызывается при включении скрипта
begin
//в этой процедуре обычно описываем переменные, которые надо инициализировать
//также здесь описываем создание форм и объектов
{...}
end;

procedure Free; //Вызывается при выключении скрипта
begin
//здесь описываем освобождение занятых ресурсов объектами и формами
{...}
end;

procedure OnConnect(WithClient: Boolean); //Вызывается при установке соединения
begin

end;

procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения
begin

end;

//здесь надо описывать процедуры и функции
{...}

procedure BuyList;
{Создаем базу BaseBuyItems}
var
i, j, k: integer;
ListCount: integer;
begin
j:=6; //смещение для ListID
BuyListID:=ReadD(j);
ListCount:=ReadH(j); //количество итемов не должно превышать max!
for i:=1 to maxitems do
begin
if (i<=ListCount) then
begin
inc(j,6);
BaseBuyItems[i,1]:=ReadD(j); //ItemID
inc(j,18);
BaseBuyItems[i,2]:=ReadD(j); //Price*TaxRate
inc(j,32);
end else
for k:=1 to 2 do BaseBuyItems[i,k]:=0; // забиваем нулями
end;
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin

//здесь описываем вызовы обработчиков пакетов или если обработчики короткие, то можно писать их и здесь

//не обрабатываем пустые пакеты, сразу на выход
if pck='' then exit;


//пошли обработчики серверных пакетов
if (ConnectName=Name) and FromServer then
begin
case pck[1] of
#$07: begin //07=BuyList
BuyList; //вызываем процедуру обработки пакета BuyList
end;
{...}
end;
end;

//пошли обработчики клиентских пакетов
if (ConnectName=Name) and FromClient then
begin
case pck[1] of
//ValidatePosition пакет от клиента с моими кординатами
//59=ValidatePosition:d(X)d(Y)d(Z)d(Heading)d(Data)
#$59: begin
//обрабатываем пакет без вызова обработчика
MyX:=ReadD(2); //получаю координату х моего чара
MyY:=ReadD(6); //получаю координату у моего чара
MyZ:=ReadD(10); //получаю координату z моего чара
end;
{...}
end;
end;
end.


PS: скрипт можно вставить в пакетхак и проверить

M6vsKGB
24.04.2009, 16:04
дык я спрашиваю про саму процедуру, она прошла проверку.. ну синтаксис правильный.....
а правильно ли я ее написал в смысле, она будет исполняться?
просто я несовсем все понимаю, а написать нужно)

M6vsKGB
26.04.2009, 17:06
черт черт черт!!
я это сделалал .ААААААААААААААААААА
тему мона закрыть ^^