Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

LastCorpse

тут можно задать вопрос по скриптингу
VeL
Novice
Novice
Posts: 54
Joined: 03.12.2010 18:15

LastCorpse

Post by VeL »

Как получить ИД последнего трупа?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

запомнить его. а потом использовать.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

Re: LastCorpse

Post by Macks »

VeL wrote:Как получить ИД последнего трупа?
Труп он последний потому, что появился в окне клиента последним.

Значит происходит событие когда сервер присылает пакет появления нового объекта, на которое можно прицепить обработчик и смотреть если тип объекта такой как вам нужен запоминать в глобальные переменные.
VeL
Novice
Novice
Posts: 54
Joined: 03.12.2010 18:15

Post by VeL »

Пришлось написать такую функцию:

Code: Select all

function LastCorpse: Cardinal;
begin
  repeat
    Result := FindType(Corpse, Ground);
    Ignore(FindItem)
  until FindType(Corpse, Ground) = 0;
  IgnoreReset
end;
А вообще не понятно почему этого нет в стелсе, т.к. где присутствует лут, ИД последнего появившегося трупа знать просто необходимо.
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Post by Fenix »

VeL wrote:А вообще не понятно почему этого нет в стелсе, т.к. где присутствует лут, ИД последнего появившегося трупа знать просто необходимо.
Потому что труп для стелса ничем от обычного предмета не отличается. А вместо перебора всех трупов и забивания/очистки игнор-листа можно было использовать:

Code: Select all

function GetFindedList(var UserList: TStringList): Boolean;
А уже из неё брать последний ID примерно таким образом:

Code: Select all

function GetLastCorpse: Cardinal;
var
  FindedList: TStringList;
begin
  Result := FindType(Corpse, Ground);
  if Result > 0 then
  begin
    FindedList := TStringList.Create;
    try
      if GetFindedList(FindedList) then Result := IntToStr('$' + FindedList.Strings[FindedList.Count - 1]);
    finally
      FindedList.Free;
    end;
  end;
end;
К тому же, чем тебя не устроил способ, который предложил Macks?
Помните – ничто так не защищает ваши зубы 12 часов днем и 12 часов ночью как уважительное отношение к окружающим.
"Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня"© Larry Wall
VeL
Novice
Novice
Posts: 54
Joined: 03.12.2010 18:15

Post by VeL »

Fenix wrote:GetLastCorpse: Cardinal;
Эта функция работает не так как надо, возвращает ID трупов как попало... Скорее всего из за того, что GetFindedList загружает список не в том порядке в котором надо... Можно как то исправить?
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Post by Fenix »

Исправить? Даже не знаю. Это для тебя "список не в том порядке в котором надо". Используй метод, который советовал Macks. Если веришь, что ID трупам выдаются в правильном порядке (в чем я мал-мал сомневаюсь) - можешь искать трупы с максимальным ID.
Помните – ничто так не защищает ваши зубы 12 часов днем и 12 часов ночью как уважительное отношение к окружающим.
"Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня"© Larry Wall
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

VeL wrote:
Fenix wrote:GetLastCorpse: Cardinal;
Эта функция работает не так как надо, возвращает ID трупов как попало... Скорее всего из за того, что GetFindedList загружает список не в том порядке в котором надо... Можно как то исправить?
тогда обьясни, что есть "тот порядок, в котором надо"
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Post by CFA »

подозреваю, что GetFindedList возвращает отсортированные ид, а не в том порядке, в каком они приходили от сервера
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

сама функция не сортирует ничего. зато отсортировать может контейнер кешера айтемов, и вроде оно как раз этим и занимается для ускорения работы.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

Post by Macks »

Fenix wrote:Исправить? Даже не знаю. Это для тебя "список не в том порядке в котором надо". Используй метод, который советовал Macks. Если веришь, что ID трупам выдаются в правильном порядке (в чем я мал-мал сомневаюсь) - можешь искать трупы с максимальным ID.
А так же можно перебрать по айди и найти с минимальным от чара расстоянием.
VeL
Novice
Novice
Posts: 54
Joined: 03.12.2010 18:15

Post by VeL »

"тот порядок, в котором надо" - это как раз и есть, тот порядок в котором они пришли от сервера. Функция которую я написал выше - работает, значит FindType получает ИД в порядке прихода их от сервера... Как мне получить "тот же порядок " через GetFindedList?
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Post by Fenix »

Хорошо, пытаемся модифицировать GetLastCorpse:

Code: Select all

function GetLastCorpse: Cardinal; 
var 
  FindedList: TStringList; 
begin 
  Result := FindType(Corpse, Ground); 
  if Result > 0 then 
  begin 
    FindedList := TStringList.Create; 
    try 
      if GetFindedList(FindedList) then Result := IntToStr('$' + FindedList.Strings[0]); 
    finally 
      FindedList.Free; 
    end; 
  end; 
end;
Помните – ничто так не защищает ваши зубы 12 часов днем и 12 часов ночью как уважительное отношение к окружающим.
"Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня"© Larry Wall
VeL
Novice
Novice
Posts: 54
Joined: 03.12.2010 18:15

Post by VeL »

Fenix wrote:Хорошо, пытаемся модифицировать GetLastCorpse:
Темболее не то, мне не нужны первый или последний элементы списка, мне надо чтобы ИД в списке были в том порядке, в котором они пришли от сервера, для того чтобы уже оттуда извлечь последний элемент, который в свою очередь должен содержать последний ИД трупа...
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Post by Fenix »

Так ты проверял или просто так возмущаешься?
Помните – ничто так не защищает ваши зубы 12 часов днем и 12 часов ночью как уважительное отношение к окружающим.
"Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня"© Larry Wall
Post Reply