Это популярное сообщение. Dennis_Chikin 3 658 Опубликовано 16 Мая 2014 Это популярное сообщение. Поделиться Опубликовано 16 Мая 2014 Ковыряемся в файлах ТЧ Прежде чем писать в тему - внимательно читаем первый пост, и пользуемся поиском. Возможно, ответ на Ваш вопрос уже есть. Касательно телепатии: если Вы передаете Ваши файлы телепатическим путем - ответы будут передаваться тоже телепатически. Если Вы предлагаете угадать, отчего у Вас в подвале происходит странный стук - ответ будет передан стуком. 4 8 6 12 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Monnoroch 6 Опубликовано 24 Января 2010 Поделиться Опубликовано 24 Января 2010 _Призрак_, код где? Ссылка на комментарий
Garry_Galler 7 Опубликовано 24 Января 2010 Поделиться Опубликовано 24 Января 2010 Vano_Santuri Что именно то вылетает? какой скрипт? в предыдущем посте чуток ошибся - таблицу для очистки надо надо объявлять без local так как она уже объявлена - local нужно при первом объявлении писать. и все прочие переменные изначально задавай всегда как local и следи чтобы переменные не пересекались по именам там где не надо. в общем - все должно работать если все правильно сделать. так что ищи ошибки у себя. Ссылка на комментарий
Vano_Santuri 33 Опубликовано 24 Января 2010 Поделиться Опубликовано 24 Января 2010 Garry_Galler, ясно! У меня осталось исключительно два простых вопроса: 1) Допустим в одном скрипте несколько функций , и у каждой своя таблица(имема таблиц разные) , они(таблицы) будут корректно заполнятся?Независимо друг от друга? И есть ли ограничение на количество табличек на один скрипт? Да и при сохранении\загрузки твоими функциями каждая таблица будет отдельно сохраняться/загружаться? Без ошибок и багов? Или функции способны обработать исключительно 1 таблицу в одном скрипте? 2) Если у меня несколько функций, но каждой присвоена одна и та же таблица, то данные будут сохраняться в эту таблицу? Загружаться из нее, и корректно ли это будет? Что-то кончается, что-то начинается... Ссылка на комментарий
Garry_Galler 7 Опубликовано 24 Января 2010 Поделиться Опубликовано 24 Января 2010 (изменено) _Призрак_ А мозги включить? должно быть так 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 в сталкере куда пишется огромное кол-во данных об онлайн объектах) - сделать например двумерную или трехмерную таблицу. И писать в нее из разных скриптов разные данные. Я вот сейчас использую трехмерные для большого кол-ва данных. Но работа с такими таблицами требует опыта. И сохранять их немного сложнее чем простые одномерные. Изменено 24 Января 2010 пользователем Garry_Galler Ссылка на комментарий
Vano_Santuri 33 Опубликовано 24 Января 2010 Поделиться Опубликовано 24 Января 2010 (изменено) Garry_Galler, Хотел еще спросить каким образом связаны между собой function morg_save(p) local i = 0 for k,v in pairs(morg) do i = i + 1 end p:w_u8(i) for k, v in pairs(morg) do p:w_u16(k) 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 фнкции сохранения \загрузки таблицы с этой функцией. local tbl = {} function zaton_anom() lv_new = math.random(1700000) pos_new = level.vertex_position(lv_new) local obj = create_anomalies("zone_mine_electric_dinamic",3,pos_new.x,pos_new.y,pos_new.z,lv_new,0) table.insert(tbl,obj.id) end function destroi_anomalies() for i = 1,#tbl do alife():release(alife():object(tbl[i]), true) end end Непонятно, как они локализуют именно эту таблицу? Тем что они в одном скрипте?Или как обычно они должны иметь общую переменную, но эту переменную i я вижу только в загрузке таблицы и удалении аномалий, как функция сохранения локализует(находит, определяет ) функцию спавна, заполнения таблицы?Если сохранение таблицы локализуется функцией сохранения только тем, что они находятся в одном скрипте, тогда если будет несколько функций , то не выйдет. И не мог бы ты рассказать как привязывать таблицу к функции сохранения\загрузки? Если нетрудно конечно? И вот сразу неудачный эксперимент, добавил обе функции в биндер актора вот в таком виде: anom.morg_save(p) И morg_load® ВЫЛЕт такого вида(ничего не спавнил, исключительно новая игра , даже не загрузилась) FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ....l.k.e.r.call_of_pripit\gamedata\scripts\anom.script:37: attempt to index local 'r' (a nil value) потом немного подумал и сделал так anom.morg_save() и anom.morg_load() игра даже загрузилась, но через некоторое количество секунд [quote]stack trace: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....l.k.e.r.call_of_pripit\gamedata\scripts\anom.script:26: bad argument #1 to 'pairs' (table expected, got nil)[/quote] О ччем это говорит? Я безнадежен? Изменено 24 Января 2010 пользователем Vano_Santuri Что-то кончается, что-то начинается... Ссылка на комментарий
Garry_Galler 7 Опубликовано 24 Января 2010 Поделиться Опубликовано 24 Января 2010 (изменено) Vano_Santuri а подумать? Что сохраняют и загружают функции? ТАБЛИЦУ (или точнее ее данные). Значит как эти функции связаны с таблицей? ЕЕ Именем. У меня таблица называлась morg. А у тебя как? Надо же вписывать имя Своей Таблицы. Ребята ну вы думайте прежде чем что то делать - а то вам даешь рабочие примеры, а вы их тупо копируете без адаптации под своей скрипт. Так же нельзя. На всякий случай правило: функции сохранения и загрузки должны (для удобства) находиться после всех основных функций которые эту таблицу эксплуатируют - то есть нужно следить чтобы таблица была доступна для чтения в функциях сохранения и загрузки. Само объявление таблицы лучше вынести в самый верх файла - по крайней мере она должна находиться на уровне выше функции где она впервые используется. Иначе она не будет читаться в этом скрипте\коде - и мы получаем вылет что значение переменной равно nil Удалять аргументы из скобок - это значит сделать функцию бесполезной. если вызываемая функция ничего не принимает - тогда что собственно она будет сохранять? И что загружать? Неплохо было бы подучить правила lua - почитать руководство по языку на официальном сайте (и вообще основы программирования - при таких знаниях далеко не уедешь). Я не программист - однако прежде чем начать писать какие либо серьезные скрипты для сталкера, вызубрил ВСЕ основные правила которые нужно соблюдать для грамотного написания скриптов - правила объявления переменных, области видимости переменных, области разрушения переменных, типы переменных и т.д. Вписывать вызов нужно туда куда я указал (в функции save и load, а не в update) в таком виде имя_файла.имя_функции_сохранения(packet) - в save имя_файла.имя_функции_загрузки(reader) - в load (в одно и тоже место для синхронизации чтения и сохранения) Обзор методов работы с нет пакетами есть в теме Справочник по функциям и классам. Изменено 24 Января 2010 пользователем Garry_Galler Ссылка на комментарий
Malandrinus 615 Опубликовано 24 Января 2010 Поделиться Опубликовано 24 Января 2010 (изменено) Garry_Galler, Внесу небольшое уточнение насчёт порядка расположения объявлений в модуле. В принципе, порядок не должен быть так важен. Дело в том, что последовательность работы с модулем следующая: При первом обращении модуль загружается и компилируется. При этом происходит выполнение операторов, которые находятся в глобальной области. Объявления таблиц и функций - это по сути своей выполняемые операторы, поэтому в этот момент (при загрузке модуля) важно, чтобы объявление А, которое использует объект Б, стояло бы после объявления объекта Б. Когда загрузка модуля закончена, то все задекларированные объекты - это по сути записи в таблице и как такового порядка уже не имеют. Поэтому после загрузки модуля уже не важно, в каком порядке таблицы и функции расположены в файле - они могут ссылаться друг на друга без проблем. Вот иллюстрация сказанного. Пусть это будет файл my_module.script: local a = 1 local b = a * 2 local t = {} t.a1 = b -- объявления a, b, t должны быть строго в таком порядке, поскольку выполняются последовательно при загрузке модуля function fun1() fun2() -- можно ссылаться на ещё не созданную функцию end function fun2() end -- если я вызываю fun1 снаружи, то вызов my_module.fun1() должен сработать без проблем -- поскольку сначала произойдет загрузка модуля и создадутся и fun1 и fun2, -- а только потом произойдёт собственно вызов -- а вот так нельзя, поэтому дальше закомментировано --[[ function fun11() fun22() end fun11() -- этот вызов произойдёт при загрузке модуля до объявления функции fun22, поэтому будет сбой function fun22() end ]] Хотя конечно в любом случае не стоит превращать код в малочитаемую кашу и всё-таки надо как-то упорядочивать объявления. Изменено 25 Января 2010 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
valdemar093 0 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 Подскажите пожалуйста, какое значение несут ссобой файлы prefetch.ltx и _prefetch.ltx. Связаны ли они с игрой по интернету? Ссылка на комментарий
Starter 238 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 valdemar093 в prefetch.ltx там пишутся все модели какие применяются в игре например weapons\sig550\wpn_sig550 weapons\sig550\wpn_sig550_hud, в _prefetch.ltx вроде но врать не буду там старые пути и так что игра их не применяет. Добавлено через 3 мин.: Может кто переконвериторовать видяху для сталкера? Сам пробовал через VirtualDub но там кодеков нужных нету. Видяху скину по асе или файлообменнику, просто переконверитовать в ogm. Заранее спасибо! ЯДиск папка с крутым схроном! Ссылка на комментарий
Garry_Galler 7 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 (изменено) malandrinus не знал что код именно так загружается. Но все таки важность порядка мне кажется от этого не уменьшается - не видел пока ни один код, где бы переменные объявлялись где попало в файле - это ж потом черт ногу сломит в 1000 строчном файле если их где попало насовать. ...Стал разбираться с абстрактными типами данных и их конкретными воплощениями – и пришел к выводу что таблицы lua (как с числовыми, так и со строковыми ключами) как АТД это ассоциативный массив (главный признак хранение пар key=value) , а как структура данных – хэш-таблица. И если она индексируется целочисленными ключами в математическом порядке – то в таком случае ее можно называть хэш-таблицей с прямой адресацией? (для которой невозможны коллизии). Впрочем интересно мне следующее: что из себя представляют файлы конфигов с секциями? По АТД вроде как списки – но списки делятся на разные виды – односвязные (однонаправленные), двусвязные(двунаправленные), кольцевые, развернутые и т.д. В общем как вообще правильно называть структуру данных типа такой [name_list] ammo_9x18_fmj = 0.9 ammo_9x18_pmm = 0.9 ammo_9x19_pbp = 0.9 ammo_9x19_fmj = 0.9 ammo_11.43x23_hydro = 0.9 которая парсится по имени секции (в последовательности от 0 и до n-1), а нужные элементы ищутся по оверрайду(ключу)), либо номеру(индексу) строки(линии). Изменено 25 Января 2010 пользователем Garry_Galler Ссылка на комментарий
Vano_Santuri 33 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 Garry_Galler, malandrinus, Monnoroch, Ребят, я понимаю что оффтоплю, но хочу вас поблагодарить, спасибо вам огромное. У меня получилось, все спавнится, сохраняется, удаляется , сохраняется и НИЧЕГО не Вылетает, игра вообще не висит, удаление очень быстрое, таблица обновляется. Вобщем спасибо вам, что раскрыли глаза такому как мне, сейчас учу синтаксис, и многие вопросы сами отпали. Еще раз спасибо! Что-то кончается, что-то начинается... Ссылка на комментарий
Monnoroch 6 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 вот я ща скажу,наверное тут подумают,что оффтоп,но это не оффтоп,это основа прогарммирования. Vano_Santuri,надо СНАЧАЛА учить синтаксис а ПОТОМ писать скрипты Ссылка на комментарий
lekzd 1 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 А можно ли сделать скриптовый hit физическому объекту так, чтобы он полетел в строго заданную сторону (может даже и вверх)? Если можно, то как пользоваться функцией? i-igroman.ru - Мой, принципиально новый сайт о компьютерных играх Ссылка на комментарий
Malandrinus 615 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 Но все таки важность порядка мне кажется от этого не уменьшаетсяГолосую всеми конечностями. Ещё бы всё программеры взяли за правило прилично оформлять свой код. Впрочем, думаю коммунизм наступит раньше =) что таблицы lua ... как АТД это ассоциативный массив ..., а как структура данных – хэш-таблица. И если она индексируется целочисленными ключами в математическом порядке – то в таком случае ее можно называть хэш-таблицей с прямой адресацией? (для которой невозможны коллизии). Насколько мне известно, в случае индексации от единицы и без разрывов хеш-таблицы вообще не используются, а значения хранятся просто как массив. Впрочем, это только внутренняя оптимизация. Ничто не мешает и в этом случае считать таблицу Lua ассоциативным массивом общего вида. Впрочем интересно мне следующее: что из себя представляют файлы конфигов с секциями? По АТД вроде как списки – но списки делятся на разные виды – односвязные (однонаправленные), двусвязные(двунаправленные), кольцевые, развернутые и т.д. Ничто из этого =) Поскольку это формат файла, т.е. способ интерпретации непрерывной последовательности байтов. Когда ты читаешь эти данные из файла, то просто выбираешь для их хранения наиболее удобную структуру. На мой взгляд что-то вроде такого: ini_data = { [<имя секции 1>] = {[<ключ 1>] = <значение 1>, [<ключ 2>] = <значение 2>, [<ключ 3>] = <значение 3>, }, [<имя секции 2>] = {[<ключ 4>] = <значение 4>, [<ключ 5>] = <значение 5>}, -- и т.д. } Т.е. как видишь не одна таблица, а их комбинация. Хотя на кой надо хранить в программе все данные из внешнего файла? Кроме того, формат файла допускает и отступление от такого вида. Как ты верно заметил, внутри секции можно получать данные не по ключу, а по номеру строки. Это надо главным образом для того, чтобы читать секции такого вида: [some_section] value1 value2 value3 ; и т.д. т.е. в этом случае вид "ключ/значение" не соблюдается. Используется это в частности для обхода ограничения, которое не позволяет получить список секций в файле. Я могу завести специальную секцию, в которой таким образом перечисляю идущие далее секции, как бы регистирую их. В этом случае, адекватной структурой данных для этой секции будет список, массив или множество. А можно ли сделать скриптовый hit физическому объекту так, чтобы он полетел в строго заданную сторону (может даже и вверх)? Можно задать и направление и импульс. Вроде как пример был в "справочнике" в этом посте. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Gonarh 5 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 [оффтоп]кошмар, приплыли... Че-то эта тема напоминает мне форум программеров [/оффтоп] 118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105 Ссылка на комментарий
Malandrinus 615 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 Monnoroch, Gonarh, злые вы =) По поводу "сначала учи, потом пиши". Рекомендую взглянуть, как реализована (разработчиками) функция _g.IsMonster в ТЧ и как она же в ЗП. Увидели? Следуя озвученному правилу, им бы следовало застрелиться, а не выпускать такое в свет. Насчёт оффтопа. Ну не здесь про скрипты, допустим. А где тогда? На форуме есть более адекватное место? Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Monnoroch 6 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 (изменено) malandrinus, нене,все верно,тут в общем то программисты на движке сталка и есть основная аудитория.По конфигам то что - там все элементарно. Просто все-таки сначала учить оно необходимо...ну хоть чуток Добавлено через 2 мин.: lekzd, local h = hit() h.impuls = 10000000000 -- Оо а вот по поводу направления - знаю,что можно ударить о кости,а вот насчет вектора - сказать не могу. === а,да,видать можно. Изменено 25 Января 2010 пользователем Monnoroch Ссылка на комментарий
Malandrinus 615 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 Monnoroch, если надо просто пнуть предмет, то лучше пользоваться не хитом, а методами класса physics_shell. Импульс в параметрах хита хоть и есть, но действовать на живых не будет, поскольку они под анимацией. Импульс вроде как подействует только тогда, когда хит будет смертельный и начнёт действовать регдолл анимация (собственно физика). Впрочем не уверен, надо проверить. В любом случае для тушек и физических объектов смысла заморачиваться с хитом нет - что им до химического или "кусачего" урона? А через физическую оболочку можно так: obj:get_physics_shell():apply_force(x,y,z) здесь метод хоть и называется "приложить силу", но на самом деле имеет смысл "добавить импульс", т.е. тот-же смысл, что и параметр impulse класса hit. Чтобы изменить скорость объекта на V надо приложить импульс, равный m*V. m - масса. Физическую массу можно узнать методом mass. Чтобы пнуть предмет в вертикальном направлении со скоростью 10 м/с делаем так obj:get_physics_shell():apply_force(0,obj:mass()*10,0) Только учтите, что наличие оболочки надо обязательно проверять. Вспомнил вот. Хит тоже можно использовать, поскольку он даёт возможность пнуть в произвольную кость, что с помощью оболочки не сделать. Я так пытался управлять вращением объекта, пинал в две разных кости в противоположном направлении с равным импульсом =) Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
lekzd 1 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 (изменено) malandrinus, Родилась у меня идея - я нашел способ определения предметов под курсором а благодаря этому можно реализовать (в теории) гравипушку подтаскиваем объект к себе когда он подлетает на пару "метров" от нас - удаляем его и делаем копию в переменной в это время на худ выводим текстуру с "висящим" в воздухе объектом (бочкой, ящиком, бочонком, и т.п.) после повторного нажатия клавиши (пока это будет tab) предмет спавнится немного над ГГ и швыряет в нужную сторону (этот момент даже можно заменить на некое подобие гранат с очень долгим временем до взрыва - т.е. подтащили предмет и в слоте уже нужная "граната") вот только у меня на это времени пока не будет....но буду медленно копать как закончу с ХУДом правда если кому интересно попробовать Изменено 25 Января 2010 пользователем lekzd i-igroman.ru - Мой, принципиально новый сайт о компьютерных играх Ссылка на комментарий
Malandrinus 615 Опубликовано 25 Января 2010 Поделиться Опубликовано 25 Января 2010 lekzd, если уж подтащить удалось, то пусть висит перед актором сам предмет. Зачем его удалять? Так и как определять предмет под курсором? Из примитивных способов на ум приходит перебор всех онлайновых с определением того, что попадает в конус взгляда. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти