Всем привет! Много чего уже прочел на форуме и есть некие мысли. Я не программист но немного понимаю. Так вот есть вопросик можно ли вызвать из скрипта выполнение другого скрипта при определенных условиях и после выполнения вызваного скрипта чтобы опять запускался первый скрипт, т.е. можно в принципе сделать чтобы второй скрипт вызывал 1 и завершался?
Нужно это для того чтобы когда боч на каче умер то реснулся в город и по проложеной схеме попер обратно на место кача.
ПанкРедиска тебе кстати удалось написать скриптик по открытию сундуков, если да то может в массы выложишь?
ты не прав, то что сумон атакует цель которая находится в таргете хозяина это все работа клиента, а пакет атаки сумона прост - тупо ИД таргета и его координаты, и пофиг где хозяин. А ид моба и его координаты мы берем от коммандира.
Я со своим скриптом уводил на кач сумона за пол карты от его хозяина
МКС плиз выложи скрипт свой на сумона чтоб на пол карты бегать )
ты не прав, то что сумон атакует цель которая находится в таргете хозяина это все работа клиента, а пакет атаки сумона прост - тупо ИД таргета и его координаты, и пофиг где хозяин. А ид моба и его координаты мы берем от коммандира.
Я со своим скриптом уводил на кач сумона за пол карты от его хозяина
МКС плиз выложи скрипт свой на сумона чтоб на пол карты бегать )
Этот скрипт я писал на скорую руку(за 5-10мин) чисто для быстрой прокачки чара с помощью суммона другова чара большого лвл.
скрипт узконаправленный и сырой, поэтому думаю не стоит его выкладывать для общего пользования....
//Скрипт на БД чтобы танцевал каждые 2 минуты и бегал за командиром
const //Dance
d1='2F 11 01 00 00 00 00 00 00 00'; // Dance of Mystic
d2='2F 15 01 00 00 00 00 00 00 00'; // Dance of Light
d4='2F 10 01 00 00 00 00 00 00 00'; // Inspirations
d3='2F 12 01 00 00 00 00 00 00 00'; // Dance of Fire
d5=''; // Dance of Concentration
var
IDPartyMember, IDAssistTarget: String; //ИД командира и ИД его таргета и Собственный ИД
CoordBDX, CoordBDY, CoordBDZ :String; //координаты бота
NameBD, NameKomandos : String; // Имена
x: integer;
timerBD: TTimer;
timerBD1: TTimer;
procedure OnTimerBD(Sender: TObject);
begin
Case x of
1: begin
buf:=hstr(d1);
SendToServerEx(NameBD);
x:=x+1;
end;
2: begin
buf:=hstr(d2);
SendToServerEx(NameBD);
x:=x+1;
end;
3: begin
bRun;
x:=0;
timerBD.enabled:=false;
end;
end;
end;
procedure OnTimerBD1(Sender: TObject);
begin
timerBD.enabled:=true;
x:=1;
end;
procedure bRun;
begin
if (CoordBDX <> '') and (IDPartyMember <> '') then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDPartyMember + CoordBDX + CoordBDY + CoordBDZ + hstr('00');
SendToServerEX(NameBD);
//бежим за командиром эмулируя повторный щелчек мыши по таргету
buf:=hstr('04') + IDPartyMember + CoordBDX + CoordBDY + CoordBDZ + hstr('00');
SendToServerEX(NameBD);
end;
end;
procedure Init; //Вызывается при включении скрипта
begin
NameBD:='НИК БД;
NameKomandos:='НИК КОМАНДИРА';
timerBD:=TTimer.Create(nil);
timerBD.OnTimer:=@OnTimerBD;
timerBD.enabled:=false;
timerBD.interval:=2000;
x:=0;
timerBD1:=TTimer.Create(nil);
timerBD1.OnTimer:=@OnTimerBD1;
timerBD1.enabled:=false;
timerBD1.interval:=120000;
end;
procedure Free; //Вызывается при выключении скрипта
begin
timerBD.Free;
timerBD1.Free;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
//если от сервака принят пакет с ИД и Координатами членов пати то
if FromServer and (pck[1]=#$a7) then
begin
//запоминаем ИД командира
IDPartyMember:=pck[6] + pck[7] + pck[8] + pck[9];
end;
//если принят пакет от клиента с кординатами бд то
if FromClient and (ConnectName=NameBD) and (pck[1]=#$48) then
begin
//запоминаем координаты
CoordBDX:= pck[6] + pck[7] + pck[8] + pck[9];
CoordBDY:= pck[10] + pck[11] + pck[12] + pck[13];
CoordBDZ:= pck[14] + pck[15] + pck[16] + pck[17];
end;
//далее идут управляющие команды
//если КОМАНДИР пишет в любой чат цифру "1" то
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$31) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';
//БД БЕЖИТ за КОМАНДИРОМ
bRun;
//выйти из рабочей части скрипта чтобы другие услови не проверяли убитый пакет нулевой длинны
exit;
end;
// запускаем танцы
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$38) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';
// бафы
timerBD1.enabled:=true;
timerBD.enabled:=true;
x:=1;
exit;
end;
// остановить танцы
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$39) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';
timerBD1.enabled:=false;
exit;
end;
end.
Есть проблема с этим скриптом, наверное я чего то там намутил не так как надо хоть сам скрипт и работает но выскакивает ошибка в программе << Access violation at address 00512A77 in module "l2phx.exe". Read of address 00000043. >>
Да и после отключения скрипта ошибка продолжает выскакивать.
подскажите пж че надо поменять в скрипте для точки S оружия и шмота и чтобы заработал, а то у меня не пашет(
Код:
ВЫДЕЛИТЬ ВСЁ
//Автоматизация заточки предметов до необходимого уровня 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.
Он у тебя рабочий. Ищи ошибку в другом месте. Вот он же с небольшими изменениями в логике включения бафов.
Код:
//Скрипт на БД чтобы танцевал каждые 2 минуты и бегал за командиром
const //Dance
d1='2F 11 01 00 00 00 00 00 00 00'; // Dance of Mystic
d2='2F 15 01 00 00 00 00 00 00 00'; // Dance of Light
d4='2F 10 01 00 00 00 00 00 00 00'; // Inspirations
d3='2F 12 01 00 00 00 00 00 00 00'; // Dance of Fire
d5=''; // Dance of Concentration
var
IDPartyMember, IDAssistTarget: String; //ИД командира и ИД его таргета и Собственный ИД
CoordBDX, CoordBDY, CoordBDZ :String; //координаты бота
NameBD, NameKomandos : String; // Имена
x: integer;
timerBD: TTimer;
timerBD1: TTimer;
procedure OnTimerBD(Sender: TObject);
begin
Case x of
1: begin
buf:=hstr(d1);
SendToServerEx(NameBD);
x:=x+1;
end;
2: begin
buf:=hstr(d2);
SendToServerEx(NameBD);
x:=x+1;
end;
3: begin
buf:=hstr(d3);
SendToServerEx(NameBD);
x:=x+1;
end;
4: begin
buf:=hstr(d4);
SendToServerEx(NameBD);
x:=x+1;
end;
5: begin
bRun;
x:=0;
timerBD1.enabled:=true;
timerBD.enabled:=false;
end;
end;
end;
procedure OnTimerBD1(Sender: TObject);
begin
timerBD.enabled:=true;
x:=1;
end;
procedure bRun;
begin
if (CoordBDX <> '') and (IDPartyMember <> '') then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDPartyMember + CoordBDX + CoordBDY + CoordBDZ + hstr('00');
SendToServerEX(NameBD);
//бежим за командиром эмулируя повторный щелчек мыши по таргету
buf:=hstr('04') + IDPartyMember + CoordBDX + CoordBDY + CoordBDZ + hstr('00');
SendToServerEX(NameBD);
end;
end;
procedure Init; //Вызывается при включении скрипта
begin
NameBD:='BladeDancer';
NameKomandos:='Kommander';
timerBD:=TTimer.Create(nil);
timerBD.OnTimer:=@OnTimerBD;
timerBD.enabled:=false;
timerBD.interval:=2000;
x:=0;
timerBD1:=TTimer.Create(nil);
timerBD1.OnTimer:=@OnTimerBD1;
timerBD1.enabled:=false;
timerBD1.interval:=120000;
end;
procedure Free; //Вызывается при выключении скрипта
begin
timerBD.Free;
timerBD1.Free;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
//если от сервака принят пакет с ИД и Координатами членов пати то
if FromServer and (pck[1]=#$a7) then
begin
//запоминаем ИД командира
IDPartyMember:=pck[6] + pck[7] + pck[8] + pck[9];
end;
//если принят пакет от клиента с кординатами бд то
if FromClient and (ConnectName=NameBD) and (pck[1]=#$48) then
begin
//запоминаем координаты
CoordBDX:= pck[6] + pck[7] + pck[8] + pck[9];
CoordBDY:= pck[10] + pck[11] + pck[12] + pck[13];
CoordBDZ:= pck[14] + pck[15] + pck[16] + pck[17];
end;
//далее идут управляющие команды
//если КОМАНДИР пишет в любой чат цифру "1" то
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$31) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';
//БД БЕЖИТ за КОМАНДИРОМ
bRun;
//выйти из рабочей части скрипта чтобы другие услови не проверяли убитый пакет нулевой длинны
exit;
end;
// запускаем танцы
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$38) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';
// бафы
//timerBD1.enabled:=true;
timerBD.enabled:=true;
x:=1;
exit;
end;
// остановить танцы
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$39) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';
timerBD1.enabled:=false;
timerBD.enabled:=false;
exit;
end;
end.