Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском по разделу, ответ на него, вероятно, уже есть.
Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода.
Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа).
Благодарность выражаем в личке или же ставим плюсик в историю репутации. Подобные посты будут удаляться.
sergej5500, Поштучно удалить патроны, просто так нельзя, можно только пачку. Конечно можно перед удалением пачки считать через нетпакет сколько там патронов, а потом добавлять разницу или удалять еще одну пачку если не хватило этой. Точно нужен такой гемор?
function remove_ammo(actor, npc, p) local rnd = 0 local cnt = 0 local t = {} local sim = alife() if p and p[1] then if p[2] > p[3] then rnd = math.random(p[3], p[2]) else rnd = math.random(p[2], p[3]) end
db.actor:iterate_inventory( function(npc, item) if item:section() == p[1] then table.insert(t, item:id()) end end , db.actor)
for i, id in ipairs(t) do local obj = level.object_by_id(id) cnt = get_ammo_size(obj) if cnt ~= 0 and rnd > 0 then if cnt >= rnd then sim:release(sim:object(id), true) alife():create_ammo(p[1],db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id(), cnt-rnd) rnd = rnd - cnt else sim:release(sim:object(id), true) rnd = rnd - cnt end end end end end
Осталось только найти/написать функцию get_ammo_size которая по объекту должна вернуть количество патронов в пачке. Найденные на просторах Интернета работают не корректно!
function get_ammo_size(obj) local se_obj = alife():object(obj:id()) if se_obj == nil then return 0 end local packet = net_packet() cse_alife_item_ammo.STATE_Write(se_obj, packet) --packet:r_advance(18) --packet:r_stringZ() --packet:r_advance(8) --packet:r_stringZ() --packet:r_advance(5) packet:r_seek(packet:w_tell() - 2) return packet:r_u16() end
=remove_ammo(ammo_5.45x39_fmj:30:60)
Сообщение отредактировал denis2000 - Четверг, 18.06.2020, 09:29
В Зове Припяти игрок осуществляет переходы между локациями с Лоцманом. Или внутрилокационные переходы со случайными сквадами сталкеров.
Задумали при каждом таком переходе рандомно изнашивать оружие и броню в активных слотах. Как будто при переходе бывают разные случайности. И снаряга изнашивается.
Функцию для рандомного износа снаряги написать несложно.
Как приложение к этой функции была задумка удалить из инвентаря некоторое кол-во патронов. Будто бы их расстреляли. Но для этого патроны желательно удалять поштучно.
Ну нет такой функции - так нет. И без неё обойдемся.
Почему нет? Я вам ее привел, только ее допилить требуется в части получения количества патронов в пачке через нетпакет. Не устраивает такая функция просто перед переходом разряжаете скриптом активный ствол (или ствол из нужного слота) и прячете ствол за спину ГГ (это все скриптово легко реализуется) вот вам и будут отстрелянные патроны. В конце концов удаляйте одну пачку и получите от рандом отстрелянных патронов 1 до объема пачки.
Цитатаsergej5500 ()
Это вообще сработает?
Нет конечно, вы же это сами проверили! Судя по всему движек не ожидает там отрицательных параметров, вот и не реагирует. Значит придется делать это через скрипты, отрабатывая колбек на использования предметов-бустеров.
Expression : !m_error_code Function : raii_guard::~raii_guard File : ..\xrServerEntities\script_storage.cpp Line : 748 Description : ...call of pripyat\gamedata\scripts\bind_stalker.script:507: attempt to concatenate field '?' (a nil value)
что за вылет? при любой загрузке сейва, при любом переходе он.
Судя по всему движек не ожидает там отрицательных параметров, вот и не реагирует. Значит придется делать это через скрипты, отрабатывая колбек на использования предметов-бустеров.
Спасибо. Я примерно так и подумал. Просто хотел еще раз уточнить, прежде чем лезть в скрипты.
ЦитатаOP_artovod ()
Description : ...call of pripyat\gamedata\scripts\bind_stalker.script:507: attempt to concatenate field '?' (a nil value)
Хотелось бы посмотреть на 507 строку из вашего bind_stalker. Какой то параметр не определен.
Два вопроса всё ещё остаются без ответа. Вопрос 1: Жми Вопрос 2: Жми (Ссылка не найдена/истёк срок скачивания.) -------------------------------------------------------------------------------------------------------------------------------------------------------------------- OP_artovod, Если правил bind_stalker то пиши сразу, какая строка, а то гадать придётся. В оригинальном файле 507 строчка: for i = 1,count do в функции function spawn_achivement_items
Сообщение отредактировал Winsor - Четверг, 18.06.2020, 11:49
function actor_binder:load(reader) set_save_marker(reader, "load", false, "actor_binder") object_binder.load(self, reader) --' Загружаем уровень сложности local game_difficulty = reader:r_u8() printf("load game_difficulty %s", tostring(game_difficulty)) вот это 507 строка get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty]) local stored_input_time = reader:r_u8() if stored_input_time == true then self.st.disable_input_time = utils.r_CTime(reader) end xr_logic.pstor_load_all(self.object, reader) self.weather_manager:load(reader) release_body_manager.get_release_body_manager():load(reader) -- self.surge_manager:initialize() -- AtmosFear self.atmosfear:load(reader) self.psi_storm_manager:load(reader) self.fallout_manager:load(reader) self.f_psi_storm_manager_loaded = true -- End AtmosFear self.surge_manager:load(reader) self.f_surge_manager_loaded = true sr_psy_antenna.load(reader) sim_board.get_sim_board().simulation_started = reader:r_bool()
xr_sound.actor_load(reader) local n = reader:r_stringZ() if(n~="nil") then self.last_level_name = n end xr_statistic.load(reader) treasure_manager.get_treasure_manager():load(reader) n = reader:r_u8() for i = 1,n do db.script_ids[reader:r_u16()] = reader:r_stringZ() end
task_manager.get_task_manager():load(reader)
-- self.actor_weapon_on_start = reader:r_bool()
self.loaded_active_slot = reader:r_u8()
self.loaded_slot_applied = false
local b = reader:r_bool() if(b) then self.deimos_intensity = reader:r_float() end
local stored_achievement_time = reader:r_bool() if stored_achievement_time == true then self.last_detective_achievement_spawn_time = utils.r_CTime(reader) end stored_achievement_time = reader:r_bool() if stored_achievement_time == true then self.last_mutant_hunter_achievement_spawn_time = utils.r_CTime(reader) end set_save_marker(reader, "load", true, "actor_binder") end
OP_artovod, Типичная проблема битых сейвов! В строке local game_difficulty = reader:r_u8() из нетпакета актора считывается значение переменной от 0 до 3 (в цифровом виде значение уровня сложности игры) но считанное значение не попало в указанный диапазон, в результате вылет. Нужно искать причину краша сохранений, а это не тривиальная и очень увлекательная задача. Winsor, Вопрос 2: Мод Медицина
Сообщение отредактировал denis2000 - Четверг, 18.06.2020, 15:37
Добавить их им в инвентарь. Будут кидать как обычные гранаты.
ЦитатаWinsor ()
не дать видеть им сквозь дым?
Вероятно, без редактирования движка не обойтись.
Есть, впрочем, одна идея. При взрыве дымовой гранаты спавнить в точке взрыва объект подходящего класса. С визуалом дымового облака и непрозрачным. Объект должен быть проницаемым. Инвентори бокс, например. Или что-то другое. Через несколько секунд удалять. Не уверен, правда, что такой объект (визуал) в игре можно найти.
Можно еще попробовать такое направление. Получится кривовато, но что есть.
1. В точке взрыва гранаты спавним объект со стори-ид. Без визуала.
2. В скрипт xr_motivator - или дочерние от него прописываем измерение дистанции до объекта со стори-ид.
3. Если дистанция меньше заданной - примерный радиус дымового облака или чуть больше, то понижаем радиус поля зрения сталкера. До 1 метра, например. Будто он попал в облако дыма.
4. Через некоторое время объект удаляем. Радиус зрения сталкера восстанавливаем.
По такой схеме срабатывали мины в СГМ разных версий. Скрипты можно взять оттуда и подправить.
sergej5500, а как же зрение НПС сквозь дым? Если он не будут внутри, то они будут все прекрасно видеть. Это понятно, что непросто сделать, но лучше тогда уже не добавлять дым. гранаты, так как это дизбаланс в сторону НПС.
sergej5500, тогда, если их заденет, то они не будут видеть в сторону, противоположную от дыма. Вообщем, трудно будет это реализовать, может, поэтому их и нету в сингл игре...