Совмещал, сие прекрасное творение со своей сборкой, но что то не срослось, а где я накосячил понять не могу... При загрузке игра падает с руганью на sr_no_weapon.script, точнее:
Код
FATAL ERROR
[error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ....a.l.k.e.r\shoc\gamedata\scripts\sr_no_weapon.script:60: attempt to call field 'hide_weapon' (a nil value)
Но поскольку сего файла у меня нет, предполагаю, что проблема кроется в bind_stalker.script.
Как адаптировал (куски кода): bind_stalker.script
Код
function actor_binder:net_destroy() if(actor_stats.remove_from_ranking~=nil)then actor_stats.remove_from_ranking(self.object:id()) end
-- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- self.object:set_callback(callback.use_object, nil) -- ---------------------------------------------------------- AleX MOD ----------------------------------------------------
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)
-- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- self.object:set_callback(callback.use_object, self.use_inventory_item, self) -- ---------------------------------------------------------- AleX MOD ----------------------------------------------------
end ----------------------------------------------------------------------------------------------------------------------
function actor_binder:use_inventory_item(obj)
if rx_ai then rx_ai.actor_item_take(obj)
alex_mod.outfits_fix(obj)
alex_mod.CheckSection(obj:section()) - сюда перенес основной скрипт end end end
При необходимости, могу выложить и остальные скрипты.
Сообщение отредактировал Stalker_AleX333 - Вторник, 09.07.2013, 17:52
Совмещал, сие прекрасное творение со своей сборкой, но что то не срослось, а где я накосячил понять не могу... При загрузке игра падает с руганью на sr_no_weapon.script, точнее:
Скинь-ка свой bind_stalker, я кажется понял в чём проблема.
Stalker_AleX333, модуль автономен и менять его название нельзя, если не разобраться что к чему, а ты, по всей видимости, как раз и не разобрался. Проблема в том, что ты всё, что было в файле переместил в свой файл.
Stalker_AleX333, а что насчёт названия скрипта? Так уже было или это поменялось во время заливки? Название стало таким: bind_stalker.sc.f322731686471877_
Сообщение отредактировал Streels - Вторник, 09.07.2013, 18:13
Streels, это не относится к проблеме, пропиши расширение файла руками - всё откроется.
Добавлено (09.07.2013, 18:21) --------------------------------------------- Stalker_AleX333, и кстати, у тебя файл sr_no_weapon.script не от оригинала, так что ищи его по db архивам.
Stalker_AleX333, в общем - странно. Вылет говорит о том, что при входе в зону, где ГГ прячет оружие, игра не может найти функцию hide_weapon в файле bind_stalker.script. А поскольку в ТЧ ГГ появляется как раз в такой зоне, то и происходит вылет. Только видишь ли в чём проблема - "медицина" работает только после использования предмета, если ничего не делать, а просто начать новую игру, то ни один скрипт из файла use_item.script не начинает работать самостоятельно. Поэтому у тебя косяк самой игры - попробуй удалить "медицину" и потереть строку вызова CheckSection, я почему-то уверен, что вылет останется, если же нет - кидай всю папку scripts, буду разбирать в чём причина.
Добавлено (09.07.2013, 18:59) --------------------------------------------- P.S. Какая версия патча у тебя?
ColR_IT При "отключении" мода данный вылет не проявляется, однако через несколько секунд после запуска, игра наглухо зависает. Приходится завершать через диспетчер задач. Благо, экзэшник у меня правленый и лог сохраняется:
Код
FATAL ERROR
[error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...ия игр s.t.a.l.k.e.r\shoc\gamedata\scripts\_g.script:1075: attempt to call global 'dbglog' (a nil value)
stack trace:
Scheduler tried to update object esc_dog_weak_0013
FATAL ERROR
[error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...ия игр s.t.a.l.k.e.r\shoc\gamedata\scripts\_g.script:1075: attempt to call global 'dbglog' (a nil value)
stack trace:
Scheduler tried to update object esc_dog_weak_0012
FATAL ERROR
[error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...ия игр s.t.a.l.k.e.r\shoc\gamedata\scripts\_g.script:1075: attempt to call global 'dbglog' (a nil value)
и т.п.
Самое интересное, что до установки "медицины", такого еще никогда не видел.
З.Ы. Версия 1.0006 + правленый экзэшник и xr_core.dll
Сообщение отредактировал Stalker_AleX333 - Вторник, 09.07.2013, 19:24
Stalker_AleX333, повторюсь, проблема не в самой "медицине" (возможно в адаптации, но не уверен), поскольку скрипты работают только после того, как будет использован один из съедобных предметов. Скидывай gamedata, если не большая, попробую как-то разобраться, хотя не могу обещать, что найду причину.
ColR_IT Геймдата огромного размера, боюсь скачивание такого объема, того не стоит. Проверил сборку подключив старый bind_stalker.script (без "медецины") - все работает. Кхм...
Переписал скрипт, используя последнюю сохраненную копию. Игра работает, но "медецина" - нет.
local post_time = 0 lasthealth = 0 lasttime = 0 post_process = 0 local weapon_hide = false
---------------------------------------------------------------------------------------------------------------------- class "actor_binder" (object_binder) ---------------------------------------------------------------------------------------------------------------------- function actor_binder:__init (obj) super(obj) self.bCheckStart = false self.weather_manager = level_weathers.WeatherManager() self.actor_detector = xr_detector.actor_detector() 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
self.weather_manager:reset()
if(actor_stats.add_to_ranking~=nil)then actor_stats.add_to_ranking(self.object:id()) end
-- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- if rx_ai then rx_ai.actor_net_spawn()
ogsm_funcs.on_game_load()
alex_mod_news_main.filter() end -- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- 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
-- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- self.object:set_callback(callback.use_object, nil) -- ---------------------------------------------------------- AleX MOD ----------------------------------------------------
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)
-- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- self.object:set_callback(callback.use_object, self.use_inventory_item, self) -- ---------------------------------------------------------- AleX MOD ----------------------------------------------------
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) 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) -- Сюжет 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) 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) level_tasks.proceed(self.object)
-- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- function actor_binder:use_inventory_item(obj) alex_mod.CheckSection(obj:section()) end
if rx_ai then rx_ai.actor_item_take(obj) end
alex_mod.outfits_fix(obj) end -- ---------------------------------------------------------- AleX MOD ----------------------------------------------------
---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_drop (obj) level_tasks.proceed(self.object) 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 end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:update(delta) object_binder.update(self, delta)
-- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- aem_manager.get_aem():update()
alex_mod.update_medic_sys() -- ---------------------------------------------------------- AleX MOD ----------------------------------------------------
-- Обновление отключения ввода с клавиатуры. 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
-- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- if post_time < time then post_time = time + 250
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 -- ---------------------------------------------------------- AleX MOD ----------------------------------------------------
-- Обновление постпроцессов 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 self.bCheckStart then printf("SET DEFAULT INFOS")
if not has_alife_info("storyline_actor_start") and (level.name() == "l01_escape") then self.object:give_info_portion("storyline_actor_start") _G.g_start_avi = true printf("*AVI* RUN START AVI") 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
level_tasks.add_lchanger_location()
self.bCheckStart = false end
-- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- alex_mod_news_main_data.show_news_main()
ogsm_funcs.on_actor_update()
xr_s.on_actor_update(delta)
alex_mod.is_killed()
if rx_ai then rx_ai.actor_update() end end -- ---------------------------------------------------------- AleX MOD ----------------------------------------------------
function actor_binder:save(packet) if rx_ai then rx_ai.actor_save(packet) end local save_treasure_manager = true
-- Сохраняем уровень сложности if save_treasure_manager == true then packet:w_u8(level.get_game_difficulty() + 128) else packet:w_u8(level.get_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
-- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- alex_mod.medic_sys_save(packet) -- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- 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 game_difficulty >= 128 then game_difficulty = game_difficulty - 128 load_treasure_manager = true end
-- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- alex_mod.medic_sys_load(reader) -- ---------------------------------------------------------- AleX MOD ---------------------------------------------------- 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