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

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


Halford

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

Ребят, я столкнулся с такой проблемой, что не секу почему не выходит.

Платформа: COC 1.4.22

Вопрос такой: как правильно добавлять/удалять/читать рестрикторы у нпс? Думаю всё сделать нормальный эвэйдер аномалий. 

пытаюсь добавлять гаврикам такой строкой:

npc:add_restrictions(se_anom:name(), "")    (к онлайновому объекту нпс закидываю через метод добавления рестриктора по имени вида СекцияИд)

но им чёт фиолетово - всё так же лезут в аномалию и дохнут. Что я делаю не так?

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

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


Ссылка на сообщение
03.06.2020 в 15:21, Max_Raf сказал:

Ребят, я столкнулся с такой проблемой, что не секу почему не выходит.

Платформа: COC 1.4.22

Вопрос такой: как правильно добавлять/удалять/читать рестрикторы у нпс? Думаю всё сделать нормальный эвэйдер аномалий. 

пытаюсь добавлять гаврикам такой строкой:

npc:add_restrictions(se_anom:name(), "")    (к онлайновому объекту нпс закидываю через метод добавления рестриктора по имени вида СекцияИд)

но им чёт фиолетово - всё так же лезут в аномалию и дохнут. Что я делаю не так?

 

04.06.2020 в 06:12, Zander_driver сказал:

Емнип, туда id объектов (аномалий) пихать надо.

 

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

 

Что я делаю на этот раз:

1. спавню аномалию, задаю ей restrictor_type = 2 через stpk_utils.script

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

....

npc:add_restrictions( "", se_anom:name() ) 

alife():add_in_restriction(se_npc , anom_id)

....

вроде бы в списке ин рестрикторов у нпс данные аномалии появляются, но они их всё равно не обходят. Вопрос всё тот же. Что я делаю не так?

 

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

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


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

Балуясь с COC 1.4.22 заметил что все трупы всегда лежат в онлайне. Есть ли какой человеческий способ без придумывания велосипедов заставить их переходить в оффлайн как и должны? cse_alife_human_stalker.can_switch_online(self) как я понял всегда возвращает true. Как это исправить?

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

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


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

@naxac , неа, не помогло. Всё так же в онлайне. Я ранее делал немного иначе:

 

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

sw_sim = nil
sw_actor = nil
sw_max_dis = nil

function can_switch( self, f_online, f_offline )
	-- чтоб не дёргать по 100 раз
	sw_sim = sw_sim or alife()
	sw_actor = sw_actor or sw_sim and sw_sim:actor()
	sw_max_dist = sw_max_dist or sw_sim and sw_sim:switch_distance()
	
	-- если всё есть
	if self and sw_sim and sw_actor and sw_max_dist then
		if f_online then
			return self.position:distance_to(sw_actor.position) <= sw_max_dist or false
		elseif f_offline then
			return self.position:distance_to(sw_actor.position) > (sw_max_dist + 20) or false
		end
	end
	return true
end

function se_stalker:can_switch_offline()
	if self.group_id ~= 65535 then
		return true
	end

	if self.online then
		return can_switch( self, false, true )
	end

	return cse_alife_human_stalker.can_switch_offline(self)
end

function se_stalker:can_switch_online()
    if self.group_id ~= 65535 then
        return true
    end

	if not self.online then
		return can_switch( self, true, false )
	end

    return cse_alife_human_stalker.can_switch_online(self)
end

 

 

Мой велосипед вроде был работающим, но иногда ловил вылет в таком стиле:

 

ERROR: CGameObject:net_spawn() Object with ID already exists! ID=61719 self=sim_default_bandit_061719 other=sim_default_bandit_061719

 

То есть такое впечатление что объект переходил в онлайн и биндился дважды. Как пофиксить - не знаю.

 

 

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

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


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

Ребят, нужна гадалка. А то у меня кофейной гущи чёт маловато. Платформа СОС 1.4.22

 

Проблема такая: ловлю почти рандомные просадки по фпс. Не просто фриз, а именно просадка. Это как то связано с переходом отрядов в онлайн/оффлайн, то есть лаг возникает когда отряд только собирается перейти в онлайн или даже когда уходит в оффлайн (про уход в оффлайн не уверен). По моему эта штука зависит от свитч дистанс, но я так и не просёк как. Не похоже что дело в can_switch_online, я ставил всё как в ЗП, оно всё равно висит.

 

К примеру для наглядности. Янтарь ЧН. Стоим у выверта на северо-западе.  Свитч дистанс = 250. Частично в онлайне смарт бункера учёных. Начинается долгий лаг с просадкой по фпс. Открываю карту: вижу как какой то отряд вот-вот перейдёт в онлайн именно в смарт бункера. Как только отряд переходит в онлайн в геймграф смарта - лаг проходит. По наблюдениям лаг происходит порой и после перехода отряда в онлайн. Во время лага висит весь скриптовой поток, нпс тупят в этот момент и так далее.

 

Как эту дрянь поймать? Буду рад даже абсурдным идеям.

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

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


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

@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

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

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


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

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

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

Вот как убрать предметы? Я заметил, что при смене конфига торговли, нпс теряет предметы, добавленные старым конфигом. К примеру: прописываем конфиг торговли Сидоровича - нпс получает предметы по списку Сидоровича. Получая другой конфиг - предметы списка Сидоровича удаляются и спавнятся новые по новому конфигу. То есть вроде можно тупо "пустой" конфиг с пустым [supplies_generic] применить на нпс и он не будет ничем торговать включая те предметы что были изначально (хотя они и остаются*). Но всё равно не то. Минусы: нпс в текущей сессии не сможет ничем торговать, даже своими предметами (это если всю "костыльность" метода не учитывать ещё).


*вот судя по этому примеру, каждый предмет, который был добавлен по списку торговли имеет какой то флаг того что он добавлен через функцию buy_supplies а не лежит у этого нпс изначально. Вот как этот флаг предмета выловить через m_netpk или ещё что, мб кто знает?

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

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


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

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