Перейти к содержанию
LineaAge II Forum L2Corvet

Повтор окнами


Hy6ac

Рекомендуемые сообщения

Братва у кого то есть рабочий скрипт «повтор окнами за основой « а то этот ругается 

или кто то может этот исправить ,помогите !

 

 

const
  DialogRepeatEnable: boolean = true; // повтор диалогов, true(да) / false(нет)
  // список ников персонажей, которые должны повторять за основным окном
  DialogRepeatPlayerList: array of string = ['Krickt1338', 'Krickt1339', 'Vasya'];
  OpcodeStr = '23';  // для Interlude заменить на '21'
  OpcodeHex = $23;   // для Interlude заменить на $21

procedure OnCliPacket(ID1, ID2: Cardinal; Data: Pointer; Size: Word);   // обработчик исходящих пакетов (C->S)
begin
  if (DialogRepeatEnable) and (ID1 = OpcodeHex) then   // если повтор включен, и id пакета совпадает с выбором диалога, то
    DialogRepeat(MemToHex(Data^, Size));               // вызываем функцию, которая повторит выбор диалога указанным окнам
end;

procedure DialogRepeat(PacketData: string);
var 
  E: TL2Control;
  i: integer;
begin
  for i:= 0 to Length(DialogRepeatPlayerList)-1 do begin         // проходим по списку чаров, которыми нужно повторять диалоги
    E:= nil;
    E:= GetControl(DialogRepeatPlayerList[i]);                   // получаем Engine нужного окна
    if (E <> nil) then E.SendToServer(OpcodeStr + PacketData);   // если Engine получен, то отправляем пакет выбора диалога
  end;
end;

procedure DialogOpen(E: TL2Control);    // берет в таргет и открывает диалог с нужным NPC другим окном
begin
  E.SetTarget(User.Target.ID);
  E.DlgOpen;
end;

procedure DialogOpenThread();           // основной поток, выполняющий всю логику
var
  p1, p2: integer;
  i: integer;
  E: TL2Control;
  LastTargetID: cardinal;               // тут мы храним ID последнего нашего таргета
  LastDlgText: string;                  // тут будет храниться текст последнего диалога
begin
  Engine.SendActID(1);                        // активируем перехват C->S пакетов 
  while (true) do begin                       // запускаем бесконечный цикл
    Engine.WaitAction([laDlg], p1, p2);       // ждем события "открытие диалога"
    while (User.Target.ID = LastTargetID) and (Engine.DlgText <> LastDlgText) do delay(10);
    for i:= 0 to Length(DialogRepeatPlayerList)-1 do begin   // для каждого ника из списка персонажей
      E:= nil;
      E:= GetControl(DialogRepeatPlayerList[i]);             // получаем его Engine
      if (E <> nil) then                                     // и если Engine получен, то 
        Script.NewThread(@DialogOpen(E));                    // запускаем для его поток, который откроет диалог с нужным NPC
    end;
    LastTargetID:= User.Target.ID;                           // перезаписываем ID последнего цели
    LastDlgText:= Engine.DlgText;                            // и текст последнего диалога
  end;
end;

begin
  if (DialogRepeatEnable) then              // если повтор включен, то
    Script.NewThread(@DialogOpenThread);    // запускаем поток, который будет делать все необходимое

  // code ...    
    
  Delay(-1);
end.
Ссылка на комментарий
Поделиться на другие сайты

я тоже скок искал запарился никто не выложит за так,щя зайдет очередной гуру с чсв оставит комент по тиму С-стабильность и на этом все

Ссылка на комментарий
Поделиться на другие сайты

Как и обещал вот скрипт. На интерлюдии работал отлично на ХФ Тестите сами.

Спойлер

