Перейти к контенту

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


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

@ARTLantist лови готовый код по левел вертексам (с гейм вертексами уже подсказали):

Скрытый текст
local In_Path = "D:\\Program Files\\S.T.A.L.K.E.R. - Lost World Origin\\gamedata\\levels\\"

function vector(x,y,z)
	return {x = x or 0, y = y or 0, z = z or 0}
end

local to_byte, to_sub, to_char, to_floor, to_abs = string.byte, string.sub, string.char, math.floor, math.abs

-- функции перевода двоичного кода представленного символами в бинарную строку (для побитовых операций)
function Bin_to_u32( Bin , start_seek )
    start_seek = start_seek or 1
	local byte1, byte2 = to_byte( Bin, start_seek, start_seek + 1)
	local byte3, byte4 = to_byte( Bin, start_seek + 2, start_seek + 3)
	return byte4 * 16777216 + ( byte3 * 65536 + ( byte2 * 256 + byte1 ) )
end

-- преобразование строки символов в десятичное дробное число 4 байта (32 бита)
function Bin_to_float( Bin, start_seek )
    start_seek = start_seek or 1
	local byte1, byte2 = to_byte( Bin, start_seek, start_seek + 1)
	local byte3, byte4 = to_byte( Bin, start_seek + 2, start_seek + 3)
    local sBin = (
	    to_sBin[ byte4 ]
	 .. to_sBin[ byte3 ]
	 .. to_sBin[ byte2 ]
	 .. to_sBin[ byte1 ]
	)
	return ( --return s * (m * 2 ^ -23) * (2 ^(e-127))
	    ( byte4 < 128 and 1 or -1 )  --( to_sub(sBin , 1 , 1 ) == "0" and 1 or -1 )
	  * ( ( tonumber( "1".. to_sub(sBin , 10, 32 ), 2 ) ) * 0.00000011920928955078125)
	  * (2 ^( ( tonumber( to_sub(sBin , 2, 9 ), 2 ) ) -127) )
	)
end

-- для чтения хедера уровня
function read_level_header_info ( sFile )
    local level_header = {}
    if sFile then
		-----------------------------------------------------------------------------------------------------------------------
		-- вырез нужных строк, перевод в десятичное число и запись значений
		level_header.vertex_count = Bin_to_u32( sFile , 5, 8 )
		level_header.cell_size =    Bin_to_float( sFile, 9 , 12 )
		level_header.factor_y =     Bin_to_float( sFile, 13, 16 )
		level_header.Box_vector_p1 = vector()
		level_header.Box_vector_p2 = vector()
		level_header.Box_vector_p1.x = Bin_to_float( sFile, 17, 20 )
		level_header.Box_vector_p1.y = Bin_to_float( sFile, 21, 24 )
		level_header.Box_vector_p1.z = Bin_to_float( sFile, 25, 28 )
		level_header.Box_vector_p2.x = Bin_to_float( sFile, 29, 32 )
		level_header.Box_vector_p2.y = Bin_to_float( sFile, 33, 36 )
		level_header.Box_vector_p2.z = Bin_to_float( sFile, 37, 40 )
		-----------------------------------------------------------------------------------------------------------------------
		-- расчёт остальных данных
		level_header.cx = to_floor ( ( level_header.Box_vector_p2.x - level_header.Box_vector_p1.x ) / level_header.cell_size + 1.501 )
		level_header.cz = to_floor ( ( level_header.Box_vector_p2.z - level_header.Box_vector_p1.z ) / level_header.cell_size + 1.501 )
		-----------------------------------------------------------------------------------------------------------------------
	end
	return level_header
