1. Вопрос должен соответствовать выбранной Вами темы. 2. Изучите то, что уже есть в теме (воспользуйтесь поиском на форуме). 3. Указывайте необходимую информацию: чистая игра ТЧ или с установленным модом (указать какой). 4. Для того, чтобы было понятно в чем ошибка, приводите коды (оформленные соответствующем образом). 5. Вопросы по SDK задаем в этой теме.
Всем привет. Имеется тут парочка вопросов: 1. Решил я заспавнить квестовый предмет, создал его секцию, как положено, в quest_items.ltx, сделал его секцию в all.spawn, но при сборке acdc ругается на неизвестную ему секцию.
Код
unknown section 'rzl_kat_detector' at E:\Documents\Mod\Acdc\acdc.pl line 2351, <GEN9> line 8168
Я уже и папку config скинул в папку с acdc, но всё равно не помогает. Можно ли это как-то исправить? Секция спавна:
[3064] ; cse_abstract properties section_name = rzl_kat_detector name = rzl_kat_detector position = -121.05056762695,-16.462354660034,-50.520637512207 direction = 0.98942083120346,0,0.14507369697094
2. Дальше мне понадобился спейсрестриктор для выдачи инфопоршня и реализации обмена сообщениями (как это было в Возвращении Шрама). Логика срабатывает, инфопоршень передаётся, но вот с обменом сообщениями возникла проблема. Игра просто вылетает через несколько секунд после срабатывания рестриктора с таким логом:
Код
Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...games\s.t.a.l.k.e.r\gamedata\scripts\xr_logic.script:593: attempt to call field '?' (a nil value)
В чём может быть причина вылета? Может я как-то не так составил схемы переключения?
Код рестриктора:
[3063] ; cse_abstract properties section_name = space_restrictor name = rzl_kat_greh_sms_restr position = -118.07847595215,-16.284740447998,-50.436367034912 direction = 0,0,0 version = 118 script_version = 6
Награды: 36
Регистрация: 08.11.2012
Город: Красноярск
Всем привет. Можно ли на стволы на которые вообще нельзя ставить подствольник (АС Вал, например) путем изменения конфигов повесить его? Если да, то что и как подправить.
Dmitriy_Nekratov, на сколько я знаю, то на некоторые стволы нельзя поставить подствольник, потому что дело не в конфигах, там нужна другая модель, и куча другого. Да и не нужен подствольник на некоторых стволах, потому как это совсем убьет атмосферу и реалистичность.
Репутация: 42
Регистрация: 16.07.2012
Город: Саратов
Здравствуйте, у меня проблема: подскажите пожалуйста, где прописываются координаты размещения вот этих надписей: Сколько ищу - никак найти не могу. Буду благодарен за помощь.
А ты не пробовал менять параметр rain_color в секциях погоды?
DmitriyT, Видишь ли, некоторые элементы распологаются относительно какого либо окна и их координаты отталкиваются от координат окна Например, Параметры
Сам статик параметров костюма задается координатами x="740" y="550", а надпись "Параметры" задается уже относительно координат статика координатами x="130" y="0"
Награды: 36
Регистрация: 08.11.2012
Город: Красноярск
Всем привет Ломанулся я, значит, модна броню с трупов ставить. Скрипты поставил и попытался совместить. Запустил, в меню зашел,синхронизации дождался и рабочем столе оказался. И вылет получил:
Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...ow of chernobyl\gamedata\scripts\bind_stalker.script:96: attempt to index global 'death_manager' (a nil value)
Я так понял,что bind_stalker.script обратился к death_manager и ничего там не увидел. 100 раз пересмотрел bind_stalker.script - ничего не нашел. Может вы найдете, поэтому вот bind_stalker.script:
-- + added by XiaNi for artefact pickup stats -- taken from "patch 1.1" (by undefined author) local artefact_clsid = { [clsid.art_bast_artefact] = true, [clsid.art_black_drops] = true, [clsid.art_dummy] = true, [clsid.art_electric_ball] = true, [clsid.art_faded_ball] = true, [clsid.art_galantine] = true, [clsid.art_gravi] = true, [clsid.art_gravi_black] = true, [clsid.art_mercury_ball] = true, [clsid.art_needles] = true, [clsid.art_rusty_hair] = true, [clsid.art_thorn] = true, [clsid.art_zuda] = true, [clsid.artefact] = true, [clsid.artefact_s] = true } local found_artefact_ids = {} -- - added by XiaNi for artefact pickup stats
-- + added by XiaNi for artefact pickup stats self.freeplay_stats = xr_statistic.get_freeplay_statistic() -- - added by XiaNi for artefact pickup stats end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:net_spawn(data) printf("actor net spawn")
level.show_indicators()
self.bCheckStart = true self.weapon_hide = false -- спрятано или нет оружие при разговоре. weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.
if object_binder.net_spawn(self,data) == false then return false end
db.add_actor(self.object)
if self.st.disable_input_time == nil then level.enable_input() end
-- setup xiani freeplay if has_alife_info("freeplay_actor_setup") then if not has_alife_info("freeplay_actor_setup2") then self.object:give_info_portion("freeplay_actor_setup2") xiani.freeplay_start_cleanup() end
if xiani_config.weather_manager then xiani.xlog("init amk weather") amk_weather.on_spawn() end
if xiani_config.restore_sun then xiani.xlog("restoring sun...") ogsm.on_game_load() -- for sun restoring end -- if xiani_config.cleanup_corpses then -- sak_off_corpses.off_corpses() -- end end
return true end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:net_destroy() if(actor_stats.remove_from_ranking~=nil)then actor_stats.remove_from_ranking(self.object:id()) end -- game_stats.shutdown () db.del_actor(self.object)
if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:destroy() sr_psy_antenna.psy_antenna = false end
xr_sound.stop_all_sound_object()
object_binder.net_destroy(self) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:reinit() object_binder.reinit(self)
local npc_id = self.object:id()
db.storage[npc_id] = { }
self.st = db.storage[npc_id] self.st.pstor = nil
self.next_restrictors_update_time = -10000
self.object:set_callback(callback.inventory_info, self.info_callback, self) self.object:set_callback(callback.article_info, self.article_callback, self) self.object:set_callback(callback.on_item_take, self.on_item_take, self) self.object:set_callback(callback.on_item_drop, self.on_item_drop, self) self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self) self.object:set_callback(callback.task_state, self.task_callback, self) --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self) self.object:set_callback(callback.level_border_enter, self.level_border_enter, self) self.object:set_callback(callback.level_border_exit, self.level_border_exit, self) self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:take_item_from_box(box, item) local story_id = box:story_id() if story_id == nil then return end
treasure_manager.take_item_from_box(box, story_id) --[[ local respawner = se_respawn.get_respawner_by_parent(story_id) if respawner == nil then return end
--' Необходимо уменьшить счетчик в респавнере respawner:remove_spawned(item:id())
local smart_terrain = db.strn_by_respawn[respawner:name()] if smart_terrain == nil then return end
local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position()) if npc ~= nil then xr_sound.set_sound_play(npc, "reac_box") xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor) end ]] end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:level_border_enter(npc, info_id) self.actor_detector:actor_enter() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:level_border_exit(npc, info_id) self.actor_detector:actor_exit() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:info_callback(npc, info_id) printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id) -- dbglog("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
--' Сюжет level_tasks.proceed(self.object) -- Отметки на карте level_tasks.process_info_portion(info_id) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_trade (item, sell_bye, money) if sell_bye == true then game_stats.money_trade_update (money) else game_stats.money_trade_update (-money) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:article_callback(npc, group, name) --printf("article_callback [%s][%s]", group, name) if device().precache_frame >1 then return end
if group == "Diary" then news_manager.send_encyclopedy("diary", group) else news_manager.send_encyclopedy("encyclopedy", group) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_take (obj) -- + added by XiaNi for artefact pickup stats if artefact_clsid[obj:clsid()] ~= nil and not found_artefact_ids[obj:id()] == true then self.freeplay_stats:check_found_artefact_count() actor_stats.add_points("artefacts", "st_pda_artefacts", 1, 1) found_artefact_ids[obj:id()] = true end -- - added by XiaNi for artefact pickup stats
if obj:clsid() ~= clsid.wpn_ammo then level_tasks.proceed(self.object) end --game_stats.update_take_item (obj, self.object) _z.on_item_take(obj, self.object) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_drop (obj) if obj:clsid() ~= clsid.wpn_ammo then level_tasks.proceed(self.object) end --game_stats.update_drop_item (obj, self.object) _z.on_item_drop(obj, self.object)
-->>Treasure rucksack 2/2 if obj:section()=="inv_ruck" then -- запомним id объекта self.rr_id=obj:id() end --<< end ----------------------------------------------------------------------------------------------------------------------
function actor_binder:task_callback(_task, _objective, _state) task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state) if _objective:get_idx() == 0 then if _state == task.fail then news_manager.send_task(db.actor, "fail", _task, _objective) elseif _state == task.completed then task_manager.reward_by_task(_task) news_manager.send_task(db.actor, "complete", _task, _objective) else news_manager.send_task(db.actor, "new", _task, _objective) end else if _task:get_objective(0):get_state() == task.in_progress then news_manager.send_task(db.actor, "update", _task, _objective) end end end
---------------------------------------------------------------------------------------------------------------------- function actor_binder:map_location_added_callback(spot_type_str, object_id) if (false==app_ready()) or (device().precache_frame>1) then return end --'news_manager.send_task(db.actor, "new") end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:update(delta) object_binder.update(self, delta)
--' Проверка потери жизни --[[ if self.object.health - lasthealth > 0.001 or self.object.health - lasthealth < -0.001 then printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime) lasthealth = self.object.health lasttime = game.time() end ]] -- Обновление отключения ввода с клавиатуры. if self.st.disable_input_time ~= nil and game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle then level.enable_input() self.st.disable_input_time = nil end -- Обновление сна с переносом чувака в указанную позицию if self.st.sleep_relocate_time ~= nil and game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle then self.object:set_actor_position(self.st.sleep_relocate_point) local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look) self.object:set_actor_direction(dir:getH()) self.st.sleep_relocate_time = nil end
-- Апдейт прятание оружия игрока во время диалога if weapon_hide == true or self.object:is_talking() then if self.weapon_hide == false then self.object:hide_weapon() self.weapon_hide = true end else if self.weapon_hide == true then self.object:restore_weapon() self.weapon_hide = false end end
-- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени if self.next_restrictors_update_time < time then bind_restrictor.actor_update(delta)
self.next_restrictors_update_time = time + 200
task_manager.actor_update() end
-- обработчик всяческих менеджеров четыре раза в секунду. if post_time < time then post_time = time + 250
-- utils2.show_coordinates()
self.anomaly_manager:update() if sleep_manager.is_sleep_active() and xr_conditions.actor_dead() then xr_logic.issue_event(db.actor, db.storage[db.actor:id()]["ar_sleep"], "update") end sleep_manager.update(delta) end
-- обновление постпроцессов if post_process ~= 0 then if post_process:update () == true then post_process = 0 end end
-- обновление пси-антенны if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:update(delta) end
--' Вывод сообщения о большой радиации if self.object.radiation >= 0.7 then local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static == nil then hud:AddCustomStatic("cs_radiation_danger", true) hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger") end else local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static ~= nil then hud:RemoveCustomStatic("cs_radiation_danger") end end
if nv_need_update then nv_need_update = false _z.do_update(self.object) end
-- UI Radiation Mod additions if xiani_config.ui_show_rad then if (ui_rad and self.object) then ui_rad.update(self.object) end end -- UI Radiation Mod additions
-- UI Clock Mod if xiani_config.ui_show_time then ui_clock.show_time() end -- UI Clock Mod -
if self.freeplay_stats ~= nil then self.freeplay_stats:check_actor_money() self.freeplay_stats:check_actor_rank() end
if self.bCheckStart then printf("SET DEFAULT INFOS")
if not has_alife_info("freeplay_actor_start") then xiani.first_start(self); self.object:give_info_portion("freeplay_actor_start") art_mgr.del_xlam() end
if has_alife_info("freeplay_actor_setup") then if xiani_config.cleanup_corpses then sak_off_corpses.off_corpses() end end
if not has_alife_info("global_dialogs") then self.object:give_info_portion("global_dialogs") end
if not has_alife_info("level_changer_icons") then self.object:give_info_portion("level_changer_icons") end
xiani.add_lchanger_location()
self.bCheckStart = false funcs.on_actor_update () end
-- weather management disabled coz of blowout mod if xiani_config.weather_manager then -- xiani.xlog("amk_mod.weather_manager()") amk_weather.weather_manager() end
if xiani_config.actor_attack_pp then actor_attack_pp.on_actor_update() end
-->>Treasure rucksack 1/2 if self.rr_id~=nil then -- пытаемся получить объект по id local se_obj=alife():object(self.rr_id) -- проверяем, что объекта нет if se_obj==nil or se_obj:section_name()~="inv_ruck" then local ruck=alife():create("active_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id()) level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Моя нычка для хабара") news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000) end -- сбросим переменную self.rr_id=nil end --<<
end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:save(packet)
--' Сохраняем уровень сложности game_difficulty = level.get_game_difficulty() if save_treasure_manager == true then packet:w_u8(bit_or(game_difficulty, 128)) else packet:w_u8(game_difficulty) end
--' Сохраняем данные об отключенном вводе if self.st.disable_input_time == nil then packet:w_bool(false) else packer:w_bool(true) utils.w_CTime(packet, self.st.disable_input_time) end
self.freeplay_stats:save(packet) packet:w_u8(table.getn(found_artefact_ids)) for k,v in pairs(found_artefact_ids) do packet:w_u8(k) end
end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:load(reader) printf("actor_binder:load(): self.object:name()='%s'", self.object:name()) object_binder.load(self, reader) printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name())
--' Загружаем уровень сложности local game_difficulty = reader:r_u8()
local load_treasure_manager = false if bit_and(game_difficulty, 128) ~= 0 then game_difficulty = bit_and(game_difficulty, 127) load_treasure_manager = true end
-- get_console():execute("debug:difficulty:" .. tostring(game_difficulty)) if game_difficulty > 3 then game_difficulty = 3 end if game_difficulty < 0 then game_difficulty = 0 end get_console():execute("g_game_difficulty " .. game_difficulty_by_num[game_difficulty])
if reader:r_eof() then abort("SAVE FILE IS CORRUPT") end
local stored_input_time = reader:r_u8() if stored_input_time == true then self.st.disable_input_time = utils.r_CTime(reader) end
-- Weapon functions function hide_weapon() weapon_hide = true end function restore_weapon() weapon_hide = false end
// this is test for section iteration /** local function test_section_iteration(file_name, section_name) printf ("file : %s",file_name) printf ("section : %s",section_name)
local file = ini_file(file_name) local n = file:line_count(section_name) printf ("lines : %d",n)
local id, value = "", "", result for i=0,n-1 do result, id, value = file:r_line(section_name,i,"","") printf ("line %d : %s = %s",i,id,value) end end
Я так понял,что bind_stalker.script обратился к death_manager и ничего там не увидел.
Цитата (Dmitriy_Nekratov)
100 раз пересмотрел bind_stalker.script - ничего не нашел
Сам же правильно озвучиваешь проблему и тут же начинаешь тупить. Если bind_stalker обращается к death_manager и ничего не получает, то и смотри, что там в death_manager понаковырял.
Награды: 36
Регистрация: 08.11.2012
Город: Красноярск
А, я то думал,что не там проблема...Пойду ковыряться
Добавлено (06.10.2013, 06:17:38) --------------------------------------------- Все, исправил. Работает, как швейцарские часы. Зато другая проблема образовалась. Я решил звуки дождя и грома заменить. Я их тут нашел: gamedata\sounds\nature. Заменил, сохранил, в AIMP проверил. А в игре как были раскаты грома, так и остались,вместо положенных завываний метели. Вот что заменял:
Репутация: 167
Регистрация: 01.04.2013
Город: Москва
Dmitriy_Nekratov, ну насчет замены звуков - ты уж сам ищи, что действительно нужно менять и где это прописано. Кто же это помнит))) Это по твоему нужно поковыряться, заменить-проверить и тебе доложить. А вот насчет
Цитата
в AIMP проверил
меня терзают смутные сомненья...Ты вообще в курсе, что звуки нужно через СДК прогонять? Кстати и насчет замены тоже непонятно. Что значит - заменил? Как положено создал в геймдате нужные папки и запихал туда свои звуки? Так тогда проверяй правильность путей, кто это за тебя сделает?
Сообщение отредактировал Змея - Воскресенье, 06.10.2013, 21:37:19
Репутация: 167
Регистрация: 01.04.2013
Город: Москва
Dmitriy_Nekratov,
Цитата
AIMP же поддерживает .ogg, да и работало все
ОГГ много что поддерживает. Ну и что? Напихаешь сотни своих звуков, потом будешь жаловаться, что игра тормозит и вылетает на ровном месте. К тому хочу тебя обрадовать - непрогнанные через СДК звуки в игре звучат неправильно. Особенно касается звуков амбиента, да всех звуков вообще. Можно еще музыку для боевок не прогонять, только громкость нормальную подобрать.
Цитата
в Sony Force 9 открыл и подменил треки
Век живи, век учись...Никогда не подозревала о таком методе подмены файлов в геймдате)))
Цитата
т.е. количество жизней, уходящих при атаке мутанта?
Я не пойму, ты во что играешь, в супермарио что-ли? Какое количество жизней? По силе атаки все просто. Открываешь конфиг мутанта и внимательно смотришь. И о чудо - натыкаешься на понятные любому мододелу параметры hit_power - это именно отнимание "жизней"))) impulse - это как ты подпрыгивать будешь от пинков мутанта.
Сообщение отредактировал Змея - Понедельник, 07.10.2013, 20:20:06
Репутация: 167
Регистрация: 01.04.2013
Город: Москва
Dmitriy_Nekratov, так проверь сам, что тебе мешает? Задавать вопросы по поводу любой мелочи, которую можно изменить и проверить, что из этого вышло...тупиковый путь развития. Лучше запоминается то, что сделал своими руками.
Сахар, такого фикса для данной сборки нет. Для НС есть, но он не подходит. Варианты решения данного вопроса: 1. ждать, что кто-то сделает (маловероятно) 2. самому сделать 3. приобрести новую видеокарту
Не столь важно что ты делаешь, важно как ты это делаешь! (Джимми Лансфорд)
Репутация: 167
Регистрация: 01.04.2013
Город: Москва
Цитата
приобрести новую видеокарту
Лучший вариант. Ибо даже моды на ТЧ требуют все больше ресурсов. Я не говорю о ЗП... Ну и что, сидеть на дряхлом железе, играть на статике и постоянно делать или просить фиксы?