// Управление пати через пати-чат
// ------------------------------------
// доступные команды:
// tp X - где X номер пункта тп у гейткипера. Берем в таргет ГК, смотрим номер строки куда надо полететь, пишем например tp 3. работает так же на других нпц, нужно указать номер пункта в окне диалога.
// gate - если скрипт запущен у варка - заюзает gate chant
// start - Активирует чаров
// stop - Дактивирует чаров. Если включены Arcane Power или Arcane Wisdom, то они будут отключены
// follow - привяжутся за написавшим. желательно делать stop перед юзом этой команды
// soe - все юзнут /unstuck
// aa - кол-во старых аден в пч
// df - кол-во дф в пч
// ls - кол-во 76 топ лс в пч
// stat - кол-во сосок, мп, спирта в пч
// rec - рекомендуют того кто написал команду
// as - возьмут ассист и откроют диалог с нпц
// dance/bow/vic - веселуха


uses sysutils,classes;

var myChars: TStringList;
var remoteControl: TL2Control;
var remoteControlCheck: TL2Control;
var UserCustom: TL2User;
var UserCustomTemp: TL2Control;
var Buff: TL2Buff;
var obj:TL2Effect;
i: integer;
var soski: string;

procedure Split(Delimiter: Char; Str: string; ListOfStrings: TStrings) ;
begin
   ListOfStrings.Clear;
   ListOfStrings.Delimiter       := Delimiter;
   ListOfStrings.StrictDelimiter := True;
   ListOfStrings.DelimitedText   := Str;
end;

function ContainsBeforeEnd(const str, substr: string): Boolean;
var
  P: Integer;
begin
  P := Pos(substr, str);
  if P = 0 then
    Result := False
  else
    Result := P + Length(substr) - 1 <> Length(str);
end;

var
  List: TStrings;

function CheckItemCount (const userID: string; const itemID: Integer) : Integer;
var tempItem: TL2Item;
begin
    if Assigned(remoteControl) then begin
      GetControl(userID).GetInventory.User.ByID(itemID, tempItem);
      Result := tempItem.Count;
    end;
end;

function CheckLoad (const userID: string) : Cardinal;
var tempItem: TL2Item;
begin
    if Assigned(remoteControl) then begin
      GetControl(userID).GetUser.Load();
      Result := tempItem.Count;
    end;
end;

 