end
-- вывод в лог хедера (отладочный)
function print_level_header( level_header )
    print("")
	print( "level_header.vertex_count = ".. level_header.vertex_count )
	print( "level_header.cell_size = ".. level_header.cell_size )
	print( "level_header.factor_y = ".. level_header.factor_y )
	print( "level_header.Box_vector_p1 = vector("
		.. level_header.Box_vector_p1.x .. " , "
		.. level_header.Box_vector_p1.y .. " , "
		.. level_header.Box_vector_p1.z .. ")" )
	print( "level_header.Box_vector_p2 = vector("
		.. level_header.Box_vector_p2.x .. " , "
		.. level_header.Box_vector_p2.y .. " , "
		.. level_header.Box_vector_p2.z .. ")" )
	print( "level_header.cx = ".. level_header.cx )
	print( "level_header.cz = ".. level_header.cz )
    print("")
end
	
function main()
    ----------------------------------------------
	-- подготовка файла
    local Path = In_Path .. sLevel .. "\\level.ai"
	--print("In = " .. Path)
    local levelai = io.open( Path , "rb" )
	----------------------------------------------
	
	----------------------------------------------
	-- чтение хедера
	local sHeader = levelai:read(56)
	local level_header =  read_level_header_info( sHeader )
	print_level_header( level_header )
    ----------------------------------------------
end

 

....

 

 

Словил проблему в CoC. Играю себе никого не трогаю и тут внезапно на ТЧ Припяти отключились все диалоговые окна от левел ченджеров. Просто не спрашивает переходить ли на другую локацию. Рестрикторы которые отвечают за них вроде впорядке, стоят себе. Это от того что я мог накосячить с нет-пакетами или что это? Сталкивался кто с таким?

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

... А наше дело маленькое - с ружьём да по болотам. (с)

26.10.2021 в 15:17, WinCap сказал:

в чем может быть проблема при вводе в консоль

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

  • Согласен 1

Здесь могла быть ваша реклама.

@Купер вроде оно, но чёт оно не работает. И при 0 и при 1 детектор не достаётся, а болт убирается. С пистолетами ещё "печальнее" - детектор тупо не достаётся, а пистолет и не убирается, как будто запрещено вообще использовать.

@ARTLantist, совместимость детектора с оружием и болтом задается в движке, функция "CheckCompatibilityInt" в файле "CustomDetector.cpp".

S.T.A.L.K.E.R. CoP Objects  >200 шт  (upd 21.05.26) - Скачать  (Яндекс-диск)

@WinCap да, я уже просмотрел это всё в движке, там всё норм, по стандарту. Детектор может активироваться только при отсутствии в руках оружия, или при активном слоте болта/ножа, ну или идёт активация слота с доступным оружием (болта, ножа, ствола с базовым слотом пистолетным). Но чёт нифига не пашет.

@WinCap сталкер не перестаёт удивлять :)

Болт достаётся с детектором только если положить что-то в любой слот. Неважно, до того, как положишь детектор в его слот, или после. А без этого ГГ не может научиться доставать их совместно.

причём только при первом заходе в игру и первой НИ. Если закинул что-то в слот, то потом всегда всё будет нормально работать, и при перезаходе в игру и запуске сохранения, и при новой игре не перезаходя в игру.

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

Вопрос из разряда "сам не умею, но хочу". 
Как перенести выбор окончания игры или фриплея (sr_idle@freeplay_dialog) на момент, скажем, начала эвакуации, когда все НПС ещё на базе? Дабы не проходить этот глючный путь эвакуации, когда из-за сбитых таймеров, пятен на солнце или ещё чего вертолёты просто не прилетают или весь отряд зависает в бассейне. Нашёл в pri_a28_sr_evac.ltx вызов окна выбора [sr_idle@freeplay_dialog], но ни черта не понимаю в логике и прошу помощи.

Как добавить возможность обыска мутантов?
Не отрезание частей как это было в моде "Мясник",а полноценный обыск с открытием инвентаря мутанта и с последующей возможностью вытащить часть.

18.11.2021 в 01:45, DeSover сказал:

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

