В данной теме вы можете задавать любые вопросы касательно S.T.A.L.K.E.R. моддинга
• Не флудить • Предварительно просматривайте раздел, ведь ответ на ваш вопрос может быть там • В своем вопросе указывайте платформу моддинга — Тень Чернобыля, Чистое небо или Зов Припяти
1. Какая стоит игра, с каким патчем? 2. Какой мод, версия мода? 3. Что правили своими ручками? 4. Лог вылета и последние 25 строк (помещать под спойлер).
Структура папок и файлов в корневом каталоге игры:
...\S.T.A.L.K.E.R\gamedata\anims – папка содержит исполнительные файлы эффектов (например от ПНВ).
...\S.T.A.L.K.E.R\gamedata\config – папка содержит основные конфигурационные файлы (т. е. большинство настроек игры)
...\S.T.A.L.K.E.R\gamedata\meshes – содержит модели игровых предметов и персонажей...
...\S.T.A.L.K.E.R\gamedata\scripts – папка со скриптами (рабочими файлами содержащими в себе наборы функций) – основная папка, отвечающая за ответные действия игры и действия производимых игроком в игре.
...\S.T.A.L.K.E.R\gamedata\shaders – папка содержит в себе конфигурационные файлы шейдеров.
...\S.T.A.L.K.E.R\gamedata\sounds – здесь находятся все звуки игры (разложены по своим каталогам и папкам)
...\S.T.A.L.K.E.R\gamedata\spawns – содержит файл спавна – очень важный файл – не трогать без нужды!!!
...\S.T.A.L.K.E.R\gamedata\textures – содержит разложенные по каталогам и папкам текстуры используемые в игре.
Теперь разберем папки в каталоге «config»
...\S.T.A.L.K.E.R\gamedata\config\creatures - содержит массу конфигурационных файлов, в основном отвечающих за взаимодействие Главного героя игры (в дальнейшем ГГ) и прочего окружения в игре и ТТХ самого ГГ.
...\S.T.A.L.K.E.R\gamedata\config\gameplay – содержит конфиг. файлы персонажей игры (НПС) отвечающие за внешний вид, статус, снаряжение. Файлы: character_desc_ххх (где ххх – название локации) и character_desc_general (отвечает за зомбированного персонажа). Также содержит файлы диалогов и профилей НПС.
…\S.T.A.L.K.E.R\gamedata\config\misc – конфиг.файлы торговцев (папки с именами торговцев), артефактов, брони, квестовых предметов, уникальных предметов, файл отвечающий за награды за автозадания, файл эффектов (алкоголизма, ранения, ПНВ и прочих)...
…\S.T.A.L.K.E.R\gamedata\config\mp – среди прочих содержит важный файл mp_ranks – отвечающий за выпадение оружия и патронов из рук ГГ и НПС – без прописывания добавляемого в игру оружия в этот файл при выпадении нового оружия из рук ГГ\НПС будут следовать вылеты.
…\S.T.A.L.K.E.R\gamedata\config\text\rus – содержит файлы описаний всего и вся находящегося в игре (брони, артефактов, оружия, предметов и прочего).
…\S.T.A.L.K.E.R\gamedata\config\weapons – содержит конфиг.файлы оружия и боеприпасов используемых в игре.
…\S.T.A.L.K.E.R\gamedata\config\weathers – содержит конфиг.файлы настройки погоды на локациях.
Теперь немного подробнее о файлах.
...\S.T.A.L.K.E.R\gamedata\config\misc:
Папка shop_ххх (ххх – имя торговца) – содержит конфиг.файлы ассортимента торговца.
outfits – содержит секции конфигов костюмов.
artefacts - содержит секции конфигов артефактов.
items - содержит секции конфигов предметов.
monster_items - содержит секции конфигов частей монстров
postprocess - содержит секции конфигов пост. процессов (например: ПНВ).
quest_items - содержит секции конфигов квестовых предметов.
task_manager - содержит секции наград за автоквесты.
unique_items - содержит секции конфигов уникального оружия и костюмов.
Просто засомневался, почему там просто названия стволов, а не их модели. Вот решил спросить, может там нюансы какие-то.
можешь прописывать пути к визуалам в соответствующей секции пока не надоест а можешь прописывать секции предметов и оружия и все что в них указано будет автоматически загружено во время загрузки локации.
local zone = db.zone_by_name["yan_smart_terrain_6_4_sr_light"] printf("ZONE: %s", zone)
Объясните, пожалуйста, почему подобная конструкция внутри цикла while выдает "nil", а без него "userdata"? Как получить "yan_smart_terrain_6_4_sr_light"?
Сообщение отредактировал yobakun - Понедельник, 18.12.2017, 01:39
function generate_position( smart_name, max_offset_x, max_offset_y, max_offset_z )
local zone_off = {"pri_sr_autovokzal", "sr_cinema_out_anomaly"} -- таблица со смартами
-- здесь различные проверки на валидность позиции pos = vector( ):set( pos_x, pos_y, pos_z ) local lvid = level.vertex_id( pos )
for k,v in pairs( zone_off ) do local zone = db.zone_by_name[ v ] if zone then -- всегда nil if not zone:inside( position ) then if ( lvid < 4294967295 ) then pos = level.vertex_position( lvid ) valid_lvid = true end end end end
-- либо выходим из цикла после определенного кол-ва попыток num_tries = (num_tries - 1) if ( (num_tries <= 0) and (valid_lvid ~= true) ) then printf( "DA: Unable to generate valid lvid pos, aborting" ) return end end
-- При успешном выполнении возвращаем позицию: return pos end
Почему в данном случае zone = nil? Опечаток нет, скрипт полностью работает, кроме проверки на зону и позиции внутри нее.
yobakun, уверен, что нет ошибок? Чрезмерное количество end. Из-за чего твоё понимание сиего скрипта сводится на нет.
Какой, извините уж, к чёрту, выход из цикла?
Код
-- либо выходим из цикла после определенного кол-ва попыток num_tries = (num_tries - 1) if ( (num_tries <= 0) and (valid_lvid ~= true) ) then printf( "DA: Unable to generate valid lvid pos, aborting" ) return end
Прямой выход из функции при удовлетворении условий. Да и откуда мы берём переменную num_tries? Ладно, предположим, что она глобальная.
И если уж занимаетесь копированием скриптов, то хотя-бы вникайте в суть. На этом всё.
А по-поводу вопроса, вы уверены, что написанные вами названия зон существуют?
Нил - это то, что возвращает ф-ция, а юзердэйта - это тип данных.
Не понял. Функция может возвращать любые данные. По умолчанию, да это nil. Userdata это любые, как я понял, не зарезервированные в луа данные, например классы(могу ошибаться).
ЦитатаGraff46 ()
В Луа такое бывает, если какой то объект приводить к строке, то выведится его тип.
Не бывает, а должен вывестись. Ну это в чистом луа. Вообще при конкатенации движок будет пытаться, если это возможно, привести данные к строке. Также, имхо, приведение типов к строке очень грамотно выполнено в Java, там developer сам решает, как преобразовать объект к строке. Путём добавления в класс метода toString, но это уже другая история. При конкатенации нил к строке будет ошибка, так как мы не может прибавить ничего к чему-то. Это как что-то делить на ноль.
Добавлено (18.12.2017, 16:10) --------------------------------------------- BoBaH_671, скорее всего рестрикторами.
Сообщение отредактировал buffy - Понедельник, 18.12.2017, 16:11
buffy, это не полная функция, неужели не очевидно? Вот полная:
Код
function generate_position( smart_name, max_offset_x, max_offset_y, max_offset_z ) -- Get the smart terrain: local smart = SIMBOARD.smarts_by_names[smart_name] if not ( smart ) then printf( "DA: Unable to generate positional data, specified smart location does not exist!" ) return end
-- Try to generate valid positional data on the ground: local num_tries = 64 -- Prevents infinite loop local pos = vector( ):set( 0, 0, 0 ) local valid_lvid = false local zone_off = {"pri_sr_autovokzal","pri_sr_dom_kult","pri_sr_stadion","pri_sr_hotel","pri_sr_kooptorg", "pri_sr_cinema","pri_sr_port","pri_sr_college","pri_sr_dom_byta","pri_sr_old_kbo", "pri_sr_hospital","pri_sr_berezka","pri_sr_laundry","pri_sr_school","pri_sr_book", "pri_sr_market","pri_sr_detsad","pri_sr_gastronom","pri_sr_technikum","pri_sr_kpss","pri_sr_killer", "sr_sklad_garag","sr_dom_kult_left","sr_cinema_out_anomaly"} while ( (valid_lvid ~= true) and (num_tries > 0) ) do -- Randomly offset anomaly x-position from center of smart terrain: local offset_x = (max_offset_x * math.random( )) if (math.random( ) < 0.5) then offset_x = -(offset_x) end local pos_x = (smart.position.x + offset_x)
-- Randomly offset anomaly y-position from center of smart terrain: local offset_y = (max_offset_y * math.random( )) if (math.random( ) < 0.5) then offset_y = -(offset_y) end local pos_y = (smart.position.y + offset_y)
-- Randomly offset anomaly z-position from center of smart terrain: local offset_z = (max_offset_z * math.random( )) if (math.random( ) < 0.5) then offset_z = -(offset_z) end local pos_z = (smart.position.z + offset_z)
-- Set anomaly position at location vertex and check if valid: pos = vector( ):set( pos_x, pos_y, pos_z ) local lvid = level.vertex_id( pos )
for k,v in pairs( zone_off ) do local zone = db.zone_by_name[ v ] if zone then if not zone:inside( pos ) then if ( lvid < 4294967295 ) then pos = level.vertex_position( lvid ) valid_lvid = true end end else log ("zone is nil!!!") end
end
-- Decrement the number of tries left: num_tries = (num_tries - 1) if ( (num_tries <= 0) and (valid_lvid ~= true) ) then printf( "DA: Unable to generate valid lvid pos, aborting" ) return end end
-- Return the position vector: return pos end
Верно, рестрикторы. Суть в том, что zone возвращает nil, соответственно скрипт не работает.
yobakun, ну коль zone внутри функции равно nil, значить такой зоны нет в онлайне - очевидно же. Таблицы в файле db хранят в себе онлайновые объекты. buffy, не нужно плести паутину и сравнивать компилируемые типизированные языки, с интерпретируемыми и не типизированными. Отвратительная аналогия с Java. P.S. По секрету - классов в Lua нет.
Всем доброго времени. Вопрос по ЧН, нужно сделать 3х персов бессмертными, 2х торгашей и меха на барахолке. Известный способ с invulnerable не помогает. Какие ещё есть варианты ?
BozKurt, да, да, luabind... Не учёл... Ну и тебе по 'секрету', любые типы данных в Java это объекты, будь то целочисленные, булевые, строки или числа с плавающей точкой.
Ну да ладно, окончим на этом дискуссию. Т.к. это здесь не к месту. Да и я, порой, несу бред.