begin
  myChars := TStringList.Create;
  myChars.add('noname');
  myChars.add('KKJ');
  myChars.add('Мелстрей');

   while Engine.Status = lsOnline do begin
      
      if (ChatMessage.ChatType = mtParty) and ChatMessage.Unread then
      begin

        // Телепорт по команде в пч. например: tp 1 отправит всех на первый пункт в списке телепортов
        if ContainsBeforeEnd(ChatMessage.Text, 'tp ') then begin
          List := TStringList.Create;
          Split(' ', ChatMessage.Text, List);
          if StrToInt(List[1]) > 0 then begin
            for i := 0 to myChars.Count - 1 do begin
                remoteControl := GetControl(myChars[i]);
                if Assigned(remoteControl) then
                    begin
                           UserCustomTemp :=  GetControl(ChatMessage.sender);
                           remoteControl.MoveTo(UserCustomTemp.GetUser.target);
                           delay(300);
                           remoteControl.SetTarget(UserCustomTemp.GetUser.target);
                           delay(100);
                           remoteControl.DlgOpen();
                           delay(100);
                           remoteControl.DlgSel('Телепорт');
                           delay(300);
                           remoteControl.DlgSel(StrToInt(List[1]));
                           remoteControl.CancelTarget;
                end;
            end;
          end;

        end;

        // если этот скрипт запущен у варка, то он кастанет Gate Chant
        if (ChatMessage.Text = 'gate') then begin
            Engine.UseSkill(1429, false);
        end;

        // Деактивация всех чаров. Если включены Arcane Power или Arcane Wisdom, то они будут отключены
        if (ChatMessage.Text = 'stop') then begin
            for i := 0 to myChars.Count - 1 do begin
                remoteControl := GetControl(myChars[i]);
                if Assigned(remoteControl) then begin
                        remoteControl.FaceControl(0,false);
                        UserCustom:= remoteControl.GetUser;
                        if UserCustom.Buffs.Byid(337,obj) then begin
                          remoteControl.UseSkill(337, false);
                        end;
                        if UserCustom.Buffs.Byid(336,obj) then begin
                          remoteControl.UseSkill(336, false);
                        end;
                end;
            end;
        end;

        // Активация всех чаров
        if (ChatMessage.Text = 'start') then begin
            for i := 0 to myChars.Count - 1 do begin
                remoteControl := GetControl(myChars[i]);
                if Assigned(remoteControl) then
                    begin
                        remoteControl.FaceControl(0,true);
                end;
            end;
        end;

        // Все чары рекомендуют написавшего в пч
        if (ChatMessage.Text = 'rec') then begin
            for i := 0 to myChars.Count - 1 do begin
                remoteControl := GetControl(myChars[i]);
                if Assigned(remoteControl) then
                    begin
                        remoteControl.EnterText('/target ' + ChatMessage.sender);
                        delay(100);
                        remoteControl.EnterText('/evaluate');
                end;
            end;
        end;

        // Чары возьмут ассист и откроют диалог с этим нпц
        if (ChatMessage.Text = 'as') then begin
            for i := 0 to myChars.Count - 1 do begin
                remoteControl := GetControl(myChars[i]);
                if Assigned(remoteControl) then
                    begin
                        UserCustomTemp :=  GetControl(ChatMessage.sender);
                           
                           remoteControl.MoveTo(UserCustomTemp.GetUser.target);
                           delay(300);
                           remoteControl.SetTarget(UserCustomTemp.GetUser.target);
                           delay(100);
                           remoteControl.DlgOpen();
                end;
            end;
        end;

        // denza-faradenza
        if (ChatMessage.Text = 'dance') then begin
            for i := 0 to myChars.Count - 1 do begin
                remoteControl := GetControl(myChars[i]);
                if Assigned(remoteControl) then
                    begin
                        remoteControl.EnterText('/socialdance');
                end;
            end;
        end;

        // челом бью
        if (ChatMessage.Text = 'bow') then begin
            for i := 0 to myChars.Count - 1 do begin
                remoteControl := GetControl(myChars[i]);
                if Assigned(remoteControl) then
                    begin
                        remoteControl.EnterText('/socialbow');
                end;
            end;
        end;

        
        if (ChatMessage.Text = 'vic') then begin
            for i := 0 to myChars.Count - 1 do begin
                remoteControl := GetControl(myChars[i]);
                if Assigned(remoteControl) then
                    begin
                        remoteControl.EnterText('/socialvictory');
                end;
            end;
        end;

        // привязка всех за написавшим. перед этим нужно делать stop
        if (ChatMessage.Text = 'follow') then begin
            for i := 0 to myChars.Count - 1 do begin
                remoteControl := GetControl(myChars[i]);
                if Assigned(remoteControl) then
                    begin
                        remoteControl.EnterText('/target ' + ChatMessage.sender);
                        delay(100);
                        remoteControl.EnterText('/target ' + ChatMessage.sender);
                end;
            end;
        end;

        // все сделают /unstuck
        if (ChatMessage.Text = 'soe') then begin
            for i := 0 to myChars.Count - 1 do begin
                remoteControl := GetControl(myChars[i]);
                if Assigned(remoteControl) then
                    begin
                        remoteControl.EnterText('/unstuck');
                end;
            end;
        end;

        
        // счетчик старых аден в пч
        if (ChatMessage.Text = 'aa') then begin
              for i := 0 to myChars.Count - 1 do begin
                      remoteControl := GetControl(myChars[i]);
                  if Assigned(remoteControl) then begin
                          if(CheckItemCount(myChars[i], 5575) > 0) then begin
                            soski := soski + 'AA: ' + IntToStr(CheckItemCount(myChars[i], 5575));
                          end;
                          if(CheckItemCount(myChars[i], 5575) < 1) then begin
                            soski := '>>> NO AA!!! <<<';
                          end;
                          remoteControl.Say('[ ' + soski + ' ]', 3, '');
                          soski := '';
                  end;
              end;
        end;

        // счетчик dimensional fragment
        if (ChatMessage.Text = 'df') then begin

              for i := 0 to myChars.Count - 1 do begin
                      remoteControl := GetControl(myChars[i]);
                  if Assigned(remoteControl) then begin

                          // df
                          if(CheckItemCount(myChars[i], 7079) > 0) then begin
                            soski := soski + 'DF: ' + IntToStr(CheckItemCount(myChars[i], 7079));
                          end;
                          // df
                          if(CheckItemCount(myChars[i], 7079) < 1) then begin
                            soski := '>>> NO DF!!! <<<';
                          end;
                          
                          remoteControl.Say('[ ' + soski + ' ]', 3, '');
                          soski := '';
                  end;
              end;
        end;

        // счетчик top ls 76
        if (ChatMessage.Text = 'ls') then begin

              for i := 0 to myChars.Count - 1 do begin
                      remoteControl := GetControl(myChars[i]);
                  if Assigned(remoteControl) then begin

                          // df
                          if(CheckItemCount(myChars[i], 8762) > 0) then begin
                            soski := soski + 'TOP LS 76: ' + IntToStr(CheckItemCount(myChars[i], 8762));
                          end;
                          // df
                          if(CheckItemCount(myChars[i], 8762) < 1) then begin
                            soski := 'NO LS :(';
                          end;
                          
                          remoteControl.Say('[ ' + soski + ' ]', 3, '');
                          soski := '';
                  end;
              end;
        end;

        // счетчик сосок, спирит оре, маны
        if (ChatMessage.Text = 'stat') then begin
              for i := 0 to myChars.Count - 1 do begin
                      remoteControl := GetControl(myChars[i]);
                  if Assigned(remoteControl) then begin
                          // bssc
                          if(CheckItemCount(myChars[i], 3949) > 0) then begin
                            soski := soski + ' | BSSC: ' + IntToStr(CheckItemCount(myChars[i], 3949));
                            if(CheckItemCount(myChars[i], 3949) < 100) then
                            soski := soski + ' <<<!!!';
                          end;
                          // bssa
                          if(CheckItemCount(myChars[i], 3951) > 0) then begin
                            soski := soski + ' | BSSA: ' + IntToStr(CheckItemCount(myChars[i], 3951));
                            if(CheckItemCount(myChars[i], 3951) < 100) then
                            soski := soski + ' <<<!!!';
                          end;
                          // bsss
                          if(CheckItemCount(myChars[i], 3952) > 0) then begin
                            soski := soski + ' | BSSS: ' + IntToStr(CheckItemCount(myChars[i], 3952));
                            if(CheckItemCount(myChars[i], 3952) < 100) then
                            soski := soski + ' <<<!!!';
                          end;
                          // ssb
                          if(CheckItemCount(myChars[i], 1465) > 0) then begin
                            soski := soski + ' | SSB: ' + IntToStr(CheckItemCount(myChars[i], 1465));
                            if(CheckItemCount(myChars[i], 1465) < 100) then
                            soski := soski + ' <<<!!!';
                          end;
                          // ssa
                          if(CheckItemCount(myChars[i], 1466) > 0) then begin
                            soski := soski + ' | SSA: ' + IntToStr(CheckItemCount(myChars[i], 1466));
                            if(CheckItemCount(myChars[i], 1466) < 100) then
                            soski := soski + ' <<<!!!';
                          end;
                          // sss
                          if(CheckItemCount(myChars[i], 1467) > 0) then begin
                            soski := soski + ' | SSS: ' + IntToStr(CheckItemCount(myChars[i], 1467));
                            if(CheckItemCount(myChars[i], 1467) < 100) then
                            soski := soski + ' <<<!!!';
                          end;
                          // spirit ore
                          if(CheckItemCount(myChars[i], 3031) > 0) then begin
                            soski := soski + ' | St Ore: ' + IntToStr(CheckItemCount(myChars[i], 3031));
                            if(CheckItemCount(myChars[i], 3031) < 100) then
                            soski := soski + ' <<<!!!';
                          end;
                          remoteControl.Say('[ MP: ' + IntToStr(CheckItemCount(myChars[i], 728)) + soski + ' ]', 3, '');
                          soski := '';
                  end;
              end;
        end;

      end;

           
    delay(2000);
   end;
