PS: Для того, чтобы быстро найти пакет в просмотре надо выбрать первый и быстро набрать первые 2-3 символа названия пакета, получается типа быстрый поиск первого подходящего.
Добрый день!
Я использую скрипт QaK-а с первой страницы, опечатка исправлена.
Возникает такая проблема, без изменений в скрипте я добавляю следующее:
Код:
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer then
begin if (pck[1]=#$1B) then
begin CreateItemBase;
exit;
end;
if (pck[1]=#$27) then
begin UpdateItemBase;
exit;
end;
end;
if FromClient and (pck=#$1B#06#00#00#00) then begin
useitem(356);
pck:=HStr('14 CD 01 42 10 00 00 00 00 ');
SendToServer;
say('we');
end;
end.
Выделенное фиолетовым явно не выполняется (как я понял не выдирается ОИД предмета)
Хотя если я сам нахожу ОИД предмета, например стопки зелий и составляю пакет:
pck:=HStr('14 CD 01 42 10 00 00 00 00 ');
то он проходит.
Сервер на Интерлюде. Подскажите, пожалуйста в чем моя ошибка?
Заранее спасибо.
З.Ы. полный текст скрипта:
Код:
//Инвентаризация by QaK
const
name='UltraRich';
var
ItemCount:integer; //количество занятых слотов/количество вещей
Inventory: array[1..250,1..10]of integer; //массив инвентаря
//инвентарь
//1 - ItemType1
//2 - ObjectID
//3 - ItemID
//4 - ItemCount
//5 - ItemType2
//6 - CustType1
//7 - IsEquipped
//8 - BodyPart
//9 - EnchantLevel
//10 - CustType2
procedure Init; //Вызывается при включении скрипта
begin
end;
procedure Free; //Вызывается при выключении скрипта
begin
end;
//процедура считывания параметров одного предмета
procedure ItemAction(var Counter:integer;CurrentSlot:integer);
//Counter - Позиция считываемая из пакета, модифицируется функциями ReadC,ReadD
//CurrentSlot - Индекс в массиве Inventory (от 1 до 250)
var c1:integer;
begin
for c1:=1 to 10 do
begin //Если значение однобайтное
if (c1=1)or(c1=5)or(c1=6)or(c1=7)or(c1=9) then
begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
inc(Counter);
end;
//Если значение четырехбайтное
if (c1=2)or(c1=3)or(c1=4)or(c1=8) then
begin Inventory[CurrentSlot,c1]:=ReadD(Counter);
end;
//Если значение последнее
if c1=10 then
begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
Counter:=Counter+2;
end;
end;
end;
//Пакет от сервера 1В - создаем или модифицируем весь инвентарь
procedure CreateItemBase;
var
i,j: integer;
begin
ItemCount:=ReadC(4);//Считываем количество вещей в инвентаре
j:=6;
for i:=1 to ItemCount do ItemAction(j,i);
end;
//Пакет от сервера 27 - действия (доавить/изменить/удалить) над одним/несколькими предметами
procedure UpdateItemBase;
var
i,ij,ijk:integer; //простые счетчики для перебора значений
j:integer; //Текущая позиция, откуда считываем значения из пакета
count:integer; //Количество изменяемых предметов
Action: integer; //Действие над предметом
k:boolean; //Нашли ли мы удаляемый предмет?
begin
k:=false;
count:=ReadC(1);//Считываем количество изменяемых предметов
j:=4;
for i:=1 to count do
begin Action:=ReadC(j);//Считываем действие
inc(j);
{ADD} if Action=1 then
begin Inc(ItemCount);//Увеличиваем количество занятых слотов
ItemAction(j,ItemCount); //Добавляем предмет
end;
{Update}if Action=2 then for ij:=1 to ItemCount do //Ищем изменяемый предмет по ObjectID
If Inventory[ij,2]=ReadD((j-1)*30+8) then //Если нашли
begin ItemAction(j,ij); //Изменяем данные о нем
exit; //Больше проверять не надо - выходим из цикла
end;
{Delete}if Action=3 then begin for ij:=1 to ItemCount-1 do //Ищем удаляемый предмет
begin If Inventory[ijk,2]=ReadD((j-1)*30+8) then k:=true; //Если нашли,фиксируем это
If k then //если найден удаляемы объект
for ijk:=1 to 10 do //то сдвигаем элементы массива-инвентаря
Inventory[ij,ijk]:=Inventory[ij+1,ijk];
end;
Dec(ItemCount);//Уменьшаем количество занятых слотов
end;
end;
end;
//Получить ObjectID предмета, зная его ItemID
function GetInfo(ItemID:integer):integer;
var c1:integer;
begin Result:=-1;
for c1:=1 to ItemCount do
if (ItemID=Inventory[c1,3]) then
begin Result:=Inventory[c1,2];
exit;//Если нашли - выходим из цикла
end;
end;
//Использовать предмет с заданным ItemID
procedure UseItem(ItemID:integer);
var c1:integer;
begin
for c1:=1 to ItemCount do
if (ItemID=Inventory[c1,3]) then
begin buf:=#$14;
WriteD(Inventory[c1,2]);
WriteD(0);
SendToServer;
exit; //Чтоб не использовать несколько предметов с одинаковым ItemID (например заточки)
end;
end;
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer then
begin if (pck[1]=#$1B) then
begin CreateItemBase;
exit;
end;
if (pck[1]=#$27) then
begin UpdateItemBase;
exit;
end;
end;
if FromClient and (pck=#$1B#06#00#00#00) then begin
useitem(356);
pck:=HStr('14 CD 01 42 10 00 00 00 00 ');
SendToServer;
say('we');
end;
end.
Insane*, а массив заполняется инвентарём, помнится там был какой то багнутый скрипт, а если мне память не изменяет исправленный и рабочий, кроме меня и Квака ни кто не видел
QaK, методом тыка определил (взял другой скрипт), что проблема судя по всему в смещении. Как я понял, надо использовать формулу j*22+6 для определения ОИД.
Предлагаю расширенный вариант функции "Пауза". При котором можно независимо вызывать несколько пауз в разных местах скрипта.
Код:
// пауза в секундах
function Wait(var tick: integer; Timewait: Integer): Boolean;
var
t: integer;
begin
result:=false;
t:=Round(Time*86400);
if t>(tick+Timewait) then begin
if tick>0 then result:=true;
tick:=t;
end;
end;
Всем доброго времени суток.
У меня пару вопросов по скрипту "инвентаризации" от QaK. Для Gracia Part2
Код:
Код:
var
ItemCount:integer;
Inventory: array[1..75,1..22]of integer;
//процедура считывания параметров одного предмета
procedure ItemAction(var Counter:integer;CurrentSlot:integer);
var c1:integer;
begin
for c1:=1 to 22 do
begin
if (c1=1)or(c1=6)or(c1=7)or(c1=8)or(c1=11) then
begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
inc(Counter);
end;
if (c1=2)or(c1=3)or(c1=4)or(c1=5)or(c1=9)or(c1=12)or(c1=13)or(c1=14)or(c1=15)or(c1=16)or(c1=17)or(c1=18)or(c1=19)or(c1=20)or(c1=21)or(c1=22) then
begin Inventory[CurrentSlot,c1]:=ReadD(Counter);
end;
if c1=10 then
begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
Counter:=Counter+2;
end;
end;
end;
//Пакет от сервера 11 - создаем или модифицируем весь инвентарь
procedure CreateItemBase;
var
i,j: integer;
begin
ItemCount:=ReadC(4);
j:=6;
for i:=1 to ItemCount do ItemAction(j,i);
end;
//Пакет от сервера 21 - действия (доавить/изменить) над одним/несколькими предметами
procedure UpdateItemBase;
var
i,ij,ijk:integer;
j:integer;
count:integer;
Action: integer;
k:boolean;
begin
k:=false;
count:=ReadC(1);
j:=4;
for i:=1 to count do
begin Action:=ReadC(j);
inc(j);
{ADD} if Action=1 then
begin Inc(ItemCount);
ItemAction(j,ItemCount);
end;
{Update}if Action=2 then for ij:=1 to ItemCount do //Ищем изменяемый предмет по ObjectID
If Inventory[ij,2]=ReadD((j-1)*22+6) then //Если нашли
begin ItemAction(j,ij); //Изменяем данные о нем
exit; //Больше проверять не надо - выходим из цикла
end;
end;
end;
//Получить ObjectID предмета, зная его ItemID
function GetInfo(ItemID:integer):integer;
var c1:integer;
begin Result:=-1;
for c1:=1 to ItemCount do
if (ItemID=Inventory[c1,3]) then
begin Result:=Inventory[c1,2];
exit;//Если нашли - выходим из цикла
end;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer then
begin if (pck[1]=#$11) then
begin CreateItemBase;
exit;
end;
if (pck[1]=#$21) then
begin UpdateItemBase;
exit;
end;
end;
end.
Так вот.... мне интерессно почему:
1. В оригинале скрипта:
Код:
if (c1=1)or(c1=5)or(c1=6)or(c1=7)or(c1=9) then
begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
преобразовывается в ReadC, когда в самом описании пакета идет h.
2. Для чего введена переменная "j" в procedure CreateItemBase; и procedure UpdateItemBase; и какие значения она может принимать?
3. Где задаются значения переменных для {ADD} item-а ( все его 22 параметра) т.е Для создания нового предмета мне нужно "сказать" ObjID=XXXX, ItemID=XXX и т.д Где это делается.
Как я думаю нужно создать форму с инпут параметрами, которые будут принимать вводимые мною значения и что-то типа чекбокса для выполнения действий (Action=1 и Action=2) ну и кнопку чтоб запустить нужные продцедуры. Если мои предположения верны не могли бы вы
подкинуть заготовку такой лио похожей формы.
Спасибо.
И еще 1 вопрос. Получается этот скрипт работает с инвентарем на стороне клиента.
тоесть если мы добавим/редактируем свойство item-a то это изменение произойдет только на клиентской стороне, а при повторном запросе клиентом серверу о содержимом его инвентаря, он вернет значения из БД, так как будет "тягать" данные из своей БД. В соответсвии с этим у меня вопросс: Какой смысл использования этого скрипта? =)
Последний раз редактировалось alexPPP, 30.04.2009 в 09:27.
преобразовывается в ReadC, когда в самом описании пакета идет h.
потому, что скрипт писался очень давно, не помню под какие хроники, и там я смотрел, что второй байтик всегда = 0, поэтому читал 1 байт и усё=)
2)
Цитата:
Сообщение от alexPPP
Для чего введена переменная "j" в procedure CreateItemBase; и procedure UpdateItemBase; и какие значения она может принимать?
Переменная J в CreateItemBase введена, чтоб по пакету полностью пройтись, т.к. поцедура ItemAction модифицирует значение переменной J, аналогично для UpdateItemBase.
3)
Цитата:
Сообщение от alexPPP
Где задаются значения переменных для {ADD} item-а ( все его 22 параметра) т.е Для создания нового предмета мне нужно "сказать" ObjID=XXXX, ItemID=XXX и т.д Где это делается.
Как я думаю нужно создать форму с инпут параметрами, которые будут принимать вводимые мною значения и что-то типа чекбокса для выполнения действий (Action=1 и Action=2) ну и кнопку чтоб запустить нужные продцедуры. Если мои предположения верны не могли бы вы
подкинуть заготовку такой лио похожей формы.
Значения переменных читаются из приходящего от сервера пакета. А то, что ты хочешь подменить ИД предмета называтся читерством, что очень сильно не есть гуд, это не чит-форум.
З.Ы. Скрипт глючный, сразы говорю, я его вроде не до конца профиксил. Возьми обработку инвентаря из скрипта Бот кач by Alexus или как-то так.
З.Ы.Ы. для грации нужно еще редактировать разборку пакетов и ИД пакетов для обработки.