var
ItemBase:array[1..100] of integer;// создали массив
objectID:integer;
// при приходе пакета
begin
if FromServer and (pck[1]=#$21) and (ReadD(12)= itemID) then begin
// при условии
if условие then
// записать objectID в массив
objectID:=ReadD(8);
// как ЗАПИСАТЬ ?
// ЗАПИСЬ
//-------------------------------------------
// дальше чтение сравнение
// при условии
ЗАПИСЬ= 256// например
// выполнить что то
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать
Последний раз редактировалось TAMBIK, 15.09.2009 в 10:43.
var
ItemBase:array[1..100] ofinteger;// создали массив
objectID:integer;
i: integer; // номер ближайшего свободного элемента массиваprocedure Init; //Вызывается при включении скриптаbegin
i:=1; // скрипт только стартанул,// первый раз сохраняем objectID в первый элемент массиваend;
// при приходе пакетаbeginif FromServer and(pck[1]=#$21)and(ReadD(12)= itemID)thenbegin// при условииif условие then// записать objectID в массив
objectID:=ReadD(8);
// как ЗАПИСАТЬ ?
ItemBase[i]:= objectID; // да просто :)inc(i,1); // но при данном алгоритме обязательно нужно увеличить i на единицу// и следить за тем, чтобы i не было больше размерности массива, в нашем случае - 100\end;
end;
sendMSG(IntToStr(ItemBase[1])); // для последнего ПХ, вывод содержимого первого элемента массива в окно лога.end.
Добавлено через 5 минут
это был первый вариант, при котором каждое значение objectID записывается в следующий по порядку элемент массива.
вариант второй, при котором каждое значение objectID записывается в первый свободный элемент массива:
delphi Код:
var
ItemBase:array[1..100] ofinteger;// создали массив
objectID:integer;
i: integer;
procedure Init; //Вызывается при включении скриптаbeginend;
// при приходе пакетаbeginif FromServer and(pck[1]=#$21)and(ReadD(12)= itemID)thenbegin// при условииif условие then// записать objectID в массив
objectID:=ReadD(8);
for i:=1to100dobeginif(ItemBase[i] == 0)thenbegin// как ЗАПИСАТЬ ?
ItemBase[i]:= objectID; // да просто :)Break; // прерываем дальнейший перебор массива.end;
end;
end;
end;
sendMSG(IntToStr(ItemBase[1])); // для последнего ПХ, вывод содержимого первого элемента массива в окно лога.end.
оба варианта - не более, чем примеры.
при обеих схемах рано или поздно массив заполнится и что тогда?
а если прийдт 15 пакетов с одинаковым значеним objectID, есть ли смысл хранить 15 одинаковых значений в массиве?
думай)
Последний раз редактировалось TAMBIK, 16.09.2009 в 14:34.
Причина: Добавлено сообщение
for i=1to100dobeginif(ItemBase[i] == 256)thenbegin// например
КактоОбработатьЭтоЗначение(ItemBase[i]);
end;
end;
Добавлено через 7 минут
Но по-моему тебе нужно делать вот что:
delphi Код:
var
ItemBase:array[1..100] ofinteger;// создали массив
objectID:integer;
i: integer;
flag: boolean;
procedure Init; //Вызывается при включении скриптаbeginend;
// при приходе пакетаbeginif FromServer and(pck[1]=#$21)and(ReadD(12)= itemID)thenbegin// при условииif условие then
objectID:=ReadD(8);
flag:=false; // сбрасываем флажок// ищем objectID в массивеfor i=1to100dobeginif(ItemBase[i] = objectID)thenbegin// текущий objectID уже есть в массиве, т.е. добавлять новый не надо.// ставим флажок, который далее пропустит цикл поиска первого пустого значения и добавление в массив objectID
flag := true;
Break; // прерываем дальнейший перебор массива.end;
end;
// нужно добавить текущий objectID в массивif(flag = false)thenbegin// ищем первый свободный элемент в массивеfor i:=1to100dobeginif(ItemBase[i] = 0)thenbegin// как только нашли - на его место пишем текущий objectID
ItemBase[i]:= objectID; // да просто :)Break; // прерываем дальнейший перебор массива.end;
end;
end;
end;
end;
end.
Последний раз редактировалось TAMBIK, 16.09.2009 в 14:35.
Причина: Добавлено сообщение
Function ObjIdInArray(value:integer):integer;
var
i:integer;
begin
result := 0;
while(i < itemcount)and(itemarray[result] <> value)doinc(result);
end;
Существует ли значение в массиве (value = ObjId прочитаный с пакета. index : integer; )
delphi Код:
index := ObjIdInArray(value); //лучше поуступать так. избегая повторного запуска цикла.If index < itemcount then//значение существует. его к примеру можно удалить вот так
GetItemIdAndMove(index)//индекс мы получили вышеelse//значение не существует, добавляем
additemtoarray(value)
ну и в этом духе
Добавлено через 1 минуту
проверка на превышение -
if itemcount >= 255 then ....
__________________
L2Ext - project closed.
Последний раз редактировалось alexteam, 04.09.2009 в 20:43.
Причина: Добавлено сообщение
спасибо вот это как раз
долго лазил по форуму смотрел как сделано в других
скриптах с массивом НО так как я в школе курил ток травку в коридорах то не понял нечего
может тема пригодится другим
delphi Код: Код:
var
ItemBase:array[1..100] ofinteger;// создали массив
objectID:integer;
i: integer;
procedure Init; //Вызывается при включении скриптаbeginend;
// при приходе пакетаbeginif FromServer and(pck[1]=#$21)and(ReadD(12)= itemID)thenbegin// при условииif условие then// записать objectID в массив
objectID:=ReadD(8);
for i:=1to100dobeginif(ItemBase[i] == 0)thenbegin// как ЗАПИСАТЬ ?
ItemBase[i]:= objectID; // да просто :)Break; // прерываем дальнейший перебор массива.end;
end;
end;
end;
мне не надо следить за количеством записаных objectID
и не надо следить за количеством вещей
поэтому как дополнить скрипт
тем что сказал alexteam
просьба при совете использовать значения из скрипта выше
delphi Код: Код:
Function ObjIdInArray(value:integer):integer;
var
i:integer;
begin
result := 0;
while(i < itemcount)and(itemarray[result] <> value)doinc(result);
end;
delphi Код: Код:
index := ObjIdInArray(value); //лучше поуступать так. избегая повторного запуска цикла.If index < itemcount then//значение существует. его к примеру можно удалить вот так
GetItemIdAndMove(index)//индекс мы получили вышеelse//значение не существует, добавляем
additemtoarray(value)
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать
Последний раз редактировалось TAMBIK, 09.12.2009 в 17:28.
Причина: Добавлено сообщение
var
itemcount:integer;
itemarray:array[0..255] ofinteger;
Function GetItemIdAndMove(index:integer):integer;
var
i:integer;
begin
result := 0;
if index >= itemcount thenexit;
result := itemarray[index];
i := index;
while i < itemcount -1dobegin
itemarray[i] := itemarray[i+1];
inc(i);
end;
itemarray[i] := 0;
dec(itemcount);
end;
procedure additemtoarray(itemobjid:integer);
begin
itemarray[itemcount] := itemobjid;
inc(itemcount);
end;
Function ObjIdInArray(value:integer):integer;
var
i:integer;
begin
result := 0;
while(i < itemcount)and(itemarray[result] <> value)doinc(result);
end;
procedure Init; //Вызывается при включении скриптаbegin
itemcount := 0;
end;
procedure Free; //Вызывается при выключении скриптаbeginend;
//основная часть скрипта//вызывается при приходе каждого пакета если скрипт включенbeginif FromServer
and(pck[1]=#$21)and(ReadD(12)= itemID)thenbegin
objectID := ReadD(8);
if ObjIdInArray(objectID) < itemcount thenbegin// если вещь в массиве естьendelsebegin// если вещи в массиве нет - добавляем.
additemtoarray(objectID);
end;
if itemcount = 255then//Если массив вот вот лопнет - удаляем самую "старую" шмотку с аррая.
GetItemIdAndMove(0);
end;
end.
__________________
L2Ext - project closed.
Последний раз редактировалось alexteam, 05.09.2009 в 23:19.
За это сообщение alexteam нажился 2 спасибками от:
как сосчитать в массиве предметы с определеными данными?
и как сравнить значения ?
1.sumitemID=сосчитать всего предметов в массиве с одиноковым itemID
2.sumMaxlvl=сосчитать предметов в массиве с одиноковым itemID и уровнем заточки Maxlvl
3. при равенстве значений sumMaxlv и sumitemID
выполнить: действие например STOP
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать
Последний раз редактировалось TAMBIK, 16.09.2009 в 11:15.
constmax=80;
itemID=142;
Maxlvl=10;
var
BaseItems:array[1..max,1..10] ofinteger;
Amount:integer;
enchantLevel:integer;
sumitemID:integer;
sumMaxlvl:integer;
sumitemIDOID:integer;
sumMaxlvlOID:integer;
//................... procedure ItemList;
var
i, j, k: integer;
ListSize: integer;
begin
j:=4;
ListSize:=ReadH(j);
for i:=1to ListSize doif(i<=ListSize)thenbegin
BaseItems[i,1]:=ReadH(j);
BaseItems[i,2]:=ReadD(j);
BaseItems[i,3]:=ReadD(j); //ItemID
BaseItems[i,4]:=ReadD(j);
BaseItems[i,5]:=ReadD(j); //Amount:
j:=j+4;
BaseItems[i,6]:=ReadH(j);
BaseItems[i,7]:=ReadH(j);
BaseItems[i,8]:=ReadH(j);
BaseItems[i,9]:=ReadD(j);
BaseItems[i,10]:=ReadH(j);//EnchantLevelinc(j,30);// ФИНАЛ endelsefor k:=1to10do BaseItems[i,k]:=0;
sumitemIDOID:=GetsumitemID(itemID);// сколько предметовend;
// СЧИТАЕМ ПРЕДМЕТЫ //................... procedure Resultenchant;
begin
sumMaxlvlOID:=GetsumMaxlvl(itemID,Maxlvl);// сколько предметов с itemID и Maxlvl=10end;
// сколько предметов с itemID//-------------------function GetsumitemID(itemID:integer) : integer;
var
i : integer;
beginfor i:=1tomaxdoif(BaseItems[i,3]=itemID)thenbegin
Amount:=BaseItems[i,5];
sumitemID:=sumitemID+ BaseItems[i,5];
//<<<<<=== ЧТО ТО НАДО end;
end;
// сколько предметов с itemID и Maxlvl=10//---------------------function GetsumMaxlvl(itemID,Maxlvl:integer) : integer;
var
i : integer;
beginfor i:=1tomaxdoif(BaseItems[i,3]=itemID)and(BaseItems[i,10]=Maxlvl)thenbegin
enchantLevel:=BaseItems[i,10];
sumMaxlvl:=sumMaxlvl+BaseItems[i,5];
//<<<<<=== ЧТО ТО НАДО end;
end;
// при равенстве предметов с itemID и предметов сitemID и Maxlvl=10//---------------------//<<<<<=== ЧТО ТО НАДО
//========================
далее не важно
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать
Последний раз редактировалось TAMBIK, 16.09.2009 в 18:46.