Контент Garry_Galler - Страница 9 - AMK Team
Перейти к контенту

Garry_Galler

Опытные
  • Число публикаций

    272
  • Регистрация

  • Последнее посещение

  • AMKoin

    10 [Подарить AMKoin]

Весь контент пользователя Garry_Galler

  1. malandrinus не знал что код именно так загружается. Но все таки важность порядка мне кажется от этого не уменьшается - не видел пока ни один код, где бы переменные объявлялись где попало в файле - это ж потом черт ногу сломит в 1000 строчном файле если их где попало насовать. ...Стал разбираться с абстрактными типами данных и их конкретными воплощениями – и пришел к выводу что таблицы lua (как с числовыми, так и со строковыми ключами) как АТД это ассоциативный массив (главный признак хранение пар key=value) , а как структура данных – хэш-таблица. И если она индексируется целочисленными ключами в математическом порядке – то в таком случае ее можно называть хэш-таблицей с прямой адресацией? (для которой невозможны коллизии). Впрочем интересно мне следующее: что из себя представляют файлы конфигов с секциями? По АТД вроде как списки – но списки делятся на разные виды – односвязные (однонаправленные), двусвязные(двунаправленные), кольцевые, развернутые и т.д. В общем как вообще правильно называть структуру данных типа такой
  2. Vano_Santuri а подумать? Что сохраняют и загружают функции? ТАБЛИЦУ (или точнее ее данные). Значит как эти функции связаны с таблицей? ЕЕ Именем. У меня таблица называлась morg. А у тебя как? Надо же вписывать имя Своей Таблицы. Ребята ну вы думайте прежде чем что то делать - а то вам даешь рабочие примеры, а вы их тупо копируете без адаптации под своей скрипт. Так же нельзя. На всякий случай правило: функции сохранения и загрузки должны (для удобства) находиться после всех основных функций которые эту таблицу эксплуатируют - то есть нужно следить чтобы таблица была доступна для чтения в функциях сохранения и загрузки. Само объявление таблицы лучше вынести в самый верх файла - по крайней мере она должна находиться на уровне выше функции где она впервые используется. Иначе она не будет читаться в этом скрипте\коде - и мы получаем вылет что значение переменной равно nil Удалять аргументы из скобок - это значит сделать функцию бесполезной. если вызываемая функция ничего не принимает - тогда что собственно она будет сохранять? И что загружать? Неплохо было бы подучить правила lua - почитать руководство по языку на официальном сайте (и вообще основы программирования - при таких знаниях далеко не уедешь). Я не программист - однако прежде чем начать писать какие либо серьезные скрипты для сталкера, вызубрил ВСЕ основные правила которые нужно соблюдать для грамотного написания скриптов - правила объявления переменных, области видимости переменных, области разрушения переменных, типы переменных и т.д. Вписывать вызов нужно туда куда я указал (в функции save и load, а не в update) в таком виде имя_файла.имя_функции_сохранения(packet) - в save имя_файла.имя_функции_загрузки(reader) - в load (в одно и тоже место для синхронизации чтения и сохранения) Обзор методов работы с нет пакетами есть в теме Справочник по функциям и классам.
  3. _Призрак_ А мозги включить? должно быть так local sobj = alife():create("apple",vector():set(73.594467,-0.016475,460.822327),365980,199) sobj:on_death() end Vano_Santuri адресатом ошибся :ny_ph34r_1: это я у _Призрак_ хотел спросить насчет вылета. Заполняться таблицы могут из разных скриптов - только надо знать как правильно заполнять - в какие поля таблицы что писать. Для сохранения нужно будет отдельные функции писать - для каждой таблицы свою - если конечно надо чтобы данные сохранялись. вообще можно заполнять только одну таблицу совершенннно разными данными (пример тому таблица db.storage в сталкере куда пишется огромное кол-во данных об онлайн объектах) - сделать например двумерную или трехмерную таблицу. И писать в нее из разных скриптов разные данные. Я вот сейчас использую трехмерные для большого кол-ва данных. Но работа с такими таблицами требует опыта. И сохранять их немного сложнее чем простые одномерные.
  4. Vano_Santuri Что именно то вылетает? какой скрипт? в предыдущем посте чуток ошибся - таблицу для очистки надо надо объявлять без local так как она уже объявлена - local нужно при первом объявлении писать. и все прочие переменные изначально задавай всегда как local и следи чтобы переменные не пересекались по именам там где не надо. в общем - все должно работать если все правильно сделать. так что ищи ошибки у себя.
  5. Vano_Santuri первая функция запишет айди аномалий в таблицу по принципу ключ=значение так как таблица у тебя индексируется по умолчанию - то будет так [1] = айди [2] = айди [3] = айди и т.д. вторая функция сохранит все данные из таблицы (при нажатии квиксейва, записи сохранения или перезагрузке) в объект "actor" средствами нет пакета. третья функция загрузит данные таблицы из объекта "actor" и заполнит таблицу заново. четвертая функция проитерировав табличку удалит аномалии по их айди из таблицы. если в конце функции удаления (перед последним end) написать local имя таблицы ={} -- то таблица будет объявлена как пустая - то есть очищена от всех данных. И теперь при новой генерации аномалии она будет заполнена новыми айди. объявление переменных без идентификатора local означает их автоматическое объявление как глобальных - то есть с областью видимости за пределами файла\функции где они объявлены. Чревато ошибками если имена глобальных переменных пересекутся.
  6. _Призрак_ Насчет трупа - obj:kill(obj) сработает только если сделать паузу между креате и килл - я так делал - таймер на 1 секунду. И готово - труп есть. Но это слишком громоздко. Все проще. Есть специальный метод для этого - в общем дарю способ: local sobj = alife():create("stalker", position, level_vertex_id, game_vertex_id) sobj:on_death() Vano_Santuri для твоей таблицы - вот пример сохранения одномерной таблицы из моих скриптов - сохраняется таблица такого же вида как у тебя. --сохранение данных function morg_save(p) local i = 0 --подсчитаем кол-во ключей for k,v in pairs(morg) do i = i + 1 end --запишем кол-во p:w_u8(i) --сохраняет целые числа до 256 for k, v in pairs(morg) do p:w_u16(k) --сохраняет числа до 65536 --вообще сохранять здесь ключи необязательно так как они идут в математическом порядке p:w_u16(v) --достаточно только значения сохранить end end --загрузка данных function morg_load(r) --загрузим кол-во ключей local i = r:r_u8() --запустим цикл for k = 1, i do --присвоим значения local id = r:r_u16() --соотвественно это тоже лишнее, но пусть для примера останется - если ключи будут идти не математическом порядке - вот тогда надо их точно сохранять morg[id] = r:r_u16() --здесь заполняем таблицу ключ=значение end end обе функции нужно вписать в бинд сталкер в функции function actor_binder:save(packet) и function actor_binder:load(reader) - каждую вписывать в одно и тоже место - чтобы они располагались в одинаковых местах каждой функции. для спавна разных аномалий добавляешь в функцию - в тело оператора for do - эту строчку local section = #anom[math.random(#anom)] - а к ней пишешь табличку anom с именами секций аномалий
  7. malandrinus отсюда - тема по ООП. Там еще одна такая же тема есть. _http://mydc.ru/topic1429.html
  8. malandrinus так как я в этом пока не разбираюсь, то напишу как написано на сайте откуда скачал. "Библиотека построения именованных классов. Самая продвинутая реализация классов и практически всех принципов ООП включая виртуальные классы от разработчика LUA."
  9. malandrinus насчет string.format понял - все просто :ny_ph34r_1: спасибо. я пробелы поставить не додумался между "%s и %s - и у меня все слитно выходило.
  10. malandrinus за подробный пост большое спасибо. Не буду лукавить - ООП для меня пока темный лес. и пока сам не научусь создавать классы и методы классов - в голове полного понимания все равно не будет. PS: string.format конечно хорошая функция но...пока с этими модификаторами разберешься - плюнешь и конкатенацию сделаешь :ny_ph34r_1: вот как мне отформатировать строку из шести строк чтобы там и знаки препинания и пробелы были.. типа такой text = obj_name.." "..verb.." "..adjective.." "..substantive.." "..str.."."..habar.."." monnoroch решил я сделать девайс для сохранения - объект флешка, куда индивидуально сохраняю только таблицу мессиджей. Вылетает на охранении 50-го мессиджа (раньше на 45-ом когда сохранял общаком все таблицы в один объект). Не могу понять почему меня не срабатывает проверка перед записью в пакет, что в нем еще есть место.
  11. malandrinus на данный момент "сомнительная" с технической точки зрения идея работает. Проверил сохранение примерно 30 мессиджей - буду записывать дальше - интересно на каком по счету вылетит. ну и проверочку потом поставлю перед записью, что в пакете еще есть место для записи.. мне интересно у меня все данные только в один пакет пишутся? то есть если они сохраняются через биндер объекта схрона, то пакет выделяется только один? на объект-схрон вообще или на каждый схрон - вот этого я пока не уяснил... если на объект вообще - то можно я так понимаю создать несколько однотипных биндеров и каждый вписать в конфиг одного из схронов (пока биндер общий на все - вписан в базовую секцию - остальные наследуются от основной) и затем в каждом биндере сохранять только одну из таблиц - а у меня их сейчас четыре штуки для разных данных.Так?
  12. max_max_08 как то так делай таблица поршней - оставляем вверху local info_random = {"info_1","info_2","info_3","info_4","info_5","info_6"} прекондишен типа так function check_info() if (has_alife_info("info_1") and has_alife_info("info_2") and has_alife_info("info_3") and has_alife_info("info_4") and has_alife_info("info_5") and has_alife_info("info_6")) then return false -- то есть если все поршни выданы то вернем ложь - прекондишен не выполняется - диалог не появляется end return true --иначе вернем правда end рандомные поршни так function info_rnd() if not check_info() then --проверим есть ли еще не выданные поршни - если нет то прекращаем чтение дабы не получить бесконечный вызов return end --выберем поршень по случайному индексу из всех индексов таблицы local info = info_random[math.random(#info_random)] if not has_alife_info(info) then --если нет поршня то включим db.actor:give_info_portion(info) else info_rnd() --делаем рекурсивный вызов если условие не выполняется end end функции местами не менять.
  13. Monnoroch , malandrinus Был бы очень признателен если б кто-нить пояснил мне как это все будет работать - в смысле запись не на эктора, а на другой объект. Вот вписал я сюда функции сохранения и загрузки
  14. Monnoroch я так и буду делать - биндер (с коллбеком на обыск тайника) у меня есть - вот я и думаю сохранять в нем. Пока попробовал сохранять на нем три вспомогательные таблички - а для мессиджей пока не могу написать функции сохранки и загрузки - табличка то трехмерная - не могу сообразить как правильно написать. а насчет девайса - не совсем понял.
  15. malandrinus что то типа того не совсем был подогнал текст под экран (но уже поправил) типа тайник на заднем плане - один из 15 или17 типов.
  16. malandrinus предложение конечно интересное - прежде всего потому что не пробовал :ny_wink: но возникает пара вопросов - при двоичном кодировании какая будет экономия - если на 30- 50% то нормально - большего мне и не надо. у меня строка мессиджа по уточненным данным занимает 120-150 символов - то есть два-три небольших предложения. В пакет объемом 8192 байт влезет 50-60 штук. Этого уже хватает если учесть что все неактуальные мессиджы будут удалятся - сразу после обыска схрона. То есть в идеале вполне достаточно сохранять их не более 100 штук - ну вряд ли геймер оставит необысканными более сотни тайников. Но я понятия не имею как переводить строку в бинарный код (и обратно). Максимум что я делал - это баловался со string.byte() и string.char() переводя буквы в десятичные коды ASCII и обратно. (для русского алфавита почему то не совпадают значения). (а с алгеброй буля я пока вообще не знаком...) в общем где бы мне информации поднабраться на этот счет?
  17. malandrinus ну почему сомнительная? Я сделал меню в виде коммуникатора, сделал рандомные тайники (ну очень рандомные - таких ни у кого нет :ny_ph34r_1: ) метка вешается только на половину тайников (рандомно) да и то та которая большая (и даже не на сам схрон, а на рандомный сопутствующий объект - либо пустой рестриктор либо еще че-нить эдакое...череп например - так что указание местонахождения схрона самое что ни на есть примерное, визуал тайника опять же рандомный, про хабар - вообще молчу). На остальные тайники выдается инфа о местонахождении - в тексте указывается владелец, лока, объект-примета, расстояние до него, азимут. Это все скрипт у меня считает. Соотвественно каждый мессидж при обыске трупа пишется в табличку, а не выдается на экран в левый нижний угол. Зайдя в меню можно каждый мессидж (но только для текущего уровня) в порядке очередности просмотреть на экране коммуникатора - кто-нить что-то такое реализовал? Теперь осталось только сделать, чтобы все эти мессиджы еще и сохранялись и не терялись при перезагрузке. Вот с этим пока заморочки...так как тексты пока ни разу не пробовал сохранять и не знаю какие тут подводные камни. За пояснения больше спасибо - пока я конечно не очень в этих нет пакетах разбираюсь - так что каждый твой пост многое что поясняет.
  18. Очень насущный вопрос: у меня в таблицу как значения строковых индексов пишутся тексты - каждый в среднем по 250 символов. Всю таблицу надо сохранить и все тексты записать в нет-пакет - если каждый текст сохранять в отдельный пакет то он запишется? таблица заполняется так if not message[lname] then message[lname] ={} end table.insert(message[lname], {text_id = text, id = obj.id}) и кто-нить может дать пример функций сохранения и загрузки трехуровневых таблиц? с одномерными то все достаточно просто, двумерная посложнее, а вот как быть с трехмерной я пока в растерянности...там же получается нужно записать кол-во ключей в каждой таблице второго уровня... а вот как... А можно делать сохранение и загрузку не в биндере эктора, а в своем биндере?
  19. malandrinus вот в чем дело значит - тогда понятно почему он то вертится как надо, то вдруг клинится. Я это не учел - спасибо что пояснил. (нашел и в скрипте строчку которая за это отвечает - сразу не обратил внимания). Думаю перенести его активацию из слота в свой коммуникатор для сообщений - нажал кнопочку - худ появился, снова нажал - убрался с экрана. так удобней будет - и безопасней для игрока я думаю. Спасибо авторам за разработку - для поиска моих рандомных тайников будет самое то :ny_thumbsup: че то скрины у вас с радикал фото не вводятся...хотел показать.
  20. Товарищи авторы - есть пара вопросов по разработке. Вo-первых скажу что вещь нужная - особенно в тему моей собственной разработки (определение направления по сторонам света -как раз то что нужно) но вот результат первого теста - определил север, дальше повертелся туда сюда, а стрелка так и осталась на севере как приклеенная - почему? и второе - направления по румбам будут определяться и на других локах? я так понял только координаты пока не заданы для прочих лок кроме кордона...
  21. Вопрос не по теме: где на АМК тема с компасом - очень надо авторов спросить. Полчаса уже ковыряюсь - не могу отыскать.
  22. Подскажите как правильно отформатировать вывод текста. У меня текст выводится из таблицы lua куда пишется одной строкой. вывод идет на экран виджета - соответственно нужно чтобы он не выходил за его границы. я подсчитал что в строку на экране виджета влезает примерно 20 символов - то есть надо как то сделать перевод на новую строку после этого кол-ва символов. Либо после определенного кол-ва слов - влезает на виджет примерно три слова по горизонтали. пробовал и через string.format и string.gsub но ничего пока не вышло. и вообще мне интересно как форматируется вывод текста в диалогах - чтобы он в рамках меню был и при этом переносы правильные. Gonarh а то я не знаю. только строка то формируется скриптом - в разных местах из разных данных (+варианты без данных) и что мне через каждые три слова перевод каретки насовать? это не то. стал бы я заморчиваться если б все было так просто ... вопрос снимается - пришлось отказаться от CUIStatic() и сделать нужные настройки виджета (в том числе и выравнивание текста при выводе на виджет) в hml конфиге меню.
  23. Создал скриптовое меню со своей текстурой - работает. создал виджет со своей текстурой - должен появляться поверх меню после нажатия кнопки меню - не появляется. делал через CUIStatic() вот так local stat= CUIStatic() --определяем класс виджета stat:SetAutoDelete(true) --вот это не знаю зачем надо stat:Init(463, 214, 168, 214) --устанавливаем координаты виджета и размер self:AttachChild(stat) --создаём виджет с указанными координатами. stat:SetWindowName("screen") --назначаем ему имя stat:InitTexture("ui\\screen.dds") --отобразим в виджете текстуру. stat:SetFont(GetFontLetterica16Russian()) --назначим шрифт выводимому тексту. stat:SetTextX(476) stat:SetTextY(319) stat:SetTextColor(255,160,160,160) stat:SetTextAlign(0) все это вписано в блок InitControls() основного меню в коллбеке на нажатие кнопки активация виджета function my_message:message_1() local vij = self:GetStatic("screen") --инициализация виджета по имени local text= this.show_message() vij:SetText(text) end Вопрос: почему виджет не отображается? И вообще он должен именно поверх текстуры бэкграунда отображаться (то бишь текстуры фона самого меню) или нет? А то вдруг он под ней отображается - потому и не видно... Вопрос полностью решен.
  24. malandrinus Спич в силе. :ny_ph34r_1: Раз уж речь зашла об ошибках - то вот мне интересно было бы узнать как скриптовый парсер игры обрабатывает ошибки. Вот например вчера получил полный неадекват этого парсера по отношению к моему файлу со скриптами. Каждая функция в этом файле - доселе рабочая и проверенная объявлялась nil value - в порядке очередности вызовов. первыми попали под раздачу апдейтовые функции - когда убрал их вызов, игра загрузилась но ругнулась на первый же вызов следущей функции и т.д. Ошибку (которая и была причиной всех nil value) я нашел - просто в добавленной в файл таблице отсутствовали кавычки у строковых индексов заключенных в [] ну и тож самое было в функции которая данные из таблицы получала то есть было local verb = word[verb][math.random(#word[verb])] вместо local verb = word["verb"][math.random(#word["verb"])] И все. Почему бы парсеру было просто на это не указать? :ny_dry: Ну по крайне мере споткнуться на чтении(вызове) именно этой функции, а не объявлять nil value рабочие. Monnoroch может я не так выразился но логи были такие: : attempt to call field 'gratva' (a nil value) attempt to call field 'uny_spawn_1' (a nil value) attempt to call field 'on_actor_update' (a nil value) : attempt to call field 'get_object' (a nil value) все это имена функций из этого файла которые при их вызове давали крэш игры.
  25. Real Wolf передаешь в функцию юзердату объекта function get_parent_id(obj) if obj then local sobj = alife():object(obj.id) if sobj and sobj.parent_id then return sobj.parent_id end end end на выходе получаешь его парент ид. далее сравниваешь этот ид с идом конкретного ящика. Если совпадает - значит предмет в ящике. в общем это дело не совсем для новичков - тут надо все нужные данные в таблички писать - если умеешь работать с таблицами Lua то поймешь как и что.
×
×
  • Создать...