Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

Нужны советы по реализации скрипта

Рег
7 Июл 2016
Сообщения
4
Реакции
0
Всем добрый день, подскажите как лучше реализовать скрипт по отправке почтой с такими опциями:
1. Отправка только в мирной зоне (если конечно такая проверка вообще реализуема)
2. Отправка множества итемов (т. е. в инвентаре например куча разных ресов нужно отправить их все, если отправять по одному наименованию будет долго, поэтому нужно отправлять сразу по 8 наименований)

В скриптописании пока не силен, поэтому хочу узнать ваши идеи. Если я правильно рассуждаю нужно попробовать сделать цикл в котором скрипт будет проходить по всему инвентарю попутно добавляя в массив ID и кол-во итем, как только в массиве будет 8 наименований отправлять письмо и дальше идти по инвентарю пока все не отправится.
 
ForSer написал(а):
1. Отправка только в мирной зоне (если конечно такая проверка вообще реализуема)
как вариант сделать пару условий на проверку своего местоположения или написать функцию для "посещения" города. можно сделать проверку города по какому-то нпц, например, баферу или гм-шопу, обычно у них одинаковый ид.

ForSer написал(а):
2. Отправка множества итемов (т. е. в инвентаре например куча разных ресов нужно отправить их все, если отправять по одному наименованию будет долго, поэтому нужно отправлять сразу по 8 наименований)
function SendMail(const Recipient: string; const Theme: string; const Content: string; Items: array of Cardinal; Price: Cardinal = 0): Boolean;
const Recipient - получатель письма
const Theme - тема письма
const Content - текст письма
Items - вложения, массив вида [id_1,count_1, id_2,count_2, ...]
Price - цена (для платных писем)
Код:
Engine.SendMail('Nickname', 'тема', 'текст письма', [57, 100000]); // Отправит 100к адены на указанный ник
 
по порвому типо того

function InCity: boolean;
begin
Result:= false;
case Engine.GetCurrentZoneName of
'Годдард': Result:= true;
'Глудио': Result:= true;
'Шутгарт': Result:= true;
'Руна': Result:= true;
'Аден': Result:= true;
'Хейн': Result:= true;
'Гиран': Result:= true;
'Орен': Result:= true;
'Дион': Result:= true;
'Деревня Глудин': Result:= true;
'Деревня Бенон': Result:= true;
'Эльфийская Деревня': Result:= true;
'Ипподром': Result:= true;
'Деревня Говорящего Острова': Result:= true;
end;
end;
по второму вопросу самому интересно, пытался гуглить как преобразовать строку из нужных чисел в хз какой тип данных, на этом мысли кончились
 
uses SysUtils, Classes;

var
i: integer;
tmp_item: string;
tmpItem: TL2Item;
id: Cardinal;
count: Cardinal;


begin

for i:= 0 to Inventory.User.Count-1 do begin tmp_item := Inventory.User.Items(i).Name;
id := Inventory.User.Items(i).id;
count := Inventory.User.Items(i).count;
if Pos('Испорчен', tmp_item) > 0 then begin Inventory.User.ByID(i, tmpItem);
Engine.SendMail('Ник', 'тема', '', [id, count]);
end;
end;

end.


Вот что "накодил" работает правда отправляет одно наименование, теперь подскажите как реализовать отправку 8 итемов? Создать массив в каждой итерации for добавлять в массив сначало id потом count как только массив заполнится отправить его? Если так тогда как это правильно реализовать? Пока не могу понять какой тип данных прилетает в переменные id и count и в каком формате должен быть массив чтобы можно было подставить его в Engine.SendMail
 
@dritaty, разве на фришках currentzone работает? чет на классике работало, а на аверии нет)
 
ForSer написал(а):
Inventory.User.ByID(i, tmpItem);
Вот это совсем не нужно, у тебя уже естьвсе и ID и количество
 
@ХОРВЕСТР,
Вот это совсем не нужно, у тебя уже естьвсе и ID и количество
Необходимо использовать двумерные массивы

Да верно, лишняя строчка , позже тоже заметил, осталась от первого варианта скрипта

Inventory.User.ByID(i, tmpItem);

