Вернуться   CoderX :: Forums > Lineage II > L2PacketHack > Скриптинг
Войти через OpenID

Скриптинг Форум посвещенный созданию скриптов для L2PacketHack

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 04.09.2009, 18:00   #1
Рыцарь
 
Аватар для TAMBIK
 
Регистрация: 03.03.2009
Сообщений: 773
Сказал Спасибо: 361
Имеет 300 спасибок в 168 сообщенях
TAMBIK на пути к лучшему
По умолчанию Работа с массивом. запись чтение

как ?
правильно сделать надо ?

пример :
Код:
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.
TAMBIK вне форума   Ответить с цитированием
Старый 04.09.2009, 18:39   #2
Пользователь
 
Регистрация: 09.06.2009
Сообщений: 73
Сказал Спасибо: 10
Имеет 10 спасибок в 9 сообщенях
klemberg пока неопределено
По умолчанию

delphi Код:
var      ItemBase:array[1..100] of integer;// создали массив      objectID:integer;      i: integer;     // номер ближайшего свободного элемента массива procedure Init; //Вызывается при включении скрипта begin      i:=1;    // скрипт только стартанул,                  // первый раз сохраняем objectID в первый элемент массива end; // при приходе пакета begin      if FromServer and (pck[1]=#$21)  and (ReadD(12)= itemID) then begin           // при условии           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] of integer;// создали массив      objectID:integer;      i: integer; procedure Init; //Вызывается при включении скрипта begin end; // при приходе пакета begin      if FromServer and (pck[1]=#$21)  and (ReadD(12)= itemID) then begin           // при условии           if  условие then                // записать  objectID в массив                objectID:=ReadD(8);                for i:=1 to 100 do begin                     if (ItemBase[i] == 0) then begin                                              // как  ЗАПИСАТЬ ?                          ItemBase[i]:= objectID;  // да просто :)                          Break// прерываем дальнейший перебор массива.                     end;                end;           end;      end;      sendMSG(IntToStr(ItemBase[1]));    // для последнего ПХ, вывод содержимого первого элемента массива в окно лога. end.

оба варианта - не более, чем примеры.
при обеих схемах рано или поздно массив заполнится и что тогда?

а если прийдт 15 пакетов с одинаковым значеним objectID, есть ли смысл хранить 15 одинаковых значений в массиве?

думай)

Последний раз редактировалось TAMBIK, 16.09.2009 в 14:34. Причина: Добавлено сообщение
klemberg вне форума   Ответить с цитированием
За это сообщение klemberg нажился спасибкой от:
Старый 04.09.2009, 19:37   #3
Рыцарь
 
Аватар для TAMBIK
 
Регистрация: 03.03.2009
Сообщений: 773
Сказал Спасибо: 361
Имеет 300 спасибок в 168 сообщенях
TAMBIK на пути к лучшему
По умолчанию

Код:
а если прийдт 15 пакетов с одинаковым значеним objectID, есть ли смысл хранить 15 одинаковых значений в массиве?
как одинаковых есть условие
Код:
 if  условие then
ток одно значение objectID будит записоваться в массив
а как дальше
Код:
//-------------------------------------------
// дальше чтение сравнение
//  при условии 
  ЗАПИСЬ= 256//  например
 // выполнить что то
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать
TAMBIK вне форума   Ответить с цитированием
Старый 04.09.2009, 19:47   #4
Пользователь
 
Регистрация: 09.06.2009
Сообщений: 73
Сказал Спасибо: 10
Имеет 10 спасибок в 9 сообщенях
klemberg пока неопределено
По умолчанию

delphi Код:
for i=1 to 100 do begin                     if (ItemBase[i] == 256) then begin  // например                          КактоОбработатьЭтоЗначение(ItemBase[i]);                     end; end;

Добавлено через 7 минут
Но по-моему тебе нужно делать вот что:

delphi Код:
var      ItemBase:array[1..100] of integer;// создали массив      objectID:integer;      i: integer;      flag: boolean; procedure Init; //Вызывается при включении скрипта begin end; // при приходе пакета begin      if FromServer and (pck[1]=#$21)  and (ReadD(12)= itemID) then begin           // при условии           if  условие then                objectID:=ReadD(8);                flag:=false; // сбрасываем флажок                // ищем objectID в массиве                for i=1 to 100 do begin                     if (ItemBase[i] = objectID) then begin                          // текущий objectID уже есть в массиве, т.е. добавлять новый не надо.                          // ставим флажок, который далее пропустит цикл поиска первого пустого значения и добавление в массив objectID                          flag := true;                          Break// прерываем дальнейший перебор массива.                     end;                end;                // нужно добавить текущий objectID в массив                if (flag = false) then begin                      // ищем первый свободный элемент в массиве                      for i:=1 to 100 do begin                          if (ItemBase[i] = 0) then begin                               // как только нашли - на его место пишем текущий objectID                               ItemBase[i]:= objectID;  // да просто :)                               Break// прерываем дальнейший перебор массива.                          end;                      end;                end;           end;      end; end.

Последний раз редактировалось TAMBIK, 16.09.2009 в 14:35. Причина: Добавлено сообщение
klemberg вне форума   Ответить с цитированием
За это сообщение klemberg нажился спасибкой от:
Старый 04.09.2009, 19:54   #5
Пользователь
 
Регистрация: 09.06.2009
Сообщений: 73
Сказал Спасибо: 10
Имеет 10 спасибок в 9 сообщенях
klemberg пока неопределено
По умолчанию

дык, какой вопрос - таков и ответ
попробуем иначе:
Код:
//-------------------------------------------
// дальше чтение сравнение
//  при условии 
  ЗАПИСЬ= 256//  например
 // выполнить что то

delphi Код:
// дальше чтение сравнение // запускаем перебор всех значений массива for i=1 to 100 do begin    //  при условии ЗАПИСЬ= 256//  например    if (ItemBase[i] == 256) then begin  // например         // выполнить что то   end; end;

А если так?
klemberg вне форума   Ответить с цитированием
За это сообщение klemberg нажился спасибкой от:
Старый 04.09.2009, 20:43   #6
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

plugin_demo4 не в помощь ?

Добавлено через 7 минут
кстати... гдето я кидал 2 процедурки сторящие и удаляющие элементы в массиве со смещением...

Добавлено через 8 минут
во. нашел.
http://coderx.ru/showpost.php?p=35707&postcount=787
добавить еще такую функцию
delphi Код:
Function ObjIdInArray(value:integer):integer; var  i:integer; begin   result := 0;   while (i < itemcount) and (itemarray[result] <> value) do inc(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. Причина: Добавлено сообщение
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился спасибкой от:
Старый 05.09.2009, 22:07   #7
Рыцарь
 
Аватар для TAMBIK
 
Регистрация: 03.03.2009
Сообщений: 773
Сказал Спасибо: 361
Имеет 300 спасибок в 168 сообщенях
TAMBIK на пути к лучшему
По умолчанию

спасибо вот это как раз
долго лазил по форуму смотрел как сделано в других
скриптах с массивом НО так как я в школе курил ток травку в коридорах то не понял нечего
может тема пригодится другим


delphi Код: Код:
var      ItemBase:array[1..100] of integer;// создали массив      objectID:integer;      i: integer; procedure Init; //Вызывается при включении скрипта begin end; // при приходе пакета begin      if FromServer and (pck[1]=#$21)  and (ReadD(12)= itemID) then begin           // при условии           if  условие then                // записать  objectID в массив                objectID:=ReadD(8);                for i:=1 to 100 do begin                     if (ItemBase[i] == 0) then begin                                             // как  ЗАПИСАТЬ ?                          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) do inc(result); end;

delphi Код: Код:
index := ObjIdInArray(value); //лучше поуступать так. избегая повторного запуска цикла. If index < itemcount then   //значение существует. его к примеру можно удалить вот так   GetItemIdAndMove(index) //индекс мы получили выше else   //значение не существует, добавляем   additemtoarray(value)
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать

Последний раз редактировалось TAMBIK, 09.12.2009 в 17:28. Причина: Добавлено сообщение
TAMBIK вне форума   Ответить с цитированием
Старый 05.09.2009, 23:16   #8
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

Что ау ?

delphi Код:
var itemcount:integer; itemarray:array[0..255] of integer; Function GetItemIdAndMove(index:integer):integer; var  i:integer; begin   result := 0;   if index >= itemcount then exit;   result := itemarray[index];   i := index;   while i < itemcount -1 do   begin     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) do inc(result); end; procedure Init; //Вызывается при включении скрипта begin   itemcount := 0; end; procedure Free; //Вызывается при выключении скрипта begin end; //основная часть скрипта //вызывается при приходе каждого пакета если скрипт включен begin      if FromServer      and (pck[1]=#$21)       and (ReadD(12)= itemID) then      begin          objectID := ReadD(8);         if  ObjIdInArray(objectID) < itemcount then         begin // если вещь в массиве есть         end         else         begin // если вещи в массиве нет - добавляем.              additemtoarray(objectID);         end;         if itemcount = 255 then //Если массив вот вот лопнет - удаляем самую "старую" шмотку с аррая.           GetItemIdAndMove(0);      end; end.
__________________
L2Ext - project closed.