Есть похожее в Misery. Там не инвентарь монстра, а всплывающий диалог, что отрезать. Но там куча скриптов взаимосвязанных. ИМХО, инвентарь монстров это чушь. Если бы кто сделал анимацию отрезания частей, как в FarCry, было бы интереснее.
 

19 часов назад, Space.Marine сказал:

Есть похожее в Misery. Там не инвентарь монстра, а всплывающий диалог, что отрезать. Но там куча скриптов взаимосвязанных. ИМХО, инвентарь монстров это чушь. Если бы кто сделал анимацию отрезания частей, как в FarCry, было бы интереснее.
 

Вроде на COC был такой мод, там персонаж еще сумку или что-то похожее на мешок достает и туда шмат мяса пихает

  • Полезно 1

[error]Expression    : xml_doc.NavigateToNode(path,index)
[error]Function      : CUIXmlInit::InitStatic
[error]File          : c:\xray\forward frontier\public build\src\xrgame\ui\uixmlinit.cpp
[error]Line          : 156
[error]Description   : XML node not found
[error]Argument 0    : video_adv:cap_r4_tessellation
[error]Argument 1    : ui\ui_mm_opt_16.xml

 

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

Доброго времени суток.
Есть задумка в том, чтоб менялся визуал НПС, например Глухарь на Скадовске обычный сидит, а возле ВНЗ и дальше - уже в противогазе или маске. Сам визуал создать не проблема, добавить в character_desc_zaton - тоже, вопрос какие скрипты отвечают за вызов НПС и как их править? Сама эта система в игре есть и применяется, например, на визуалах Вано, Зулуса, Бродяги, до и после Подземелий.

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

Доброго времени суток)

Долго не решался написать на форум, но кажется настала пора. Потихонечку осваиваю моддинг на ЗП, стало интересно поработать с симуляцией жизни и заселить локацию. Информации по теме очень много, местами разные статьи/уроки вообще противоречат друг другу, но методом проб и ошибок что-то да начало получаться. С созданием смарт-террейна, расстановкой в нём работ и спавном сквадов проблем вроде нет. Если верить всему, что пишут в интернете, то сквад без указанного таргет-смарта, либо с указанным в нём nil - это симуляционный сквад, который живёт своей жизнью (ну или просто иногда перемещается между смартами). Всё тем же вышеназванным методом добился того, что сквад из своего начального смарта с припиской default ночью уходит на смарт с припиской default_base. Собственно, на этом симуляция закончилась. Как бы я ни старался, чтобы группу подхватил какой-нибудь другой смарт, кроме изначального и базы, всё тщетно. Уж и на другой конец локации с этими ребятами за 900 рублей ходил - нагло поворачивают и топают обратно. Проверил в чистом ЗП - ситуация отличается. Собственно, вопрос: что теоретически может быть не так? Возможность слишком близкого расположения смартов я вроде исключил. Sim_avail = true указано и для смартов, и для сквада. Если задать им нужный смарт в качестве цели - пойдут как миленькие. Но как же сделать так, чтобы сквад перемещался по локации, а не оставался прибитым к одному смарту? Если нужны какие-либо файлы/строчки кода - прикреплю, не вопрос, хотя вроде бы всё сделано по аналогии с оригиналом.

@Seraph а простые graph point'ы расставлены на AI-сетке новой локации (я так понял) и с достаточным расстоянием между ними?

@Seraph для симуляции сквада NPC по смартам прописать respawn. Много вариантов...

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

@MTomich локация - ЧН-Кордон из исходников компания-разработчик (признана нежелательной)*. Граф-пойнты брал оттуда же, как и АИ-сетку. Вроде как всё должно быть совместимо.

Прописывал и в респавне (к этой секции отдельные вопросы есть, но ими хочется заняться позднее), и в simulation.ltx. Результат примерно идентичен.

11 часов назад, Seraph сказал:

сквад из своего начального смарта с припиской default ночью уходит на смарт с припиской default_base.