А вот на счет массивов тоже хотел использовать двумерный массив, но столкнулся с проблемой, хотя списываю это пока на малые знания в delphi. Суть такая
я объявляю глобально массив(пробовал обычный и двумерный) потом в цикле for пытаюсь его заполнить, далее после выхода из цикла при отправке почты функцией, указываю в ней индексы массива но индексы пустые, письмо улетает пустое, примерный первоначальный код такой (сильно не ругайте только осваивать начал :) )
Код:
uses SysUtils, Classes;

var
i: integer;
tmp_item: TL2Item;
id: Cardinal;
count: Cardinal;

items: array[1..2,1..2] of integer;


procedure MailSend();
begin

  for i:= 0 to Inventory.User.Count-1 do begin tmp_item := Inventory.User.Items(i);
    if (Pos('Испорчен', tmp_item.name) > 0) then begin
       items[i,1]:= tmp_item.id;
       items[i,2]:= tmp_item.count;   
    end;
  end;

  Engine.SendMail('nikname', 'тема', '', [items[1,1],items[1,2]]);

end;

begin
    MailSend();
end.
 
@ForSer, у тебя не правельный двумерный массив.
тебе надо 8 строк по 2 значения. 1 значение ИД предмета , 2 значение его количество. После того как массив заполнится прерываешь цикл перебора инвентаря и отправляешь письмо.


надо так:
Код:
items: array[1..8,1..2] of integer;
Код:
While (True) do begin

  Ch:=0;

  for i:= 0 to Inventory.User.Count-1 do begin 
   
      if Ch=8 then break;

      tmp_item := Inventory.User.Items(i);

      if (Pos('Испорчен', tmp_item.name) > 0) then begin
       
         Ch:= I +1; 

         items[Ch,1]:= tmp_item.id;
         items[Ch,2]:= tmp_item.count;   
      end;

  end;

  //ОТПРАВЛЯЕШЬ ПИСЬМО ПЕРЕБИРАЯ МАССИВ 

end;
 
Код:
procedure SendMailItem(a: Array of Integer; Nick: string; Tax: integer = 1100);  // вызов SendMailItem([id,count,id,count....],'вася') если Count -1 то отправляет
var i,CurrTax: integer;                                                          // все предметы
    b: array of Cardinal;
begin
  CurrTax:= Tax;
  SetLength(b,0);
  for i:= 0 to Length(a) -1 do begin
    if a[i] = 57 then begin
      Inc(i);
      Continue;
    end;
    if (ItemCount(a[i]) > 0) and (ItemCount(57) >= CurrTax) then begin
      SetLength(b,Length(b)+2);
      b[Length(b)-2]:= a[i];
      if a[i+1] = -1 then b[Length(b)-1]:= ItemCount(a[i]) else b[Length(b)-1]:= a[i+1];
      CurrTax:= CurrTax + 1000;
    end;
    if Length(b) = 16 then begin
      Engine.SendMail(Nick, '0', '', b);
      delay(11000);
      SetLength(b,0);
      CurrTax:= Tax;
    end;
    Inc(i);  
  end;
  for i:= 0 to Length(a) -1 do begin
    if a[i] = 57 then begin
      SetLength(b,Length(b)+2);
      b[Length(b)-2]:= a[i];
      if a[i+1] = -1 then b[Length(b)-1]:= ItemCount(a[i]) - CurrTax else begin
        if ItemCount(a[i]) - CurrTax > a[i+1] then b[Length(b)-1]:= a[i+1] else b[Length(b)-1]:= ItemCount(a[i]) - CurrTax;
      end;
      break;
    end;
    Inc(i);
  end;
  if Length(b) > 0 then Engine.SendMail(Nick, '0', '', b);
end;
Код:
function ItemCount(id: word) : int64;
var Item: TL2Item;
    i: integer;
begin
  Result:= 0;
  for i:= 0 to ItemList.Count - 1 do begin
    if ItemList(i).id = id then Result:= Result + ItemList(i).Count;
  end;
  if Result > 0 then exit;
  if Inventory.Quest.byid(id, Item) then Result:= Item.Count;
end;
 
@dritaty, очень страшный('сложный для понимания') код для меня ))) Будет что разбирать теперь
 
@ForSer,

Попробуй использовать одномерный массив для записи ИД предметов, а количество в отправке указывай (-1) и все. будет норм. Количество тебе и запоминать не надо
 
Назад
Сверху