Все посты %s в %S - AMK Team
Перейти к контенту

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


Halford

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

malandrinus

насчет функции из ЗП - жаль конечно, ну да ладно - я уже обошелся и без нее.

А таблицу storage я уже и так разобрал по кусочкам и могу и нее выдернуть усе что угодно.

(кому надо могу скрипт "досье на всех NPC" выложить)

мои сомнения насчет возможности отследить место спавна нужного итемса были так сказать он недостатка самоуверенности :ny_z_4: -

это я уже сделал. И без линейного цикла. За советы - спасибо.

 

А теперь о главном: можно ли добавлять в ПДА инфу не из заранее написанного строкового массива, а непосредственно из результата игровой ситауции? Вот допустим месссидж у меня выводится с определенной инфой полученной из скриптовой обработки ситуации -можно ли ее в ПДА тут же перекинуть? (так сказать из кратковременной памяти в долговременную - чтобы не забылась)

 

Поделиться этим сообщением


Ссылка на сообщение

Kirag

понял тебя. Спасибо за интересный способ :ny_thumbsup: попробую применить.

Всех с Наступившим Годом белого Тигра!

 

Gonarh

что ж я так и предполагал изначально.

только тут возникает один вопрос - а как скажем выводится инфа в рейтинг - где меняется кол-во трупаков на совести Меченого?

Поделиться этим сообщением


Ссылка на сообщение

Кто знает как интерпретировать логи с указанием на несуществующую строчку в файле

типа такого - можете сами проверить - нет там такой строчки - файл заканчивается 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: все это на чистом ТЧ+несколько моих файлов.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Спасибо всем за попытки интерпретировать мои логи :-) но проблема осталось - второй лог больше не вылазит (изменил подключение файла с доп. вещами - сделал его через инклуд в items), а вот первый лог с указанием на несущ. строчку в dialog_manager.script - все также же при загрузке квиксейва...

Поделиться этим сообщением


Ссылка на сообщение

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 то поймешь как и что.

 

Поделиться этим сообщением


Ссылка на сообщение

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)

 

все это имена функций из этого файла которые при их вызове давали крэш игры.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Создал скриптовое меню со своей текстурой - работает.

создал виджет со своей текстурой - должен появляться поверх меню после нажатия кнопки меню - не появляется.

делал через 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

 

Вопрос: почему виджет не отображается?

И вообще он должен именно поверх текстуры бэкграунда отображаться (то бишь текстуры фона самого меню) или нет?

А то вдруг он под ней отображается - потому и не видно... <_<

 

Вопрос полностью решен.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Подскажите как правильно отформатировать вывод текста.

У меня текст выводится из таблицы lua куда пишется одной строкой.

вывод идет на экран виджета - соответственно нужно чтобы он не выходил за его границы.

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

пробовал и через string.format и string.gsub но ничего пока не вышло.

 

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

 

Gonarh

а то я не знаю.

только строка то формируется скриптом - в разных местах из разных данных (+варианты без данных)

и что мне через каждые три слова перевод каретки насовать? это не то.

стал бы я заморчиваться если б все было так просто ...

 

вопрос снимается - пришлось отказаться от CUIStatic() и сделать нужные настройки виджета (в том числе и выравнивание текста при выводе на виджет) в hml конфиге меню.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Вопрос не по теме: где на АМК тема с компасом - очень надо авторов спросить. Полчаса уже ковыряюсь - не могу отыскать.

Поделиться этим сообщением


Ссылка на сообщение

Очень насущный вопрос:

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

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

таблица заполняется так

if not message[lname] then

message[lname] ={}

end

table.insert(message[lname], {text_id = text, id = obj.id})

 

и кто-нить может дать пример функций сохранения и загрузки трехуровневых таблиц?

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

 

А можно делать сохранение и загрузку не в биндере эктора, а в своем биндере?

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

malandrinus

ну почему сомнительная?

Я сделал меню в виде коммуникатора, сделал рандомные тайники (ну очень рандомные - таких ни у кого нет :ny_ph34r_1: )

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

На остальные тайники выдается инфа о местонахождении - в тексте указывается владелец, лока, объект-примета, расстояние до него, азимут. Это все скрипт у меня считает. Соотвественно каждый мессидж при обыске трупа пишется в табличку, а не выдается на экран в левый нижний угол. Зайдя в меню можно каждый мессидж (но только для текущего уровня) в порядке очередности просмотреть на экране коммуникатора - кто-нить что-то такое реализовал? Теперь осталось только сделать, чтобы все эти мессиджы еще и сохранялись и не терялись при перезагрузке.

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

 

За пояснения больше спасибо - пока я конечно не очень в этих нет пакетах разбираюсь - так что каждый твой пост многое что поясняет.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

malandrinus

предложение конечно интересное - прежде всего потому что не пробовал :ny_wink:

но возникает пара вопросов - при двоичном кодировании какая будет экономия - если на 30- 50% то нормально - большего мне и не надо.

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

В пакет объемом 8192 байт влезет 50-60 штук. Этого уже хватает если учесть что все неактуальные мессиджы будут удалятся - сразу после обыска схрона. То есть в идеале вполне достаточно сохранять их не более 100 штук - ну вряд ли геймер оставит необысканными более сотни тайников.

 

Но я понятия не имею как переводить строку в бинарный код (и обратно). Максимум что я делал - это баловался со string.byte() и string.char() переводя буквы в десятичные коды ASCII и обратно. (для русского алфавита почему то не совпадают значения).

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

в общем где бы мне информации поднабраться на этот счет?

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

malandrinus

что то типа того

 

77960180.th.jpg

 

не совсем был подогнал текст под экран (но уже поправил)

 

типа тайник на заднем плане - один из 15 или17 типов.

74337133.th.jpg

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

Monnoroch

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

а насчет девайса - не совсем понял.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

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

получается сохранятся будет все на объекте конкретного схрона?

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

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

 

функции местами не менять.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

malandrinus

на данный момент "сомнительная" с технической точки зрения идея работает.

Проверил сохранение примерно 30 мессиджей - буду записывать дальше - интересно на каком по счету вылетит.

ну и проверочку потом поставлю перед записью, что в пакете еще есть место для записи..

мне интересно у меня все данные только в один пакет пишутся?

то есть если они сохраняются через биндер объекта схрона, то пакет выделяется только один? на объект-схрон вообще или на каждый схрон - вот этого я пока не уяснил...

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

Поделиться этим сообщением


Ссылка на сообщение

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

 

Я что то не так сделал? вообще эту проверку сюда надо вписывать?

Поделиться этим сообщением


Ссылка на сообщение

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") - только куда это вписать и надо ли модуль создавать...и саму библиотечку куда лучше положить.

Изменено пользователем Garry_Galler

Поделиться этим сообщением


Ссылка на сообщение

malandrinus

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

"Библиотека построения именованных классов. Самая продвинутая реализация классов и практически всех принципов ООП включая виртуальные классы от разработчика LUA."

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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