Max_Raf 35 Опубликовано 3 Июня 2020 Ребят, я столкнулся с такой проблемой, что не секу почему не выходит. Платформа: COC 1.4.22 Вопрос такой: как правильно добавлять/удалять/читать рестрикторы у нпс? Думаю всё сделать нормальный эвэйдер аномалий. пытаюсь добавлять гаврикам такой строкой: npc:add_restrictions(se_anom:name(), "") (к онлайновому объекту нпс закидываю через метод добавления рестриктора по имени вида СекцияИд) но им чёт фиолетово - всё так же лезут в аномалию и дохнут. Что я делаю не так? ... А наше дело маленькое - с ружьём да по болотам. (с) Поделиться этим сообщением Ссылка на сообщение
Max_Raf 35 Опубликовано 7 Ноября 2020 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) .... вроде бы в списке ин рестрикторов у нпс данные аномалии появляются, но они их всё равно не обходят. Вопрос всё тот же. Что я делаю не так? ... А наше дело маленькое - с ружьём да по болотам. (с) Поделиться этим сообщением Ссылка на сообщение
Max_Raf 35 Опубликовано 3 Апреля 2021 Балуясь с COC 1.4.22 заметил что все трупы всегда лежат в онлайне. Есть ли какой человеческий способ без придумывания велосипедов заставить их переходить в оффлайн как и должны? cse_alife_human_stalker.can_switch_online(self) как я понял всегда возвращает true. Как это исправить? ... А наше дело маленькое - с ружьём да по болотам. (с) Поделиться этим сообщением Ссылка на сообщение
Max_Raf 35 Опубликовано 8 Апреля 2021 @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 То есть такое впечатление что объект переходил в онлайн и биндился дважды. Как пофиксить - не знаю. ... А наше дело маленькое - с ружьём да по болотам. (с) Поделиться этим сообщением Ссылка на сообщение
Max_Raf 35 Опубликовано 22 Мая 2021 Ребят, нужна гадалка. А то у меня кофейной гущи чёт маловато. Платформа СОС 1.4.22 Проблема такая: ловлю почти рандомные просадки по фпс. Не просто фриз, а именно просадка. Это как то связано с переходом отрядов в онлайн/оффлайн, то есть лаг возникает когда отряд только собирается перейти в онлайн или даже когда уходит в оффлайн (про уход в оффлайн не уверен). По моему эта штука зависит от свитч дистанс, но я так и не просёк как. Не похоже что дело в can_switch_online, я ставил всё как в ЗП, оно всё равно висит. К примеру для наглядности. Янтарь ЧН. Стоим у выверта на северо-западе. Свитч дистанс = 250. Частично в онлайне смарт бункера учёных. Начинается долгий лаг с просадкой по фпс. Открываю карту: вижу как какой то отряд вот-вот перейдёт в онлайн именно в смарт бункера. Как только отряд переходит в онлайн в геймграф смарта - лаг проходит. По наблюдениям лаг происходит порой и после перехода отряда в онлайн. Во время лага висит весь скриптовой поток, нпс тупят в этот момент и так далее. Как эту дрянь поймать? Буду рад даже абсурдным идеям. ... А наше дело маленькое - с ружьём да по болотам. (с) Поделиться этим сообщением Ссылка на сообщение
Max_Raf 35 Опубликовано 30 Октября 2021 (изменено) @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. Играю себе никого не трогаю и тут внезапно на ТЧ Припяти отключились все диалоговые окна от левел ченджеров. Просто не спрашивает переходить ли на другую локацию. Рестрикторы которые отвечают за них вроде впорядке, стоят себе. Это от того что я мог накосячить с нет-пакетами или что это? Сталкивался кто с таким? Изменено 30 Октября 2021 пользователем Max_Raf ... А наше дело маленькое - с ружьём да по болотам. (с) Поделиться этим сообщением Ссылка на сообщение
Max_Raf 35 Опубликовано 22 Апреля 2023 Столкнулся с кое какой проблемой. Пытаюсь сделать что то вроде динамических торговцев в смарте. Суть какая: нпс получает работу смарта с конфигом листа торговли так же как и другие торговцы. Ну крч непись работает как и положено - как торговец. Проблема заключается в том, что если нпс покидает данную работу и идёт в другой смарт, то все предметы добавленные от работы остаются с ним. Вот как убрать предметы? Я заметил, что при смене конфига торговли, нпс теряет предметы, добавленные старым конфигом. К примеру: прописываем конфиг торговли Сидоровича - нпс получает предметы по списку Сидоровича. Получая другой конфиг - предметы списка Сидоровича удаляются и спавнятся новые по новому конфигу. То есть вроде можно тупо "пустой" конфиг с пустым [supplies_generic] применить на нпс и он не будет ничем торговать включая те предметы что были изначально (хотя они и остаются*). Но всё равно не то. Минусы: нпс в текущей сессии не сможет ничем торговать, даже своими предметами (это если всю "костыльность" метода не учитывать ещё). *вот судя по этому примеру, каждый предмет, который был добавлен по списку торговли имеет какой то флаг того что он добавлен через функцию buy_supplies а не лежит у этого нпс изначально. Вот как этот флаг предмета выловить через m_netpk или ещё что, мб кто знает? ... А наше дело маленькое - с ружьём да по болотам. (с) Поделиться этим сообщением Ссылка на сообщение