end.

 

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...
23 часа назад, Eretik сказал:

Привет всем) а можете нубасу обьяснить как пользоватся приблудой *скрипт* чото у мня ничо не выходит)

 

Для того чтобы пользоваться и писать скрипты под себя на боте adrenaline, Вам понадобится:

1) Не быть кретином который считает что ему все чем-то обязаны, только потому что он попросил

2) Уметь гуглить

3) Базовые знания английского языка или\и Не быть кретинов и пользоваться банальным google translator

4) Adrenaline bot APi (Что это? См. пункт 2)

5) Начальные знания в программировании на Delphi. ( Да, да да, наш излюбленный бот AK "адрик" написан на делфи, собственно и его скриптовый движок работает на нём же, использует некоторые библиотеки оного ЯП ( язык программирования).

Перечень базовых аспектов языка для ознакомления:

1. Синтаксис

2. Функции и процедуры. 

3. Массивы

4. ООП 

Этого будет достаточно чтобы начать писать маломальски юзабельные скрипты. О говне вроде while 1<>2 do begin  с указанием неиспользуемых в скрипте классов и переменных в расчёт не берем... 

P\S : Для тех кто будет кукарекать, пункты выставлены по нарастающей спецом. Если на гуглил, но не в состоянии сам подкорректировать под себя скрипт. Или если выдернул с APi примеры и не знаешь что сделать, лезь в изучение основ делфи и паскаля, а не иди на форум просить чтобы для тебя "переделали". Ведь как показывает практика, это равноценно написанию  скрипта. А кому это нужно за спасибо?

 Тут и возникает дилемма, либо плати людям которые пишут скрипты за заказ, либо учи основы и пиши сам, не завися ни от кого, не унижаясь и не попрошайничая по форумам. Опытные и "гуру", как выразился чел выше, охотнее подскажут тебе как правильно сделать ту или иную процедуру, направят и помогут. А чайки : - Дай дай скрипт, а как его запустить? А пацаны вот нашел скрипт но он не работает! ( Хотя тупо взял пример реализации повтора за окнами с апи, не понимая даже что в коде) будут игнорироваться любым адекватным челом. Не хочешь думать сам, плати тем кто умеет. Без труда, не выловишь и рыбки из пруда ;)

Изменено пользователем hernesbird
Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...
В 12.09.2021 в 23:12, Hy6ac сказал:

Братва у кого то есть рабочий скрипт «повтор окнами за основой « а то этот ругается 

или кто то может этот исправить ,помогите !

 

Этот можно починить. Толку только от него ... Такое ощущение что этот кусок откуда то вырвали с мясом и представили как рабочийвариант. Допилить его можно. Но кроме него больше ничего работать толком не будет. 

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
В 11.12.2021 в 16:55, HouseMD сказал:

 

Этот можно починить. Толку только от него ... Такое ощущение что этот кусок откуда то вырвали с мясом и представили как рабочийвариант. Допилить его можно. Но кроме него больше ничего работать толком не будет. 

Вася, это пример скрипта с апи адрика, ПРИМЕР, починщик блин 🤣

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...