Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском по разделу, ответ на него, вероятно, уже есть.
Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода.
Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа).
Благодарность выражаем в личке или же ставим плюсик в историю репутации. Подобные посты будут удаляться.
Так в этом и заключается правильная настройка звуков. Что бы избитая фраза: "С чем пожаловал", не звучала на всю локацию. А если посмотреть внимательно, то в Инструкции, можно увидить раздел "Шаблоны для начинающих", всего-то 6-ть параметров.
Сообщение отредактировал WolfHeart - Среда, 17.06.2020, 16:33
Почему при наведении курсором по предмету не высвечивается нужная надпись, которая написана в секции предмета(inv_name_short)? Я специально прописывал короткие названия предметам в st_items_equipment. И в самой секции прописывал ссылку на тег.
Допустим, в рюкзаке ГГ есть патроны - ammo_5.45x39_fmj - 227 шт (условно). С помощью какой функции можно изъять из рюкзака от 30 до 60 патронов - число рандомно. Функция должна вызывается из логики рестриктора.
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