Последний раз редактировалось alexteam, 05.09.2009 в 23:19.
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился 2 спасибками от:
Старый 15.09.2009, 10:59   #9
Рыцарь
 
Аватар для TAMBIK
 
Регистрация: 03.03.2009
Сообщений: 773
Сказал Спасибо: 361
Имеет 300 спасибок в 168 сообщенях
TAMBIK на пути к лучшему
По умолчанию

как сосчитать в массиве предметы с определеными данными?
и как сравнить значения ?
1.sumitemID=сосчитать всего предметов в массиве с одиноковым itemID
2.sumMaxlvl=сосчитать предметов в массиве с одиноковым itemID и уровнем заточки Maxlvl
3. при равенстве значений sumMaxlv и sumitemID
выполнить: действие например STOP
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать

Последний раз редактировалось TAMBIK, 16.09.2009 в 11:15.
TAMBIK вне форума   Ответить с цитированием
Старый 16.09.2009, 11:30   #10
Рыцарь
 
Аватар для TAMBIK
 
Регистрация: 03.03.2009
Сообщений: 773
Сказал Спасибо: 361
Имеет 300 спасибок в 168 сообщенях
TAMBIK на пути к лучшему
По умолчанию

ДОБАВЬТЕ !!!!!!!!!!!!!!!!
delphi Код:
const   max=80;  itemID=142;  Maxlvl=10;  var  BaseItems:array[1..max,1..10] of integer;  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:=1 to ListSize do   if (i<=ListSize) then begin       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);//EnchantLevel         inc(j,30);// ФИНАЛ  end else for k:=1 to 10 do BaseItems[i,k]:=0;    sumitemIDOID:=GetsumitemID(itemID);// сколько предметов end;                      // СЧИТАЕМ ПРЕДМЕТЫ //................... procedure Resultenchant;  begin sumMaxlvlOID:=GetsumMaxlvl(itemID,Maxlvl);// сколько предметов с itemID и Maxlvl=10 end; // сколько предметов с itemID //------------------- function GetsumitemID(itemID:integer) : integer; var   i : integer; begin         for i:=1 to max do  if (BaseItems[i,3]=itemID)  then begin         Amount:=BaseItems[i,5];                   sumitemID:=sumitemID+ BaseItems[i,5];                           //<<<<<===  ЧТО ТО НАДО                        end; end; // сколько предметов с itemID и Maxlvl=10 //--------------------- function  GetsumMaxlvl(itemID,Maxlvl:integer) : integer; var   i : integer; begin         for i:=1 to max do  if (BaseItems[i,3]=itemID) and (BaseItems[i,10]=Maxlvl) then begin           enchantLevel:=BaseItems[i,10];              sumMaxlvl:=sumMaxlvl+BaseItems[i,5];                             //<<<<<===  ЧТО ТО НАДО  end; end; //  при равенстве предметов с itemID и предметов сitemID и Maxlvl=10 //---------------------                              //<<<<<===  ЧТО ТО НАДО  
//========================
далее не важно
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать

Последний раз редактировалось TAMBIK, 16.09.2009 в 18:46.
TAMBIK вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Скриптинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 09:34.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!