Garry_Galler 7 Опубликовано 1 Января 2010 malandrinus насчет функции из ЗП - жаль конечно, ну да ладно - я уже обошелся и без нее. А таблицу storage я уже и так разобрал по кусочкам и могу и нее выдернуть усе что угодно. (кому надо могу скрипт "досье на всех NPC" выложить) мои сомнения насчет возможности отследить место спавна нужного итемса были так сказать он недостатка самоуверенности :ny_z_4: - это я уже сделал. И без линейного цикла. За советы - спасибо. А теперь о главном: можно ли добавлять в ПДА инфу не из заранее написанного строкового массива, а непосредственно из результата игровой ситауции? Вот допустим месссидж у меня выводится с определенной инфой полученной из скриптовой обработки ситуации -можно ли ее в ПДА тут же перекинуть? (так сказать из кратковременной памяти в долговременную - чтобы не забылась) Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 2 Января 2010 Kirag понял тебя. Спасибо за интересный способ :ny_thumbsup: попробую применить. Всех с Наступившим Годом белого Тигра! Gonarh что ж я так и предполагал изначально. только тут возникает один вопрос - а как скажем выводится инфа в рейтинг - где меняется кол-во трупаков на совести Меченого? Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 3 Января 2010 (изменено) Кто знает как интерпретировать логи с указанием на несуществующую строчку в файле типа такого - можете сами проверить - нет там такой строчки - файл заканчивается 357 строчкой [error]Arguments : LUA error: ...s.t.a.l.k.e.r\gamedata\scripts\dialog_manager.script:393: attempt to compare number with nil сам файл в геймдате с которой я работал - в ней не задействован. Вылет при попытке загрузить сохранку. или вот такой лог - тож при загрузке сохранки сделанной почти сразу после старта игры. FATAL ERROR [error]Expression : hFile>0 [error]Function : FileDownload [error]File : E:\stalker\sources\trunk\xrCore\FS.cpp [error]Line : 106 [error]Description : d:\program files2\s.t.a.l.k.e.r\gamedata\config\ есть в геймдате один новый конфиг файл в \config\misc - но он зареган в систем. PS: все это на чистом ТЧ+несколько моих файлов. Изменено 3 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 4 Января 2010 Спасибо всем за попытки интерпретировать мои логи :-) но проблема осталось - второй лог больше не вылазит (изменил подключение файла с доп. вещами - сделал его через инклуд в items), а вот первый лог с указанием на несущ. строчку в dialog_manager.script - все также же при загрузке квиксейва... Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 9 Января 2010 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 то поймешь как и что. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 10 Января 2010 (изменено) 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) все это имена функций из этого файла которые при их вызове давали крэш игры. Изменено 10 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 13 Января 2010 (изменено) Создал скриптовое меню со своей текстурой - работает. создал виджет со своей текстурой - должен появляться поверх меню после нажатия кнопки меню - не появляется. делал через 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 Вопрос: почему виджет не отображается? И вообще он должен именно поверх текстуры бэкграунда отображаться (то бишь текстуры фона самого меню) или нет? А то вдруг он под ней отображается - потому и не видно... Вопрос полностью решен. Изменено 14 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 14 Января 2010 (изменено) Подскажите как правильно отформатировать вывод текста. У меня текст выводится из таблицы lua куда пишется одной строкой. вывод идет на экран виджета - соответственно нужно чтобы он не выходил за его границы. я подсчитал что в строку на экране виджета влезает примерно 20 символов - то есть надо как то сделать перевод на новую строку после этого кол-ва символов. Либо после определенного кол-ва слов - влезает на виджет примерно три слова по горизонтали. пробовал и через string.format и string.gsub но ничего пока не вышло. и вообще мне интересно как форматируется вывод текста в диалогах - чтобы он в рамках меню был и при этом переносы правильные. Gonarh а то я не знаю. только строка то формируется скриптом - в разных местах из разных данных (+варианты без данных) и что мне через каждые три слова перевод каретки насовать? это не то. стал бы я заморчиваться если б все было так просто ... вопрос снимается - пришлось отказаться от CUIStatic() и сделать нужные настройки виджета (в том числе и выравнивание текста при выводе на виджет) в hml конфиге меню. Изменено 14 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 18 Января 2010 Вопрос не по теме: где на АМК тема с компасом - очень надо авторов спросить. Полчаса уже ковыряюсь - не могу отыскать. Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 19 Января 2010 (изменено) Очень насущный вопрос: у меня в таблицу как значения строковых индексов пишутся тексты - каждый в среднем по 250 символов. Всю таблицу надо сохранить и все тексты записать в нет-пакет - если каждый текст сохранять в отдельный пакет то он запишется? таблица заполняется так if not message[lname] then message[lname] ={} end table.insert(message[lname], {text_id = text, id = obj.id}) и кто-нить может дать пример функций сохранения и загрузки трехуровневых таблиц? с одномерными то все достаточно просто, двумерная посложнее, а вот как быть с трехмерной я пока в растерянности...там же получается нужно записать кол-во ключей в каждой таблице второго уровня... а вот как... А можно делать сохранение и загрузку не в биндере эктора, а в своем биндере? Изменено 19 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 19 Января 2010 (изменено) malandrinus ну почему сомнительная? Я сделал меню в виде коммуникатора, сделал рандомные тайники (ну очень рандомные - таких ни у кого нет :ny_ph34r_1: ) метка вешается только на половину тайников (рандомно) да и то та которая большая (и даже не на сам схрон, а на рандомный сопутствующий объект - либо пустой рестриктор либо еще че-нить эдакое...череп например - так что указание местонахождения схрона самое что ни на есть примерное, визуал тайника опять же рандомный, про хабар - вообще молчу). На остальные тайники выдается инфа о местонахождении - в тексте указывается владелец, лока, объект-примета, расстояние до него, азимут. Это все скрипт у меня считает. Соотвественно каждый мессидж при обыске трупа пишется в табличку, а не выдается на экран в левый нижний угол. Зайдя в меню можно каждый мессидж (но только для текущего уровня) в порядке очередности просмотреть на экране коммуникатора - кто-нить что-то такое реализовал? Теперь осталось только сделать, чтобы все эти мессиджы еще и сохранялись и не терялись при перезагрузке. Вот с этим пока заморочки...так как тексты пока ни разу не пробовал сохранять и не знаю какие тут подводные камни. За пояснения больше спасибо - пока я конечно не очень в этих нет пакетах разбираюсь - так что каждый твой пост многое что поясняет. Изменено 19 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 19 Января 2010 (изменено) malandrinus предложение конечно интересное - прежде всего потому что не пробовал :ny_wink: но возникает пара вопросов - при двоичном кодировании какая будет экономия - если на 30- 50% то нормально - большего мне и не надо. у меня строка мессиджа по уточненным данным занимает 120-150 символов - то есть два-три небольших предложения. В пакет объемом 8192 байт влезет 50-60 штук. Этого уже хватает если учесть что все неактуальные мессиджы будут удалятся - сразу после обыска схрона. То есть в идеале вполне достаточно сохранять их не более 100 штук - ну вряд ли геймер оставит необысканными более сотни тайников. Но я понятия не имею как переводить строку в бинарный код (и обратно). Максимум что я делал - это баловался со string.byte() и string.char() переводя буквы в десятичные коды ASCII и обратно. (для русского алфавита почему то не совпадают значения). (а с алгеброй буля я пока вообще не знаком...) в общем где бы мне информации поднабраться на этот счет? Изменено 19 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 19 Января 2010 (изменено) malandrinus что то типа того не совсем был подогнал текст под экран (но уже поправил) типа тайник на заднем плане - один из 15 или17 типов. Изменено 19 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 19 Января 2010 (изменено) Monnoroch я так и буду делать - биндер (с коллбеком на обыск тайника) у меня есть - вот я и думаю сохранять в нем. Пока попробовал сохранять на нем три вспомогательные таблички - а для мессиджей пока не могу написать функции сохранки и загрузки - табличка то трехмерная - не могу сообразить как правильно написать. а насчет девайса - не совсем понял. Изменено 19 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 20 Января 2010 (изменено) Monnoroch , malandrinus Был бы очень признателен если б кто-нить пояснил мне как это все будет работать - в смысле запись не на эктора, а на другой объект. Вот вписал я сюда функции сохранения и загрузки function my_binder:save(packet) get_console():execute("my_binder:save") object_binder.save(self, packet) taynik_rnd.morg_save(packet) taynik_rnd.parent_save(packet) taynik_rnd.metka_save(packet) end function my_binder:load(reader) get_console():execute("my_binder:load") object_binder.load(self, reader) taynik_rnd.morg_load(reader) taynik_rnd.parent_load(reader) taynik_rnd.metka_load(reader) end - сам биндер - (спасибо за пример malandrinus'у ) создан для моих схронов - вписан в их конфиг script_binding = new_binder.init получается сохранятся будет все на объекте конкретного схрона? Изменено 20 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 20 Января 2010 (изменено) 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 функции местами не менять. Изменено 20 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 22 Января 2010 malandrinus на данный момент "сомнительная" с технической точки зрения идея работает. Проверил сохранение примерно 30 мессиджей - буду записывать дальше - интересно на каком по счету вылетит. ну и проверочку потом поставлю перед записью, что в пакете еще есть место для записи.. мне интересно у меня все данные только в один пакет пишутся? то есть если они сохраняются через биндер объекта схрона, то пакет выделяется только один? на объект-схрон вообще или на каждый схрон - вот этого я пока не уяснил... если на объект вообще - то можно я так понимаю создать несколько однотипных биндеров и каждый вписать в конфиг одного из схронов (пока биндер общий на все - вписан в базовую секцию - остальные наследуются от основной) и затем в каждом биндере сохранять только одну из таблиц - а у меня их сейчас четыре штуки для разных данных.Так? Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 23 Января 2010 malandrinus за подробный пост большое спасибо. Не буду лукавить - ООП для меня пока темный лес. и пока сам не научусь создавать классы и методы классов - в голове полного понимания все равно не будет. PS: string.format конечно хорошая функция но...пока с этими модификаторами разберешься - плюнешь и конкатенацию сделаешь :ny_ph34r_1: вот как мне отформатировать строку из шести строк чтобы там и знаки препинания и пробелы были.. типа такой text = obj_name.." "..verb.." "..adjective.." "..substantive.." "..str.."."..habar.."." monnoroch решил я сделать девайс для сохранения - объект флешка, куда индивидуально сохраняю только таблицу мессиджей. Вылетает на охранении 50-го мессиджа (раньше на 45-ом когда сохранял общаком все таблицы в один объект). Не могу понять почему меня не срабатывает проверка перед записью в пакет, что в нем еще есть место. function flash_binder:save(packet) if 180 + packet:w_tell() > 8192 then news_manager.send_tip(db.actor, "Места для записи больше нет.", 0, "default", 10000) return end get_console():execute("flash_binder:save") object_binder.save(self, packet) taynik_rnd.message_save(packet) end Я что то не так сделал? вообще эту проверку сюда надо вписывать? Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 23 Января 2010 (изменено) malandrinus насчет string.format понял - все просто :ny_ph34r_1: спасибо. я пробелы поставить не додумался между "%s и %s - и у меня все слитно выходило. function message_save(p) local size= 0 size = table_maxn(message) --получим кол-во строковых ключей в таблице первого уровня p:w_u8(size) --запомним их кол-во for k, v in pairs(message) do p:w_stringZ(k) --запомним имена строковых ключей size= 0 size = table_maxn(v) --запомним кол-во ключей в таблицах второго уровня p:w_u8(size) --запишем кол-во целочисленных ключей в этих таблицах --теперь проитерируем сразу таблицы третьего уровня - где ключи - числа, а значения таблицы for index, tab in ipairs(v) do p:w_stringZ(tab.text_id) --запишем значение первого ключа p:w_u16(tab.id) --запишем значение второго ключа end end end table_maxn(tbl) - это моя функция которая возвращает кол-во ключей таблицы - использую в основном для строковых ключей(хотя годится и для целочисленных) - почему то разработчик LUA не позаботился о такой мелочи - вот и приходится строковые считать через отдельную функцию. 180 байт это типа примерный максимум который будет записан - то есть длина одного мессиджа + ключи таблицы. вот я и проверяю - если 180 байт+ то что уже есть (packet:w_tell() возвращает ведь текущую позицию записи - то есть байт на котором остановилась последняя запись) меньше размера пакета то пишем. Иначе - нет. Но сейчас понял что это как то не то -- надо получать точный размер того что придется записать - буду исправлять. ЗЫ: вопрос не по теме - как подключать в SCITE библиотеку классов? вроде require (classlib") - только куда это вписать и надо ли модуль создавать...и саму библиотечку куда лучше положить. Изменено 23 Января 2010 пользователем Garry_Galler Поделиться этим сообщением Ссылка на сообщение
Garry_Galler 7 Опубликовано 23 Января 2010 malandrinus так как я в этом пока не разбираюсь, то напишу как написано на сайте откуда скачал. "Библиотека построения именованных классов. Самая продвинутая реализация классов и практически всех принципов ООП включая виртуальные классы от разработчика LUA." Поделиться этим сообщением Ссылка на сообщение