PDA

Просмотр полной версии : Помогите разобраться со скриптом кристаллизации


tenary
31.05.2010, 14:23
Разрабатываю скрипт кристаллизации... и столкнулся с рядом проблем :


const
ItemID = 12098; // ItemID шмотки
MyName='Gaubica'; //<-- пишем ник своего чара
InventorySize = 100; //<-- количество ячеек в рюкзаке
//InventoryOffset = 22; //<-- смещение для листа инвентаря, если у вас не определяет инвентарь поменяйте на 26 или какое там на вашем ГФШ

//----------------------------------------------------------------
var
ItemBase: array of Int64;
Crystal: boolean;
BaseItems : array[1..InventorySize,1..22] of Int64;
x:longint;
//----------------------------------------------------------------
procedure Init; //Вызывается при включении скрипта
var
i,k: Int64;
begin
for i:=1 to InventorySize do for k:=1 to 22 do BaseItems[i,k]:=0;
Crystal:=false;
SendMsg1('Начало инициализации скрипта, откройте инвентарь');
end;
//-----------------------------------------------------------------
procedure Free; //Вызывается при выключении скрипта
begin
break;
end;
//------------------------------------------------------------------
procedure SendMsg1(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClientEx('Gaubica');
end;


procedure ItemList;
var
i, j, k: Int64;
ListSize: Int64;
begin
j:=4; //пропускаем дo ListSize
ListSize:=ReadH(j);
//SendMsg1('--'+inttostr(ListSize));
for i:=1 to ListSize do
if (i<=ListSize) then
begin
BaseItems[i,1]:=ReadH(j); //ItemType1
BaseItems[i,2]:=ReadD(j); //ObjectID
BaseItems[i,3]:=ReadD(j); //ItemID
BaseItems[i,4]:=ReadD(j); //LocationSlot
BaseItems[i,5]:=ReadQ(j); //Amount:
BaseItems[i,6]:=ReadH(j); //ItemType2
BaseItems[i,7]:=ReadH(j); //CustomType1
BaseItems[i,8]:=ReadH(j); //isEquipped:
BaseItems[i,9]:=ReadD(j); //BodyPart
BaseItems[i,10]:=ReadH(j); //EnchantLevel
BaseItems[i,11]:=ReadH(j); //CustType2
BaseItems[i,12]:=ReadD(j); //AugmentationID
BaseItems[i,13]:=ReadD(j); //mana
BaseItems[i,14]:=ReadH(j); //attackelement
BaseItems[i,15]:=ReadH(j); //attackelementpower
BaseItems[i,16]:=ReadH(j); //firedefelementpower
BaseItems[i,17]:=ReadH(j); //waterdefelementpower
BaseItems[i,18]:=ReadH(j); //winddefelementpower
BaseItems[i,19]:=ReadH(j); //earthdefelementpower
BaseItems[i,20]:=ReadH(j); //holydefelementpower
BaseItems[i,21]:=ReadH(j); //unholydefelementpower
BaseItems[i,22]:=ReadD(j); //remindingtime

end;

end;

tenary
31.05.2010, 14:24
procedure InventoryUpdate; //пакет 21, Создает базу ObjectID по ItemID
var
i, ii, j, k, ListCount, UpdType : Int64;
ItemType1, ObjectID, ItemID, LocationSlot, Count, ItemType2, CustomType1,
isEquipped, BodyPart, EnchantLevel, CustType2, AugmentationID,mana,attackelement,
attackelementpower,firedef,waterdef,winddef,earthd ef,holydef,unholydef,remtime :Int64;
begin
ListCount:=ReadH(2); //количество итемов
j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
for i:=1 to ListCount do
begin
UpdType :=ReadH(j);
ItemType1 :=ReadH(j);
ObjectID :=ReadD(j);
ItemID :=ReadD(j);
LocationSlot :=ReadD(j);
Count :=ReadQ(j);
ItemType2 :=ReadH(j);
CustomType1 :=ReadH(j);
isEquipped :=ReadH(j);
BodyPart :=ReadD(j);
EnchantLevel :=ReadH(j);
CustType2 :=ReadH(j);
AugmentationID:=ReadD(j);
mana:=ReadD(j); //mana
attackelement:=ReadH(j); //attackelement
attackelementpower:=ReadH(j); //attackelementpower
firedef:=ReadH(j); //firedefelementpower
waterdef:=ReadH(j); //waterdefelementpower
winddef:=ReadH(j); //winddefelementpower
earthdef:=ReadH(j); //earthdefelementpower
holydef:=ReadH(j); //holydefelementpower
unholydef:=ReadH(j); //unholydefelementpower
remtime:=ReadD(j); //remindingtime
case UpdType of
// 1: 0; //добавлен новый предмет, игнорим
2: //изменен предмет в инвентаре
for ii:=1 to InventorySize do
begin
if (BaseItems[ii,2]=ObjectID) then
begin
BaseItems[ii,1]:=ItemType1;
BaseItems[ii,2]:=ObjectID;
BaseItems[ii,3]:=ItemID;
BaseItems[ii,4]:=LocationSlot;
BaseItems[ii,5]:=Count;
BaseItems[ii,6]:=ItemType2;
BaseItems[ii,7]:=CustomType1;
BaseItems[ii,8]:=isEquipped;
BaseItems[ii,9]:=BodyPart;
BaseItems[ii,10]:=EnchantLevel;
BaseItems[ii,11]:=CustType2;
BaseItems[ii,12]:=AugmentationID;
BaseItems[ii,13]:=mana;
BaseItems[ii,14]:=attackelement;
BaseItems[ii,15]:=attackelementpower;
BaseItems[ii,16]:=firedef;
BaseItems[ii,17]:=waterdef;
BaseItems[ii,18]:=winddef;
BaseItems[ii,19]:=earthdef;
BaseItems[ii,20]:=holydef;
BaseItems[ii,21]:=unholydef;
BaseItems[ii,22]:=remtime;
Break;
end;
end;

3: begin //удален
for ii:=1 to InventorySize do
if (BaseItems[ii,2]=ObjectID) then
begin
for k:=1 to 22 do BaseItems[ii,k]:=0;
Break;
end;
end;
end;
end;
{ReadItems;}
end;

function GetObjectId(inItemID :Int64) : Int64;
var
i : Int64;
begin
for i:=1 to 100 do
if (BaseItems[i,3]=inItemID) then begin
Result:=BaseItems[i,2];
exit;
end else
Result:=-1;
end;

procedure RequestCrystallizeItem(ObjectID: integer; Count:Int64 = 1);
begin
buf:=#$AF;
WriteD(ObjectID);
WriteQ(1);
SendToServerEx('Gaubica');
end;
//------------------------------------------------------------
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin

if FromServer and (pck[1]=#$11) then ItemList; //создание базы предметов
if FromServer and (pck[1]=#$21) and (pck[4]=#$62) then begin
InventoryUpdate; //Обновление базы, если принят пакет на удаление предмета

if Crystal and (GetObjectId(ItemID)>0) then
begin
RequestCrystallizeItem(GetObjectId(ItemID));
Delay(100);
InventoryUpdate;
Delay(100);
end
else begin
Crystal:=false;
SendMsg1('Весь шмот кристаллизован');
free;
end;
end;
if FromServer and (pck[1]=#$27) then
begin
SendMsg1('Панеслася!!!');
if (GetObjectId(ItemID)>0) then begin
Crystal:=true;
RequestCrystallizeItem(GetObjectId(ItemID));
end else SendMsg1('Нужная шмотка не найдена');
end;
end.


вопрос в 6 посте:)

Xen
31.05.2010, 15:03
тут (http://l2phx.pp.ru/arhive/l2ph_help/)

tenary
31.05.2010, 16:34
Прочитал про эти функции.. но все равно не понимаю этот кусок алгоритма...
И все же что может означать спам пакетов с сервера в чат : "ERR : NO TRADE!" ?

Breadfan
31.05.2010, 17:15
скорее всего у тебя неверное считывание количества итемов, в одном месте у тебя стоит
BaseItems[i,5]:=ReadD(j); //Amount:
j:=j+4; ------------ считывается qword\можно кстати заменить сразу на =ReadQ(j);

а в блоке апдейта уже просто
Count:=ReadD(j);
определи как верно для твоего сервера будет и переделай

tenary
31.05.2010, 22:31
Наконецто разобрался... рад безумно:) правильно считываю список, выбираю нужный ObjectId по ItemID, но теперь новая проблемма..

когда выполняю эту процедуру:
procedure RequestCrystallizeItem(ObjectID: integer; Count:Int64 = 1);
begin
buf:=#$2F;
WriteD(ObjectID);
WriteQ(Count);
SendToServerEx('Gaubica');

он отправляет пакет:
Tип: 0x2F (RequestCrystallizeItem)
Pазмер: 13+2
Время прихода: 21:04:44:468
0002 d ObjectID: 1081447975 (0x40759627)
0006 q Count: 1
но через некоторое время приходит системное сообшение : У Вас нет прав, чтобы сделать это.

Подскажите пожалуйста в чем проблема?

Добавлено через 3 часа 22 минуты
Посмотрел вручную пакет для кристализации.. и был неприятно удивлен.. в первый раз это было 0xC6 после двух успешных кристаллизаций вылетел из игры... захожу.. смотрю снова он уже стал 0x3A снова получил вылет из игры.. в третий раз уже 0xAF ... поясните пожалуйста нубу как преодолеть данную проблемму?

Вручную кристаллизую шмотку.. смотрю пакет.. далее вставляю в скрипт и запускаю... первая кристаллизация проходит успешно.. но последующее не воспринимаются. при повторном запуске вылетаю из игры...


Например вручную отправляю на сервер 99 49 F4 59 40 01 00 00 00 00 00 00 00 через некоторое время отправляется само по себе несколько пакетов на сервер B1 хх хх хх хх хх 00 00 00 00 14 00 00. :(

QaK
06.06.2010, 00:31
tenary, введена доп.шифрация, нужно писать свою newxor.dll, ну это так ... предположение ... остальные пакеты ИДшники не меняют через некоторое кол-во одинаковых пакетов?

tenary
07.06.2010, 23:17
нет, не меняются, про newxor.dll тоже думал уже.. читаю тему про дешифрации трафика)

QaK
13.06.2010, 19:54
tenary, попробуй поставить галку "обход смены ХОР ключа"

Satoshi Hojo
30.12.2011, 06:23
Помогите модернизировать скрипт для фреи. Я пока плохо разбираюсь, вопщем вот что получилось подскажите где накосячил...
const
ItemID = 890; // ItemID шмотки
MyName='Ответ'; //<-- пишем ник своего чара
InventorySize = 100; //<-- количество ячеек в рюкзаке
//InventoryOffset = 22; //<-- смещение для листа инвентаря, если у вас не определяет инвентарь поменяйте на 26 или какое там на вашем ГФШ

//----------------------------------------------------------------
var
ItemBase: array of Int64;
Crystal: boolean;
BaseItems : array[1..InventorySize,1..22] of Int64;
x:longint;
//----------------------------------------------------------------
procedure Init; //Вызывается при включении скрипта
var
i,k: Int64;
begin
for i:=1 to InventorySize do for k:=1 to 22 do BaseItems[i,k]:=0;
Crystal:=false;
SendMsg1('Начало инициализации скрипта, откройте инвентарь');
end;
//-----------------------------------------------------------------
procedure Free; //Вызывается при выключении скрипта
begin
break;
end;
//------------------------------------------------------------------
procedure SendMsg1(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClientEx('Ответ');
end;


procedure ItemList;
var
i, j, k: Int64;
ListSize: Int64;
begin
j:=4; //пропускаем дo ListSize
ListSize:=ReadH(j);
//SendMsg1('--'+inttostr(ListSize));
for i:=1 to ListSize do
if (i<=ListSize) then
begin
BaseItems[i,1]:=ReadD(j); //ObjectID
BaseItems[i,2]:=ReadD(j); //ItemID
BaseItems[i,3]:=ReadD(j); //LocationSlot
BaseItems[i,4]:=ReadQ(j); //Amount:
BaseItems[i,5]:=ReadH(j); //ItemType2
BaseItems[i,6]:=ReadH(j); //CustomType1
BaseItems[i,7]:=ReadH(j); //isEquipped:
BaseItems[i,8]:=ReadD(j); //BodyPart
BaseItems[i,9]:=ReadH(j); //EnchantLevel
BaseItems[i,10]:=ReadH(j); //CustType2
BaseItems[i,11]:=ReadD(j); //AugmentationID
BaseItems[i,12]:=ReadD(j); //mana
BaseItems[i,13]:=ReadH(j); //attackelement
BaseItems[i,14]:=ReadH(j); //attackelementpower
BaseItems[i,15]:=ReadH(j); //FreyaUnknown1
BaseItems[i,16]:=ReadH(j); //firedefelementpower
BaseItems[i,17]:=ReadH(j); //waterdefelementpower
BaseItems[i,18]:=ReadH(j); //winddefelementpower
BaseItems[i,19]:=ReadH(j); //earthdefelementpower
BaseItems[i,20]:=ReadH(j); //holydefelementpower
BaseItems[i,21]:=ReadH(j); //unholydefelementpower
BaseItems[i,22]:=ReadD(j); //remindingtime
BaseItems[i,23]:=ReadD(j); //FreyaUnknown2
BaseItems[i,24]:=ReadH(j); //FreyaUnknown3

end;

end;
procedure InventoryUpdate; //пакет 21, Создает базу ObjectID по ItemID
var
i, ii, j, k, ListCount, UpdType : Int64;
ItemType1, ObjectID, ItemID, LocationSlot, Count, ItemType2, CustomType1,
isEquipped, BodyPart, EnchantLevel, CustType2, AugmentationID,mana,attackelement,
attackelementpower,fu1,firedef,waterdef,winddef,ea rthdef,holydef,unholydef,remtime,fu2,fu3 :Int64;
begin
ListCount:=ReadH(2); //количество итемов
j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
for i:=1 to ListCount do
begin
UpdType :=ReadH(j);
ItemType1 :=ReadH(j);
ObjectID :=ReadD(j);
ItemID :=ReadD(j);
LocationSlot :=ReadD(j);
Count :=ReadQ(j);
ItemType2 :=ReadH(j);
CustomType1 :=ReadH(j);
isEquipped :=ReadH(j);
BodyPart :=ReadD(j);
EnchantLevel :=ReadH(j);
CustType2 :=ReadH(j);
AugmentationID:=ReadD(j);
mana:=ReadD(j); //mana
attackelement:=ReadH(j); //attackelement
attackelementpower:=ReadH(j); //attackelementpower
fu1:=ReadH(j); //FreyaUnknown1
firedef:=ReadH(j); //firedefelementpower
waterdef:=ReadH(j); //waterdefelementpower
winddef:=ReadH(j); //winddefelementpower
earthdef:=ReadH(j); //earthdefelementpower
holydef:=ReadH(j); //holydefelementpower
unholydef:=ReadH(j); //unholydefelementpower
remtime:=ReadD(j); //remindingtime
fu2:=ReadD(j); //FreyaUnknown2
fu3:=ReadH(j); //FreyaUnknown3
case UpdType of
// 1: 0; //добавлен новый предмет, игнорим
2: //изменен предмет в инвентаре
for ii:=1 to InventorySize do
begin
if (BaseItems[ii,1]=ObjectID) then
begin
BaseItems[ii,1]:=ObjectID;
BaseItems[ii,2]:=ItemID;
BaseItems[ii,3]:=LocationSlot;
BaseItems[ii,4]:=Count;
BaseItems[ii,5]:=ItemType2;
BaseItems[ii,6]:=CustomType1;
BaseItems[ii,7]:=isEquipped;
BaseItems[ii,8]:=BodyPart;
BaseItems[ii,9]:=EnchantLevel;
BaseItems[ii,10]:=CustType2;
BaseItems[ii,11]:=AugmentationID;
BaseItems[ii,12]:=mana;
BaseItems[ii,13]:=attackelement;
BaseItems[ii,14]:=attackelementpower;
BaseItems[ii,15]:=fu1;
BaseItems[ii,16]:=firedef;
BaseItems[ii,17]:=waterdef;
BaseItems[ii,18]:=winddef;
BaseItems[ii,19]:=earthdef;
BaseItems[ii,20]:=holydef;
BaseItems[ii,21]:=unholydef;
BaseItems[ii,22]:=remtime;
BaseItems[ii,23]:=fu2;
BaseItems[ii,24]:=fu3;
Break;
end;
end;

3: begin //удален
for ii:=1 to InventorySize do
if (BaseItems[ii,1]=ObjectID) then
begin
for k:=1 to 22 do BaseItems[ii,k]:=0;
Break;
end;
end;
end;
end;
{ReadItems;}
end;

function GetObjectId(inItemID :Int64) : Int64;
var
i : Int64;
begin
for i:=1 to 100 do
if (BaseItems[i,2]=inItemID) then begin
Result:=BaseItems[i,1];
exit;
end else
Result:=-1;
end;

procedure RequestCrystallizeItem(ObjectID: integer; Count:Int64 = 1);
begin
buf:=#$2F;
WriteD(ObjectID);
WriteQ(1);
SendToServerEx('Ответ');
end;
//------------------------------------------------------------
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin

if FromServer and (pck[1]=#$11) then ItemList; //создание базы предметов
if FromServer and (pck[1]=#$21) and (pck[4]=#$62) then begin
InventoryUpdate; //Обновление базы, если принят пакет на удаление предмета

if Crystal and (GetObjectId(ItemID)>0) then
begin
RequestCrystallizeItem(GetObjectId(ItemID));
Delay(100);
InventoryUpdate;
Delay(100);
end
else begin
Crystal:=false;
SendMsg1('Весь шмот кристаллизован');
free;
end;
end;
if FromServer and (pck[1]=#$27) then
begin
SendMsg1('Панеслася!!!');
if (GetObjectId(ItemID)>0) then begin
Crystal:=true;
RequestCrystallizeItem(GetObjectId(ItemID));
end else SendMsg1('Нужная шмотка не найдена');
end;
end.