Вообщем выкладываю свой первый скрипт. Прошу не кидать в меня помидорами. Гуру прошу отписать замечания :)
Код:
//Скрипт для манора в Садах Евы турантом 47 лвла. Включаем скрипт и потом социальное YES для начала работы
// убиваем пару Стакато и дальше он сам сражается.
const
MOB=1000794; // имя моба Blade Stakato 41x2
Seed=5221; //Chilly Cobol
Harvester=5125; //Harvester
MaxMobCount=2;
SpiritofOgre='2F 6D 00 00 00 00 00 00 00 00';
HealingPotion=1061;
var
MobID: array [1..MaxMobCount] of integer;
i,count:integer;
CurHP,MaxHP:integer;
MobName, MobX, MobY, MobZ:integer;
MobInWarID, MobInWarName: integer; // ИД моба и Имя моба(номер моба)
SocialID:integer; // ИД соц действия
status : boolean; // Начинать работать или нет
SeedID:Integer;
HarvesterID: integer;
HealingPotionID:integer;
procedure Init; //Вызывается при включении скрипта
begin
MobID[1]:=0;
MobID[2]:=0;
MobInWarID:=0;
end;
procedure Free; //Вызывается при выключении скрипта
begin
end;
procedure OnConnect(WithClient: Boolean); //Вызывается при установке соединения
begin
end;
procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения
begin
end;
procedure SendMsg(Msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(1);
WriteS('ПОМОШНИК ПВП');
WriteS(Msg);
SendToClient;
end;
function ItemSearch(ItemName:integer):Cardinal;
var i,y:integer;
TempName:Cardinal;
begin
result:=0;
i:=1;
while i<Length(pck)-4 do begin
y:=i;
TempName:=ReadD(y);
Inc(i);
if TempName=ItemName then begin
result:=ReadD(y-8);
end;
end;
end;
procedure Target(ObjectID: Integer);
begin
buf:=#$04;
WriteD(ObjectID);
WriteD(0);
WriteD(0);
WriteD(0);
WriteC(1);
SendToServer;
end;
procedure UseItem(ItemID:integer);
begin
buf:=#$14;
WriteD(ItemID);
WriteD(0);
SendToServer;
end;
procedure Attack(TargetID,TargetX,TargetY,TargetZ:integer);
begin
buf:=#$04;
WriteD(TargetID);
WriteD(TargetX);
WriteD(TargetY);
WriteD(TargetZ);
WriteD(0);
SendToServer;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if FromClient and (pck[1]=#$1B) then
begin
SocialID:=ReadD(2);
case SocialID of
//социальное действие Yes для начала манора
6:begin
Status:=true;
buf:=#$0f;
SendToServer;
end;
//социальное действие No для окончания
5:begin
Status:=false;
end;
end;
end;
//пакет просмотра инвентаря. Находим ИД семян, харвестера и бутылок для дальнейшего использования.
if FromServer and (pck[1] = #$1B) then begin
SeedID:=ItemSearch(Seed);
HarvesterID:=ItemSearch(Harvester);
HealingPotionID:=ItemSearch(HealingPotion);
end;
//Пакет InventoryUpdate - не вписывал пока. Как только разберусь с самим пакетом, так сразу и сделаю
if FromServer and (pck[1] = #$27) then begin
// temp:=ItemSearch(GreaterCPP);
// if temp <> 0 then GreaterCPID:=temp;
// temp:= ItemSearch(GreaterHP);
// if temp <> 0 then GreaterHPID:=temp;
// temp:= ItemSearch(QuickHP);
// if temp <> 0 then QuickHPID:= temp;
// ShowHTML(IntToStr(GreaterCPID)+' '+IntToStr(GreaterHPID)+' '
// +IntToStr(QuickHPID))
end;
//Если приходит пакет NPCInfo от сервера, то проверяем чтобы это был нужный нам моб и находился в нужной области
//координат, то запоминаем ИД моба в массив.
if FromServer and (pck[1]=#$16) then begin
//Думаю тут надо пояснить что и как. Параметр -7750 и -8184 это координаты по оси Z.
//Сделано это для того чтобы персонаж не отвлекался на других мобов в округи, а занимался только этими двумя :)
if (ReadD(6)=MOB) and (ReadD(22)<-7750) and (ReadD(22)>-8184) then begin
count:=0;
for i:=1 to MaxMobCount do begin
if (MobID[i]=ReadD(2)) then count:=i;
end;
if (count = 0) then begin
for i:=1 to MaxMobCount do begin
if (MobID[i]=0) then begin
MobID[i]:=ReadD(2);
break;
end;
end;
end;
// MobID:=ReadD(2);
// MobName:=ReadD(6);
// MobX:=ReadD(14);
// MobY:=ReadD(18);
// MobZ:=ReadD(22);
// Sendmsg(IntToStr(MobID[1]));
// Sendmsg(IntToStr(MobID[2]));
// SendMsg(IntToStr(MobInWarID));
// Attack(MobID,MobX,MobY,MobZ);
end;
end;
//Если приходит пакет удаления объекта и ИД объекта равен мобу в массиве, то удаляем ИД с массива
if FromServer and (pck[1]=#$12) then begin
for i:=1 to MaxMobCount do begin
if (MobID[i]=ReadD(2)) then MobID[i]:=0;
end;
end;
//Тут я под пакет MoveToLocation спрятал выборку следующего моба для атаки. Спрятал в этот пакет, потому что
//двигаются часто кто нить рядом, а ставить при обработке при любом пакете - слишком нагружать скрипт
if FromServer and (pck[1]=#$01) then begin
For i:=1 to MaxMobCount do begin
if MobID[i]<>0 then begin
MobInWarID:=MobID[i];
Attack(MobInWarID,0,0,0);
end;
end;
end;
// ПРиходит побтверждение что цель выбрана и атакуем цель
if FromServer and (pck[1]=#$A6) then begin
if (ReadD(2)=MobInWarID) then Attack(MobInWarID,0,0,0);
end;
//Пока у моба не 0 ХП забрасываем семечку. Если данные о своих ХП то смотрим и выпиваем бутылку
if FromServer and (pck[1]=#$0E) then begin
if (ReadD(2)=MobInWarID) then begin
if (ReadD(14)<>0) and (SeedID<>0) then UseItem(SeedID);
end;
if (pck[6]=#$04) then begin
CurHP:=ReadD(14);
MaxHP:=ReadD(22);
if (CurHP<2000) then UseItem(HealingPotionID);
end;
end;
if FromServer and (pck[1]=#$16) then begin
if (ReadD(2)=MobInWarID) and (HarvesterID<>0) then UseItem(HarvesterID);
end;
//Тут проверяем закончилось ли действие Баффа и если закончилось то еще раз используем
if FromServer and (pck[1]=#$7F) then begin
buf:=Hstr(SpiritofOgre);
SendToServer;
Attack(MobInWarID,0,0,0);
end;
// SendMsg(IntToStr(MobID));
// SendMsg(IntToStr(MobName));
end.
Вообщем выкладываю свой первый скрипт. Прошу не кидать в меня помидорами. Гуру прошу отписать замечания :)
Код:
//Скрипт для манора в Садах Евы турантом 47 лвла. Включаем скрипт и потом социальное YES для начала работы
// убиваем пару Стакато и дальше он сам сражается.
const
MOB=1000794; // имя моба Blade Stakato 41x2
Seed=5221; //Chilly Cobol
Harvester=5125; //Harvester
MaxMobCount=2;
SpiritofOgre='2F 6D 00 00 00 00 00 00 00 00';
HealingPotion=1061;
var
MobID: array [1..MaxMobCount] of integer;
i,count:integer;
CurHP,MaxHP:integer;
MobName, MobX, MobY, MobZ:integer;
MobInWarID, MobInWarName: integer; // ИД моба и Имя моба(номер моба)
SocialID:integer; // ИД соц действия
status : boolean; // Начинать работать или нет
SeedID:Integer;
HarvesterID: integer;
HealingPotionID:integer;
procedure Init; //Вызывается при включении скрипта
begin
MobID[1]:=0;
MobID[2]:=0;
MobInWarID:=0;
end;
procedure Free; //Вызывается при выключении скрипта
begin
end;
procedure OnConnect(WithClient: Boolean); //Вызывается при установке соединения
begin
end;
procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения
begin
end;
procedure SendMsg(Msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(1);
WriteS('ПОМОШНИК ПВП');
WriteS(Msg);
SendToClient;
end;
function ItemSearch(ItemName:integer):Cardinal;
var i,y:integer;
TempName:Cardinal;
begin
result:=0;
i:=1;
while i<Length(pck)-4 do begin
y:=i;
TempName:=ReadD(y);
Inc(i);
if TempName=ItemName then begin
result:=ReadD(y-8);
end;
end;
end;
procedure Target(ObjectID: Integer);
begin
buf:=#$04;
WriteD(ObjectID);
WriteD(0);
WriteD(0);
WriteD(0);
WriteC(1);
SendToServer;
end;
procedure UseItem(ItemID:integer);
begin
buf:=#$14;
WriteD(ItemID);
WriteD(0);
SendToServer;
end;
procedure Attack(TargetID,TargetX,TargetY,TargetZ:integer);
begin
buf:=#$04;
WriteD(TargetID);
WriteD(TargetX);
WriteD(TargetY);
WriteD(TargetZ);
WriteD(0);
SendToServer;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if FromClient and (pck[1]=#$1B) then
begin
SocialID:=ReadD(2);
case SocialID of
//социальное действие Yes для начала манора
6:begin
Status:=true;
buf:=#$0f;
SendToServer;
end;
//социальное действие No для окончания
5:begin
Status:=false;
end;
end;
end;
//пакет просмотра инвентаря. Находим ИД семян, харвестера и бутылок для дальнейшего использования.
if FromServer and (pck[1] = #$1B) then begin
SeedID:=ItemSearch(Seed);
HarvesterID:=ItemSearch(Harvester);
HealingPotionID:=ItemSearch(HealingPotion);
end;
//Пакет InventoryUpdate - не вписывал пока. Как только разберусь с самим пакетом, так сразу и сделаю
if FromServer and (pck[1] = #$27) then begin
// temp:=ItemSearch(GreaterCPP);
// if temp <> 0 then GreaterCPID:=temp;
// temp:= ItemSearch(GreaterHP);
// if temp <> 0 then GreaterHPID:=temp;
// temp:= ItemSearch(QuickHP);
// if temp <> 0 then QuickHPID:= temp;
// ShowHTML(IntToStr(GreaterCPID)+' '+IntToStr(GreaterHPID)+' '
// +IntToStr(QuickHPID))
end;
//Если приходит пакет NPCInfo от сервера, то проверяем чтобы это был нужный нам моб и находился в нужной области
//координат, то запоминаем ИД моба в массив.
if FromServer and (pck[1]=#$16) then begin
//Думаю тут надо пояснить что и как. Параметр -7750 и -8184 это координаты по оси Z.
//Сделано это для того чтобы персонаж не отвлекался на других мобов в округи, а занимался только этими двумя :)
if (ReadD(6)=MOB) and (ReadD(22)<-7750) and (ReadD(22)>-8184) then begin
count:=0;
for i:=1 to MaxMobCount do begin
if (MobID[i]=ReadD(2)) then count:=i;
end;
if (count = 0) then begin
for i:=1 to MaxMobCount do begin
if (MobID[i]=0) then begin
MobID[i]:=ReadD(2);
break;
end;
end;
end;
// MobID:=ReadD(2);
// MobName:=ReadD(6);
// MobX:=ReadD(14);
// MobY:=ReadD(18);
// MobZ:=ReadD(22);
// Sendmsg(IntToStr(MobID[1]));
// Sendmsg(IntToStr(MobID[2]));
// SendMsg(IntToStr(MobInWarID));
// Attack(MobID,MobX,MobY,MobZ);
end;
end;
//Если приходит пакет удаления объекта и ИД объекта равен мобу в массиве, то удаляем ИД с массива
if FromServer and (pck[1]=#$12) then begin
for i:=1 to MaxMobCount do begin
if (MobID[i]=ReadD(2)) then MobID[i]:=0;
end;
end;
//Тут я под пакет MoveToLocation спрятал выборку следующего моба для атаки. Спрятал в этот пакет, потому что
//двигаются часто кто нить рядом, а ставить при обработке при любом пакете - слишком нагружать скрипт
if FromServer and (pck[1]=#$01) then begin
For i:=1 to MaxMobCount do begin
if MobID[i]<>0 then begin
MobInWarID:=MobID[i];
Attack(MobInWarID,0,0,0);
end;
end;
end;
// ПРиходит побтверждение что цель выбрана и атакуем цель
if FromServer and (pck[1]=#$A6) then begin
if (ReadD(2)=MobInWarID) then Attack(MobInWarID,0,0,0);
end;
//Пока у моба не 0 ХП забрасываем семечку. Если данные о своих ХП то смотрим и выпиваем бутылку
if FromServer and (pck[1]=#$0E) then begin
if (ReadD(2)=MobInWarID) then begin
if (ReadD(14)<>0) and (SeedID<>0) then UseItem(SeedID);
end;
if (pck[6]=#$04) then begin
CurHP:=ReadD(14);
MaxHP:=ReadD(22);
if (CurHP<2000) then UseItem(HealingPotionID);
end;
end;
if FromServer and (pck[1]=#$16) then begin
if (ReadD(2)=MobInWarID) and (HarvesterID<>0) then UseItem(HarvesterID);
end;
//Тут проверяем закончилось ли действие Баффа и если закончилось то еще раз используем
if FromServer and (pck[1]=#$7F) then begin
buf:=Hstr(SpiritofOgre);
SendToServer;
Attack(MobInWarID,0,0,0);
end;
// SendMsg(IntToStr(MobID));
// SendMsg(IntToStr(MobName));
end.
Прокоментируй нормально скрипт, а то влом искать смотреть какие пакеты ты обрабатываешь, и какие действия совершаешь. Весьма страная процедура по поиску ОбджектИД вещей - но, тем не менее - рабочая. Пока все, а вообще для этого существует топик "Да будет бот".
Прокоментируй нормально скрипт, а то влом искать смотреть какие пакеты ты обрабатываешь, и какие действия совершаешь. Весьма страная процедура по поиску ОбджектИД вещей - но, тем не менее - рабочая. Пока все, а вообще для этого существует топик "Да будет бот".
а вообще для этого существует топик "Да будет бот".
Тема "Да будет бот" превратилась в огромную кучу скриптов и офтопа... Надо сделать отдельную тему со скриптами и кратким описанием и тему с обсуждением ( желательно с ответвлениями для каждого скрипта) на данный момент тема Да будет БОТ не читабельная... (сори за офтоп)
а вообще для этого существует топик "Да будет бот".
Тема "Да будет бот" превратилась в огромную кучу скриптов и офтопа... Надо сделать отдельную тему со скриптами и кратким описанием и тему с обсуждением ( желательно с ответвлениями для каждого скрипта) на данный момент тема Да будет БОТ не читабельная... (сори за офтоп)
Привет АрхиНуб, =) Возможно ты и прав (про то, что надо отдельно тему с разветвлениями) но в "Да будет бот" - намана читабельно, просто там никто давно не модерил ... вот и нкаопилось ...
Привет АрхиНуб, =) Возможно ты и прав (про то, что надо отдельно тему с разветвлениями) но в "Да будет бот" - намана читабельно, просто там никто давно не модерил ... вот и нкаопилось ...
я ворону давно говорил что темку надо разнести на несколько а лучше даже подраздел сделать с готовыми скриптами чтоб первый пост в каждой теме был скриптом и описанием а дальше шло его обсуждение, но ворон яросно защищает текущий вид...
__________________
Я здесь практически не появляюсь!, Skype - ikskor
я ворону давно говорил что темку надо разнести на несколько а лучше даже подраздел сделать с готовыми скриптами чтоб первый пост в каждой теме был скриптом и описанием а дальше шло его обсуждение, но ворон яросно защищает текущий вид...
__________________
Я здесь практически не появляюсь!, Skype - ikskor