Смущает этот факт. Скваду "ночевать" негде и идут на базу. Просто предстоит тоже создавать симуляцию на локации, но чтобы не хотели перемещаться, слышу впервые. Есть Sheva Stalker, хорошо объясняет в роликах по этой теме.

11 часов назад, Seraph сказал:

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

Это на Затоне, если проведут до Лесопилки идут обратно в Скадовск. Если есть зомби (работа), то остаются. И то убьют, обчистят и снова разворачиваются. За редким случаем, что влияет не знаю, загорается костёр и сталкеры топают анекдоты травить. А так обычно спускаются ниже, там тоже костёр есть (аномалия около вертолёта). Вот можно что-то понять)

@MTomich а что смущает? Не в чистом поле же им ночевать. Логично, что выдвигаются на базу, так и должно быть. Это даже в скриптах можно отследить.

 

Шева настолько прекрасно объясняет, что я дня два убил в попытках понять, почему у меня сквад не перемещается по заданной цепочке смартов, а танцует на месте джигу-дрыгу. Выяснилось, что всё из-за выставленного на 200 arrive_dist по его совету. Сомнительный источник в общем-то. Очень мало реально толковой инфы по заселению, увы. Лучшее, что удалось найти - статьи на удалённом сайте о Сталкере-2 (спасибо веб-архиву).

@Seraph обратите внимание, ночуют под открытым небом в ЗП во многих местах, а убегают от выброса прячась в другом. И под дождём мокнут... Дистанция - около 100 ставится, это оговорка может, регистрация сквада в смарте...

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

@MTomich места для ночлега делал только на базе. Хотя толку не очень много, они их занимают только при условии, что заняты все остальные работы (и только ночью, само-собой). По-моему в ЗП они вообще не спят практически, на базах - уж точно. Как реализуются укрытия от выброса я тоже имею представление, но ими пока не занимался, выбросы пока что отключил. Хочется изначально отладить хотя бы механику банальных путешествий между смартами, а потом уже дорабатывать.

Допустим, есть 3 смарта, где один база:


 

Скрытый текст

 

[esc_st_01]:default_resource ; job:art search
sim_avail = true

[esc_st_02]:default_lair
sim_avail = true

[esc_st_base]:default_base
sim_avail = true
surge = 1 ; добавить работы при выбросе

 

Нужно дополнить sim_board.script для разных групп:

 

stalker = {
        squad = nil,
        smart = {

               ; с 21 до 8 отдыхаем
                base = { prec = function(squad, target) return in_time_interval(21,8) and not xr_conditions.surge_started() and not travel_manager.check_squad_for_enemies(squad) and (target:name() == "zat_stalker_base_smart" or target:name() == "jup_a6" or target:name() == "pri_a16" or target:name() == "esc_st_base") end },
                surge = { prec = function() return xr_conditions.surge_started() end },

                ; с 8 до 21 идут искать арты (default_resource)
                resource = { prec = function(squad, target) return in_time_interval(8,21) and not xr_conditions.surge_started() end },

                ; или просто стоят (default_lair или default_territory)
                territory = { prec = function() return in_time_interval(13,21) and not xr_conditions.surge_started() end }
            },
        actor = nil
    },

 

также добавить уровень в список group_id_by_levels с новым ид, и в другие файлы:

smart_terrain.script
surge_manager.script

 

 

Там просто, просто поискать по всем скриптам/конфигам: jupiter или zaton, чтобы полностью зарегать новый уровень, для выпадения лута с трупов, ящиков, перемещений с отрядом за бабло.

@h0N0r да в том и дело, что всё не раз проверил по всем конфигам и скриптам. Зарегал, где только можно)

Разве что только default_resource пока не использовал нигде. Есть вероятность, что движок хочет отправить сталкеров на поиск артов, но не может, поэтому оставляет прибитыми к смарту? А как тогда поступать с локациями, где, скажем, не предполагается наличие аномальных полей и соответственно поиска артефактов?

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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