Люди помогите плиз, пытался найти этот скрипт переписаный под камаель, не получилось...
delphi Код:
//Автоматизация заточки предметов до необходимого уровня 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] ofinteger; //Weapon ObjID,lvl
ScrlBase: array[1..max] ofinteger; //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 по ItemIDvar
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 соответствующие необходимым ItemIDfor i:=1to ListCount dobegin
ObjID:=ReadD(j); //ObjectID
ItemID:=ReadD(j); //ItemID
j:=j+14;
Lvl:=ReadD(j); //Levelcase 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 по ItemIDvar
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:=1to ListCount dobegin
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 of1:case ItemID of
weapon: begin
ColvoWpn:=ColvoWpn+1;
//Say('Добавили предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));for ii:=1tomaxdoif WpnBase[1,ii]=0thenbegin WpnBase[1,ii]:=ObjID; WpnBase[2,ii]:=lvl; end;
end;
scroll: begin
ss:=ss+1;
//Say('Добавили скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));for ii:=1tomaxdoif ScrlBase[ii]=0then ScrlBase[ii]:=ObjID;
end;
end;
2:case ItemID of
weapon:
for ii:=1tomaxdoif WpnBase[1,ii]=ObjID then WpnBase[2,ii]:=lvl;
scroll:
//Say('Внимание! Изменения в скролле!?');end;
//удален3:case ItemID of
weapon: begin
ColvoWpn:=ColvoWpn-1;
for ii:=1tomaxdoif WpnBase[1,ii]=ObjID thenbegin WpnBase[1,ii]:=0; WpnBase[2,ii]:=0; end;
//Say('Удаляем предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));end;
scroll: begin
ColvoScrl:=ColvoScrl-1;
for ii:=1tomaxdoif 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, подбираем мин текущий уровень заточки -3var
i: integer;
begin
Result:=-1;
if CurEnchLvl>=MaxEnchLvl thenbegin
Result:=-2;
exit;
end;
for i:=1tomaxdobegin//находим первый подходящий предметif(WpnBase[1,i]<>0)and(WpnBase[2,i]=CurEnchLvl)thenbegin
Result:=WpnBase[1,i];
exit;
end;
end;
CurEnchLvl:=CurEnchLvl+1;
Result:=-3;
end;
//******************************************************************************function GetNextScroll: integer; //Выдает ObjID скролла, если не найден в базе, выдает -1var
i: integer;
begin
Result:=-1;
for i:=1tomaxdobegin//находим первый подходящий предметif(ScrlBase[i]<>0)thenbegin
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;
beginif ColvoScrl=0thenbegin
Say('Кончились скроллы! Прервано!');
timer.enabled:=false;
exit;
end;
if ColvoWpn=1thenbegin
Say('Остался последний предмет! Прервано!');
timer.enabled:=false;
exit;
end;
Scrl:=GetNextScroll;
if scrl=-1thenbegin
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=''thenexit;
//****************************************************************************//социальное действие yes для начало точкиif FromClient and(ConnectName=Name)and(pck=HStr('1B 06 00 00 00'))thenbegin
CurEnchLvl:=0;
Say('Команда Старт!!!');
timer.enabled:=true;
end;
//****************************************************************************//социальное действие no для начало точкиif FromClient and(ConnectName=Name)and(pck=HStr('1B 05 00 00 00'))thenbegin
Say('Команда Стоп!!!');
timer.enabled:=false;
end;
//****************************************************************************//ItemListif FromServer and(ConnectName=Name)and(pck[1]=#$1B)then CreateItemBase; //создание базы предметов// if (ColvoWpn=0) or (ColvoScrl=0) then exit; //если нет базы итемов, скрипт дальше не пустит//****************************************************************************//если удалились предметы, стираем в базе предметов пары ObjectID - ItemIDif FromServer and(ConnectName=Name)and(pck[1]=#$27)then UpdateItemBase; //Обновление базы, если принят пакет на удаление предметаend.
При запуске скрипта вылетает табличка Access violation at address 0052B595 in module "l2phx.exe". Read of address 45453338
Последний раз редактировалось Grinch, 21.05.2008 в 16:20.
Причина: [ HIGHLIGHT="delphi" ]код[ /HIGHLIGHT ]
for i:= 0 to round(length(pck)/36) do
begin
if (pck[i*36+4+8]+pck[i*36+5+8] = hstr('25 04')) then OidHPPotion0:=pck[i*36+8]+pck[i*36+1+8]+pck[i*36+2+8]+pck[i*36+3+8];
элементарно ватсон-))..
пакет который приходит от сервера с описанием ИНВЕНТОРЯ- цикличен.. его длина зависит напрямую от кол-ва предметов в инвенторе.. в начале пакета 8 байтов отводится под описание ИД ПАКЕТА+КОЛВО ПРЕДМЕТОВ+ЕЩЕ ЧЕТА.. 8 байтов- описание.. после етих 8ми байтов следует цикличное описание каждого итема в инвенторе.. каждый итем описывается 36-ю байтами.. каждый блок описываемый айтем в инвенторе начинается с ОИД предмета.. после чего идет ИТЕМ ИД предмета.. т.е. если в инвенторе всего 1 предмет то длина пакета будет 8+36 бафйтов.. с 8-го байта там будет храниться ОБЖЕКТ ИД итема.. с 12-го будет записан его ИТЕМ ИД.. потом будет указано кол-во в стопке етих предметов.. и там еще чето то.. поетому.. если у нас 2 предмета в инвенторе 1-предмет ЦП банка второй предмет ГХП банка то наш синтаксис сработает так:
Код:
for i:= 0 to round(length(pck)/36) do
begin
if (pck[i*36+4+8]+pck[i*36+5+8] = hstr('25 04')) then OidHPPotion0:=pck[i*36+8]+pck[i*36+1+8]+pck[i*36+2+8]+pck[i*36+3+8];
для первого итема получится:
Код:
for i:= 0 to 2 do
begin
if (pck[12]+pck[13] = hstr('25 04')) then OidHPPotion0:=pck[8]+pck[9]+pck[10]+pck[11];
ну а для второго:
Код:
for i:= 0 to 2 do
begin
if (pck[12+36]+pck[13+36] = hstr('25 04')) then OidHPPotion0:=pck[8+36]+pck[9+36]+pck[10+36]+pck[11+36];
таким образом мы запоминаем из инвенторя ГХП и ЦП банки так инвентарь имеет не 2 позиции а забит до отказа то применяем то что я дал:
Код:
for i:= 0 to round(length(pck)/36) do
begin
if (pck[i*36+4+8]+pck[i*36+5+8] = hstr('25 04')) then OidHPPotion0:=pck[i*36+8]+pck[i*36+1+8]+pck[i*36+2+8]+pck[i*36+3+8];
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
Люди помогите плиз, пытался найти этот скрипт переписаный под камаель, не получилось...
При запуске скрипта вылетает табличка Access violation at address 0052B595 in module "l2phx.exe". Read of address 45453338
Ты константы под себя настраивал?
Код:
const
Name='NLObP'; // - здесь имя чара для которого запускаем скрипт!!!
Scroll=957; // 957 - ItemID Crystall Scroll Enchant Weapon (Grade D) - здесь ItemID заточки!!!
Weapon=129; // 129 - ItemID Sword of Revolution D-grade - здесь ItemID затачиваемой вещи!!!
MaxEnchLvl=20; //max уровень заточки - здесь максимальный уровень заточки
max=250; //max количество предметов в базе (инвентаре), для гнома до 250, для других - 80
PS: Не надо забывать что скрипт для С4, а в Камаэле, наверняка, пакеты отличаются, не забудь найти отличия и подправить смещения.
Ток вычисления у тебя помоему не правильные,
У тебя самого этот скрипт работатет?
я невыкладываю то что непротестировано..
я выкладываю то чем сам пользуюсь и то что работает 100%..
кстатти моё- для интерлюда..
возможно твоё для ц4..
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
Ксати, неплохо было бы бота для рыбалки приучить к автоматической конверсии бутылочек, при наличии соответствующих рецептов, фиш оил в греатер фиш оил, а греатер фиш оил в премиум фиш оил прямо во время рыбалки, чтобы экономить время.
Server *yss:
Пакет на FO -> GFO
AF A8 02 00 00
Пакет на GFO -> PFO
AF A9 02 00 00
Ксати, неплохо было бы бота для рыбалки приучить к автоматической конверсии бутылочек, при наличии соответствующих рецептов, фиш оил в греатер фиш оил, а греатер фиш оил в премиум фиш оил прямо во время рыбалки, чтобы экономить время.
Server *yss:
Пакет на FO -> GFO
AF A8 02 00 00
Пакет на GFO -> PFO
AF A9 02 00 00
to Voron вы писали 16.03.2008, 00:48 --->
ДРУЗЬЯ, частично перечитал топ.. и с ужасом обнаружил что нет нормальной реализации глотания банок ХП, ГХП, ГЦП... тот вариант что предложил МКС предполагает предварительную подготовку скрипта.. т.е. после запуска скрипта следуют самому ручками глотнуть банки в нужной последовательности..
так вот скрипт суперский! Пасиба! Есть над чем подумать 8)
вот например, бафать баферы начинют все вместе! Со стороны палево полное. Дальше нету банок мп, я например играю боевым магом, мне сешка нужна как заливка + баф. Сешка-шилка сама себе не регенит манку, те у нее есть скил инвок например, + лопала б банки мп. И вот еще я играю в связке пп+se+бд. ставлю вместо ее - бд, скрипт зависает, тода как сешка в связке с пп бегают намано. Если можно дополнить скрипт, добавить в него бд, был бы полноценный скрипт. А так нареканий нету. Вчера укокошил варовскую патьку один 8))))) Правда был под бд друга 8) Хилит, ману льет как нужно. Хотя нет, не настроить для вара лечилку. те что бы начинали лечить при 95% хп. не понял как, при варе это жизнено важно 8) (буду еще искать)
ОГРОМНОЕ ПАСИБА ЗА ТВОЙ ТРУД! ЗА ТВОЙ СКРИПТ! ОН ЛУЧШИЙ!