Перейти к контенту

[SoC] Ковыряемся в файлах


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

Gonarh

посылать меня курить маны не стоит - все существующие мануалы по lua я и так прочитал. И тебе должно быть хорошо известно что в том же руководстве по lua не поясняется как работать с многомерными массивами (есть ли это в книге Роберта Иерусалимского - не знаю - так как читал только ее частичный перевод - полный перевод в инете not exist).

Как такового понятия многомерного массива в lua вообще не существует (как например в паскале или визуал бейсике) - однако есть возможность создавать их через таблицы разных уровней. И соотвественно чем больше у таблицы уровней тем сложнее ее итерировать (особенное если это хэш массив).

И если ты не знаешь как с ними работать, то так и скажи - а посыл оставь для других.

Изменено пользователем Garry_Galler
Ссылка на комментарий

Для начала, скажу только один раз и больше повторяться не буду.

Я никого никуда не посылал, я тебе (равно как и ты мне) ничего не должен и ничем не обязан,

поэтому недовольные идут лесом.

Если ты всерьез хочешь заняться программированием, читай мануалы на английском а не ищи переводы.

Потому как все равно практически вся тех. документация на нем.

По сабжу:

когда я делал трехуровневую таблицу - там все итемсы выводились как надо - но полным списком - если у непися 20 пачек патронов - то все 20 пачек построчно и выводились - хотелось бы избавиться от этого, чтобы было только имя предмета и его кол-во.

они у тебя и будут выводится построчно, потому что у каждой пачки свой :id() а ты добавляешь в свою таблицу айдишник для каждого итема, своего рода ключ, тут уже придётся выбирать или показывать все 20 пачек с их айдишниками или добавлять в таблицу без айдишника, либо завесть подтаблицу и упаковать по имени секции количество итемов, выбирать тебе

 

Добавлено через 20 мин.:

Как такового понятия многомерного массива в lua вообще не существует (как например в паскале или визуал бейсике)

в паскале и визуалбейсике реализации n-мерного массива, через array как таковой тоже не существует. Есть коллекции, деревья, но не аррэй. Про си не скажу, я его знаю на уровне "хэлловорд". Кстате знаю что в ЛУА есть связанные списки(linked lists если Иерусалимский не врет), я про них не читал, попробуй посмотри в их сторону - может пригодится

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий
И если ты не знаешь как с ними работать, то так и скажи - а посыл оставь для других.

Чего ты кипятишься? Форматируй свой код получше, да комментарии ставить не ленись - тогда больше найдётся желающих работать с ТВОИМ кодом.

У тебя банальная ошибка во второй части. Всё работает и все таблицы читаются. Я так понимаю, ты хочешь установить для каждого сталкера метку со списком предметов. Однако вместо этого ты много раз устанавливаешь надпись на метке, состоящую только из текущего предмета, затирая предыдущую. Естественно, остаётся последняя метка - последний предмет из инвентаря. У тебя там так:

str = name:character_name().......

т.е. str затирается на каждой итерации

а надо было так

str = str..name:character_name()......

т.е. строка накапливается

ну и level.map_add_object_spot() само собой надо сделать один раз, а не столько, сколько предметов

Вот только если ты хотел сделать метку из всех предметов инвентаря, то это не получится. Такой длинный текст движок не переваривает и рушится.

 

в паскале и визуалбейсике реализации n-мерного массива, через array как таковой тоже не существует. Есть коллекции, деревья, но не аррэй. Про си не скажу, я его знаю на уровне "хэлловорд". Кстате знаю что в ЛУА есть связанные списки(linked lists если Иерусалимский не врет), я про них не читал, попробуй посмотри в их сторону - может пригодится

В Паскале как раз имеются родные многомерные массивы. В СИ многомерные массивы имитируются с помощью парадигмы "массив массивов", что впрочем смотрится достаточно естественно. В Lua нет никаких иных коллекций и структур данных (встроенных), кроме таблиц. На них строится всё: линейные и ассоциативные массивы, структуры (паскалевские записи) и объекты, множества, деревья и графы вообще. Упомянутый список (см. здесь) в языке не присутствует, а имитируется также, как графы (в принципе списки - это вырожденные графы).

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий
В Паскале как раз имеются родные многомерные массивы.

ты сможешь при помощи них создать n-мерный массив? Т.е массив с заранее неизвестным количество измерений. Вот смотри при n=2 это матрица, при n=3 - это куб. Покажи код создания n-мерного массива с заранее неизвестным n. Можно в личку, просто интересно

ЗЫ. Как жаль что нам не преподавали в свое время теорию графов :(

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

malandrinus

банальную ошибку я уже исправил - пришлось правда что бы понять ее, в scite создать имитацию моей таблицы.

все как ты и указал - был неправильный вывод инфы в итоговую строку.

и

 

for k, data in pairs(db.storage[npc:id()].inventory) do
        local text_inv = "\\nинвентарь:".."\\n"..data.inv
        local text_count = " ["..tostring(data.count).."]"
        str = name:character_name()..text_inv..text_count.."\\n"
  level.map_add_object_spot(id, "alife_presentation_smart_ready", str)

надо бы исправить на этот:
local id = npc:id()
local name = level.object_by_id(id):character_name()
        str  = name.."\\n".."инвентарь:".."\\n"
        for k, data in pairs(db.storage[npc:id()].inventory) do
        local text_inv = data.inv
        local text_count = "["..tostring(data.count).."]"
        str = str..text_inv..text_count.."\\n"
                    level.map_add_object_spot(id, "alife_presentation_smart_ready", str)

 

 

 

я бы не кипятился если бы Gonarh просто сразу указал бы (как сделал ты) на вероятную ошибку в коде (или сказал что не знает причину или просто ничего не писал так как

"я тебе (равно как и ты мне) ничего не должен и ничем не обязан"
, а не посылал меня как совсем не рубящего в теме к тому руководству, которое у меня и так лежит распечатанное на раб. столе.
Изменено пользователем Garry_Galler
Ссылка на комментарий

Вопрос: что надо сделать, чтобы НПС не считали "костёр" аномалией, а то я поставил мод обход аномалий, так НПС теперь к костру не могут подойти :D

 

Сталкер v 1.004 + Народная Солянка от 14.06 + патч № 0.1 (на 19.06) + ВСЕ ДОПОЛНЕНИЯ СОЛЯНКИ ПО 08.08 + ДОПОЛНЕНИЕ ОТ 10.09 + патч от 17.09 + мод от Monnoroch ( v 1.5.2) + фикс для него

 

Ссылка на комментарий
ты сможешь при помощи них создать n-мерный массив? Т.е массив с заранее неизвестным количество измерений.

Смотря в какой версии. В исходном языке нельзя, и число размерностей задаётся заранее. В последних версиях, которые базируются на .NET, уже используются типы дотнетовские. Там и многомерные динамические массивы есть. За подробностями - в какую-либо книжку. Я сам Delphi не использую, так что просто заглянул в первую попавшуюся. Вот к примеру "Архангельский А.Я. - Delphi 2006. Справочное пособие"

 

банальную ошибку я уже исправил - пришлось правда что бы понять ее, в scite создать имитацию моей таблицы.

Рекомендую осваивать нормальные техники отладки. Первое, как раз для таких экспериментов есть удобный тестовый полигон. Я его описывал здесь. Второе, такие вещи надо отлаживать, выводя в лог. Все возможные способы это сделать под ЧН я также разжевал здесь. Я взял твой код без изменений и сразу нашел ошибку, просто выведя информацию в консоль.

 

Ещё. Для множественных конкатенаций строк рекомендую использовать функцию string.format. Это на порядок производительней, плюс дополнительные возможности по форматированию.

 

лежит распечатанное на раб. столе.

А я никогда не печатаю, мне деревьев жалко =)

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

malandrinus

полигон то есть. И время от времени я им пользуюсь, а тут решил без него обойтись. Да и через имитацию созданию таблицы мне как то понятнее стал алгоритм обращения к элементам многомерных таблиц. Так что у каждого свои методы - кому что удобнее. Лично мне наглядность нужна, а не абстракция - я ведь не программист (и даже близко отношения к ним не имею и вообще никогда не думал, что займусь изучением хоть какого то языка, но вот сталкер привел на эту дорожку).

 

а string.format'oм я позже отформатирую.

 

Вопрос тут созрел - спрашиваю не для себя - челу одному на SP нужно - аномалии скриптовые как удалять?

лично я припоминаю что есть disable_anomaly() но сам им не пользовался. Если все сгенерированные аномалии в табличку занести, а потом их через disable по айди удалять - сработает? Если да, то скрипт я ему накидаю.

И кстати чем отличается clsid.wpn_ak74_s от clsid.wpn_ak74 - этот к примеру просто.

а то захотел создать функцию для проверки объектов на класс аномалий - наподобие isWeapon() или isStalker() но пока не разобрался какие идентификаторы классов мне использовать.

 

Ссылка на комментарий
...кому что удобнее. Лично мне наглядность нужна, а не абстракция

Поверь мне, все инструменты отладки призваны именно повышать наглядность. Я вот вывел информацию в консоль и увидел ошибку. А вывод в метку непися эту ошибку скрывал. Впрочем, каждый усложняет себе жизнь по собственному вкусу.

 

Вопрос тут созрел - спрашиваю не для себя - челу одному на SP нужно - аномалии скриптовые как удалять?

лично я припоминаю что есть disable_anomaly() но сам им не пользовался.

Удалять любые объекты можно функцией alife():release().

disable_anomaly() будет, как понятно из названия, только отключать аномалии, но не будет удалять объекты.

 

И кстати чем отличается clsid.wpn_ak74_s от clsid.wpn_ak74

clsid.wpn_ak74 - идентификатор встроенного класса, clsid.wpn_ak74_s - для скриптового класса, зарегистрированного с помощью object_factory. Почитай об этом в теме "справочник по классам"

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

Товарищи скриптеры, к Вам вопросец. Нужен простенький скрипт который при наличии определенного предмета присваивает локальной переменной true. При отсутствии этого предмета false.

Ссылка на комментарий

у кого у непися или у ГГ?

если у ГГ то так:

local has_item = db.actor:object("af_electra_moonlight") --проверяем наличие арта Лунный свет

если у непися -

local has_item = npc:object("af_electra_moonlight")
--npc - это объект непися

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

malandrinus

благодарю за пояснения.

Окей буду стараться впредь по уму ошибки искать. :rolleyes:

то что удалять аномалии нужно именно alife():release() (как и все прочие объекты) я так и предполагал, но меня сбивало с толку наличие метода disable_anomaly() с действием которого я не был знаком - теперь все понятно.

Ссылка на комментарий

Gonarh Нужен простенький скрипт который при наличии определенного предмета присваивает локальной переменной true. При отсутствии этого предмета false. Самого этот вопрос интересует вот и решил поддержать его. И еще вот функция:

function global_bind_clock()
if db.actor ~= nil then
return db.actor:object("clock") ~= nil then
db.actor:give_info_portion("clock_activ")
end
return false
end

Где здесь ошибка?

Изменено пользователем кровоSTALKER
Ссылка на комментарий

смотри внимательней вместо then ... else ты написал then ... then

 

ладно, раз пошли такие пляски вот функция

function has_item(item_name, npc)
  if npc == nil then npc = db.actor end
  return npc:object(item_name) ~= nil
end

 

юзать так:

has_item("af_blood") - для ГГ

has_item("af_blood", npc) - для непися, где npc это объект того сталка у которого хотим прверить наличие предмета

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

О... Да да, точно...

UPD:

Мне нужно вынести ту фунцию (

function global_bind_clock()
if db.actor ~= nil then
return db.actor:object("clock") ~= nil then
db.actor:give_info_portion("clock_activ")
end
return false
end

) в глобальный апдейт ака апдейт через бинд_сталкер.скрипт, но когда я добавляю ее в апдейт (в функции актор_биндер_апдэйт(дельта)) при начале новой игры игра зависает. Как с этим бороться? Итем за именем clock был создан.

Изменено пользователем кровоSTALKER
Ссылка на комментарий

потому что ты неправильно её написал, вот смотри

function global_bind_clock()
  if db.actor ~= nil then
    return db.actor:object("clock") ~= nil
  else
    --получается по условию у тебя тут db.actor равен nil а ты пытаешься юзнуть метод give_info_portion нила
    db.actor:give_info_portion("clock_activ")
  end
  return false
end

 

 

перечитай еще раз что я написал

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

Ну, я её исправил еще когда ты первый раз мне сказал.

function global_bind_clock_update()
if db.actor ~= nil then
return db.actor:object("clock") ~= nil
else
db.actor:give_info_portion("clock_activ")
end
return false
end

Изменено пользователем кровоSTALKER
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...