Это популярное сообщение. ColR_iT 171 Опубликовано 19 Февраля 2013 Это популярное сообщение. Поделиться Опубликовано 19 Февраля 2013 (изменено) MEDICINE RC ver. 1.0 Версия игры: предположительно любая; ориентирован на ТЧ.Автор: @ColR_iTМод реализует реакцию ГГ на использование съедобного предмета. Всего в игре десять таких предметов: три аптечки, бинт, антирад, энергетик, водка, консерва, колбаса и батон. Медленное восстановлениеДля каждого из предметов можно определить до четырёх параметров (здоровье, пси-здоровье, радиация и выносливость), которые могут восстанавливать/"поломать" соответствующее свойство ГГ. Обновляются эти параметры независимо друг от друга, прекращение обновления каждого - также не зависит от других. Критический хитВ случае, когда мы использовали аптечку и во время восстановления здоровья получили значительный хит, то восстановление оного прекращается. Это относится исключительно к хиту полученному по здоровью. Запрет на повторное использованиеИспользовать медицинские препараты (аптечки, бинт, антирад) повторно нельзя, на протяжении некоторого времени. Еду и энергетик при этом использовать ничего не запрещает. Получение критического хита, позволяет воспользоваться аптечкой досрочно. Убирание оружияПосле использования предмета, некоторое время будет невозможно воспользоваться оружием. Критический хит, восстанавливает оружие преждевременно. Звуки при использованииВо время использования предмета проигрывается соответствующий звук. В файле use_item.script имеются общие настройки, а также настройки для каждого предмета, позволяющие отрегулировать мод под собственное видение игры. Все настройки весьма гибкие и описаны комментариями, поэтому разобраться что к чему не составит труда. Мод использует динамическое подключение и отключение функций от биндера атора, посредством функционала xr_s.script за авторством @xStream. Таким образом весь процесс вычислений происходит исключительно после использования какого-либо предмета. Когда действие всех эффектов заканчивается, функции отключаются от биндера и никаких вычислений не происходит. Благодаря этому, использование ресурсов системы - минимально, а процесс адаптации с другими модами - прост. Исходя из ограничений движков игры, без вмешательства в сам движок, скриптовая регенерация возможна лишь для пяти свойств ГГ: health (здоровье), psy_health (пси-здоровье), radiation (радиация), power (выносливость) и morale (мораль, но я не знаю для чего она). Остальные свойства: bleeding (кровотечение), satiety (сытость) и alcohol (алкоголь), к сожалению, скриптовому воздействию не поддаются (?) и поэтому изменять их нужно посредством соответствующих движковых параметров в конфигах предметов. Принцип действия до безумия прост - Вы используете предмет, скрипт отлавливает это действие и в зависимости от настроек производит то или иное действие. Как и прежде, я постарался свести процесс адаптации к минимуму.Для этого, Вам необходимо: Если подключаете мод к ТЧ, вписать в файле bind_stalker.script в метод (функцию) update следующую строку: xr_s.on_actor_update(delta) В этом же файле в колбек use_object дописать следующую строку: use_item.CheckSection(obj:section())Если у Вас нет данного колбека, то его нужно добавить. Как это сделать написано ниже. Адаптировать файл item.ltx с имеющимся у Вас.Процесс адаптации состоит в совмещении десяти секций предметов описанных выше. В частности нескольких параметров после комментария "eatable item" в каждой секции. Для параметров eat_health, eat_power и eat_radiation нужно обязательно(!) ставить значение равное нулю, в противном случае смысл мода сходит на нет. Можете вручную подправить параметры секций исходя из данных в табличке ниже. В редких случаях, возможен конфликт папки со звуками. Если таковой возник, то для параметра soundsFolder, который находится в самом низу в скрипте, укажите путь до папки, в которой находятся звуки. К слову, звуки используются из мода Lost World Trops of Doom, единственно что - прогнал их через СДК, дабы избавится от возмущений в логе. В файле bind_stalker.script в метод reinit класса actor_binder, в конец допишите следующую строку: self.object:set_callback(callback.use_object, self.use_inventory_item, self) Затем, в метод net_destroy допишите: self.object:set_callback(callback.use_object, nil) Теперь нужно добавить метод, который будет вызываться при использовании какого-либо предмета. Допишите данный код после одного из методов (не во внутрь функции!!!), например перед update: function actor_binder:use_inventory_item(obj) end Собственно всё.P.S. Может случится так, что в Вашем моде метод вызываемый колбеком уже есть, чтобы узнать какой именно метод Вам нужен, обратите внимание на регистрацию колбека в методе reinit, а именно на второй аргумент функции set_callback, в нашем случае это use_inventory_item. ------------------------------------------------------------------------------------------------------------ | Здоровье | Пси-здоровье | Радиация | Выносливость | Сытость | Кровотечение | Алкоголь | ------------------------------------------------------------------------------------------------------------ Аптечка | +25%/5c | +3%/5c | | -10%/5c | -3% | | | Армейская аптечка | +55%/9c | +8%/6c | -20%/6c | -15%/6c | -5% | | | Научная аптечка | +85%/14c | +13%/9c | -50%/9c | -20%/9c | -7% | | | Бинт | | | | -25%/5c | | -100% | | Антирадин | | | -100%/15c | -30%/10c | -15% | | | Энергетик | | | | +100%/15c | -25% | | | Водка | +3%/4c | +15%/9c | -10%/6c | -20%/9c | -30% | | +10% | Консерва | | | | +20%/12c | +40% | | -5% | Колбаса | | | | +15%/10c | +30% | | -4% | Батон | | | | +10%/8c | +20% | | -3% | ------------------------------------------------------------------------------------------------------------- Инструкция по подключению в картинках, от @Dniwe: >>ClicK Me<< К сожалению, без них не обошлось... При сохранении игры во время процесса восстановления, загрузка этого сохранения не приведёт к продолжению процесса, простыми словами - сие не сохраняется.В момент, когда Вы повторно воспользуетесь предметом, а его повторное использование запрещено настройками, то скрипт не позволит восстанавливать ни один из параметров, кроме тех, что не поддаются правки скриптами.Т.е. например: Вы использовали армейскую аптечку. Первое её использование запустит процесс постепенного восстановления четырёх параметров: здоровья, пси-здоровья, радиации и выносливости, плюс мгновенно изменится параметр сытости. При повторном использовании заново процесс запускаться не будет и аптечка вернётся к Вам в инвентарь, но к сожалению, параметр сытости будет изменен, т.к. это движковое действие и отловить этот момент не представляется возможным. Та же картина и с антирадом.Каких либо вылетов замечено не было, те что были - поправил. Если кто найдёт, будьте любезны, не поленитесь сообщить, можно в личку, но лучше сюда в тему - буду признателен. Яндкс.ДискRGhost Спасибо @Charsi, и @Malandrinus за оказанную помощь. С Удовольствием приму конструктивную критику и пожелания по развитию мода. Изменено 13 Апреля 2015 пользователем HellRatz 3 11 3 Ссылка на комментарий
Sky_Line 11 Опубликовано 19 Февраля 2013 Поделиться Опубликовано 19 Февраля 2013 Добавления в мод эффектов при приёме аптечки в виде звука увеличения серцебиения либо потемнения экрана было бы очень даже кстати Ссылка на комментарий
ColR_iT 171 Опубликовано 19 Февраля 2013 Автор Поделиться Опубликовано 19 Февраля 2013 Sky_Line, это действительно делается весьма просто, обычным запуском звука функцией например перед/после строки: xr_s.register_callback("update", medicine.HideWeapon, time_global()) k01jan, я и не говорил, что это что-то новое. Основной задачей было не сделать "также" и не искать "поклонников", а реализовать данное именно так, как оно реализовано. Это не "колесо", это "дорога", по которой это "колесо" может ехать. Даже невооружённым взглядом можно увидеть, что адаптация данного "мода" в разы легче предложенного тобою, пусть и возможностей несколько меньше, но уделив ещё несколько часов внимания это легко можно поправить. Charsi показал мне возможности xr_s.script, за что ему огромное спасибо, я их изучил и решил поделиться с остальными, т.к. не многие знают что это за "фрукт", а те кто знают и без меня его прекрасно используют, кроме того динамически подключаться к колбекам можно не только этим методом - способов более чем достаточно. Что касается того, что в ЗП "давно" есть подобная система, то здесь я даже более тебе скажу - именно данный способ в нём и используется, правда единожды, но используется... Ссылка на комментарий
Stalkersof 170 Опубликовано 6 Марта 2013 Поделиться Опубликовано 6 Марта 2013 Да хорошая реализация. Способ интересный. И совсем не сложно доработать скрипт добавить звуки использования аптечек и пост-эффекты приема препаратов. Наверно тоже самое можно сделать и для антирадов бинтов и еды. Медленное восстановление здоровья, кровотечения и голода. Freeplay Graphic Mod(FGM) Ссылка на комментарий
ColR_iT 171 Опубликовано 6 Марта 2013 Автор Поделиться Опубликовано 6 Марта 2013 Ребята, прелесть не в медленном восстановлении, а в том, как это восстановление реализовано. Судя из написанного - Вы понимаете, что это здорово, но совершенно не понимаете как оно работает... А жаль. Ссылка на комментарий
Romark 356 Опубликовано 9 Марта 2013 Поделиться Опубликовано 9 Марта 2013 Добрый день! Пожалуйста, выложите более подробную инструкцию... 1-й и 2-й шаги сделал: - в файле bind_stalker.script в метод reinit класса actor_binder, в конец дописал строку: self.object:set_callback(callback.use_object, self.use_inventory_item, self) - в метод net_destroy дописал: self.object:set_callback(callback.use_object, nil) А дальше не понял: "Допишите данный код после одного из методов (не во внутрь функции!!!), например перед update"... Заранее благодарен. Ссылка на комментарий
ColR_iT 171 Опубликовано 9 Марта 2013 Автор Поделиться Опубликовано 9 Марта 2013 Куда уже подробнее? "после одного из методов" означает, что код нужно вписать между функциями, но никак не во внутрь. Как пример, можно разместить его перед строкой: function actor_binder:update(delta) Ссылка на комментарий
sanjaaa 1 Опубликовано 2 Июня 2013 Поделиться Опубликовано 2 Июня 2013 (изменено) @ColR_iT, просто красавчик. нет слов. просто репектище. только непонятно как сделать тоже самое, только на еду? Изменено 2 Июня 2013 пользователем sanjaaa Ссылка на комментарий
ColR_iT 171 Опубликовано 3 Июня 2013 Автор Поделиться Опубликовано 3 Июня 2013 sanjaaa, в таблицу item_, что в файле bind_stalker.script, допиши секцию своей еды после запятой, по аналогии. И в табличку itemParam, в файле medicine.script, допиши туже секцию и два числа: первое из которых - это количество жизней, которое будет пополнять еда; второе число - это сколько времени будет восстанавливаться здоровье (не забудь в конфиге убрать движковое восстановление). Если тебе не нужно, чтобы еда лечила, то во второй таблице пропиши по нолям, тогда при использовании твоей еды будет просто убираться оружие. Ссылка на комментарий
Артём_killer 12 Опубликовано 4 Июня 2013 Поделиться Опубликовано 4 Июня 2013 А есть уже готовые файлы? а то я не могу разобраться со своим модом, что да как, мне для чистого неба нужно на чистую игру. Ссылка на комментарий
ColR_iT 171 Опубликовано 4 Июня 2013 Автор Поделиться Опубликовано 4 Июня 2013 Артём_killer, а в "шапку" темы заглянуть не судьба? Ссылка на комментарий
Артём_killer 12 Опубликовано 4 Июня 2013 Поделиться Опубликовано 4 Июня 2013 Я сделал, вылетает; Expression : fatal error Function : CScriptEngine::lua_error File : E:\priquel\sources\engine\xrServerEntities\script_engine.cpp Line : 180 Description : <no expression> Arguments : LUA error: ...lver edition\cs\gamedata\scripts\bind_stalker.script:597: table index is nil не знаю, я просто уже много чего добавил в чн, а теперь разобраться не могу, мне нужен сталкер бин готовый для сравнения с моим) под версию 1.5.10, да кстати вылетает когда аптечку использую Ссылка на комментарий
ColR_iT 171 Опубликовано 4 Июня 2013 Автор Поделиться Опубликовано 4 Июня 2013 Артём_killer, скинь два файла: bind_stalker.script и medicine.script. Ссылка на комментарий
Артём_killer 12 Опубликовано 4 Июня 2013 Поделиться Опубликовано 4 Июня 2013 Да я хочу сам разобраться, спасибо за помощь конечно, мне бы просто на готовый файл глянуть с чистой игры, чтобы я потом сам ручками доделал)) я вставлял Slow Medicine 0.2b работало нормально, но спальник глючило из-за этого) и еще вопрос, по этому же принципу можно сделать медленный вывод радиации из организма? ато я его щас буду калупать до посинения и свой скрипт сломаю) function init (obj) xr_motivator.AddToMotivator(obj)endfunction actor_init (npc)npc:bind_object(actor_binder(npc))enddelayed_alife_release_objects = {}to_delayed_alife_release_objects = {}local game_difficulty_by_num = {[0] = "gd_novice",[1] = "gd_stalker",[2] = "gd_veteran",[3] = "gd_master"}lasthealth = 0lasttime = 0post_process = 0local weapon_hide = {}----------------------------------------------------------------------------------------------------------------------class "actor_binder" (object_binder)----------------------------------------------------------------------------------------------------------------------function actor_binder:__init (obj) super(obj)self.bCheckStart = falseself.weather_manager = level_weathers.get_weather_manager()--self.actor_detector = xr_detector.actor_detector()self.last_level_name = nilend----------------------------------------------------------------------------------------------------------------------function actor_binder:net_spawn(data)printf("actor net spawn")level.show_indicators()self.bCheckStart = trueself.weapon_hide = false -- спрятано или нет оружие при разговоре.self.weapon_hide_in_dialog = falseweapon_hide = {} -- устанавливаем глобальный дефолтовый флаг.if object_binder.net_spawn(self,data) == false thenreturn falseenddb.add_actor(self.object)if self.st.disable_input_time == nil thenlevel.enable_input()endxr_s.on_game_load() --' Distemper 03.2008 --self.weather_manager:reset()-- game_stats.initialize ()-- if(actor_stats.add_to_ranking~=nil)then-- actor_stats.add_to_ranking(self.object:id())-- end--' Загружаем настройки дропаdeath_manager.init_drop_settings()--'Устанавливаем ссылку на таскменеджерself.task_manager = task_manager.get_task_manager()-- Анремте это, чтобы пропустить интро на марше.--self.object:give_info_portion("mar_lvl_sim")if level.name() ~= "marsh" thensim_board.get_sim_board():start_sim()end--spawn_items.main()self.spawn_frame = device().frameself.already_jumped = falsebenchmark.main() --' Distemper 06.2008 --return trueend----------------------------------------------------------------------------------------------------------------------function actor_binder:net_destroy()xr_sound.stop_sounds_by_id(self.object:id())local board_factions = sim_board.get_sim_board().playersfor k,v in pairs (board_factions) doxr_sound.stop_sounds_by_id(v.id)endif(actor_stats.remove_from_ranking~=nil)thenactor_stats.remove_from_ranking(self.object:id())endxr_effects.stc_stop_particle_sounds()level.show_indicators()level.show_weapon(true)-- get_console():execute("hud_crosshair 1")-- get_console():execute("hud_weapon 1")-- get_console():execute("r2_dof -0.250000,1.400000,200.000000")-- game_stats.shutdown ()db.del_actor(self.object)self.object:set_callback(callback.inventory_info, nil)self.object:set_callback(callback.article_info, nil)self.object:set_callback(callback.on_item_take, nil)self.object:set_callback(callback.on_item_drop, nil)--self.object:set_callback(callback.actor_sleep, nil)self.object:set_callback(callback.task_state, nil)self.object:set_callback(callback.level_border_enter, nil)self.object:set_callback(callback.level_border_exit, nil)self.object:set_callback(callback.take_item_from_box, nil)self.object:set_callback(callback.use_object, nil)if sr_psy_antenna.psy_antenna thensr_psy_antenna.psy_antenna:destroy()sr_psy_antenna.psy_antenna = falseendxrs_dyn_music.stop_sound()object_binder.net_destroy(self)-- xr_sound.stop_all_sounds()xr_s.on_actor_destroy() --' Distemper 03.2008 --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 = nilself.next_restrictors_update_time = -10000self.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)self.object:set_callback(callback.use_object, self.use_inventory_item, self)end----------------------------------------------------------------------------------------------------------------------function actor_binder:take_item_from_box(box, item)local box_name = box:name()treasure_manager.take_item_from_box(box, box_name, item)--local smart_name = string.sub(box_name, 1, string.len(box_name)-4)--if(sim_board.get_sim_board().smarts_by_names[smart_name]~=nil) then-- game_relations.set_gulag_relation_actor(smart_name, "enemy")--endend----------------------------------------------------------------------------------------------------------------------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 thengame_stats.money_trade_update (money)xr_statistic.inc_recieved_money_counter(money)elsegame_stats.money_trade_update (-money)xr_statistic.inc_spent_money_counter(money)endend----------------------------------------------------------------------------------------------------------------------function actor_binder:article_callback(npc, group, name)--printf("article_callback [%s][%s]", group, name)if device().precache_frame >1 then return endif group == "Diary" thennews_manager.send_encyclopedy("diary", group)elsenews_manager.send_encyclopedy("encyclopedy", group)endend----------------------------------------------------------------------------------------------------------------------function actor_binder:on_item_take (obj)level_tasks.proceed(self.object)printf("on_item_take [%s]", obj:name())if isArtefact(obj) thenbind_anomaly_zone.artefact_ways_by_id[obj:id()] = nillocal artefact = obj:get_artefact()artefact:FollowByPath("NULL",0,vector():set(500,500,500))if bind_anomaly_zone.parent_zones_by_artefact_id[obj:id()] ~= nil thenbind_anomaly_zone.parent_zones_by_artefact_id[obj:id()]:on_artefact_take()endendfor k,v in pairs(task_manager:get_task_manager().task_info) doif(v.type=="bring_item" and v.state~="finished") thenv:on_item_take(obj)endend--game_stats.update_take_item (obj, self.object)end----------------------------------------------------------------------------------------------------------------------function actor_binder:on_item_drop (obj)level_tasks.proceed(self.object)for k,v in pairs(task_manager:get_task_manager().task_info) doif(v.type=="bring_item" and v.state~="finished") thenv:on_item_drop(obj)endend--game_stats.update_drop_item (obj, self.object)end----------------------------------------------------------------------------------------------------------------------function actor_binder:task_callback(_task, _state)if _state ~= task.fail thenif _state == task.completed thennews_manager.send_task(db.actor, "complete", _task)elsenews_manager.send_task(db.actor, "new", _task)endendtask_manager.task_callback(_task, _state)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----------------------------------------------------------------------------------------------------------------------local item_ = {["medkit"] = true, ["medkit_army"] = true, ["medkit_scientic"] = true,}function actor_binder:use_inventory_item(obj)if item_[obj:section()] thenmedicine.Rehabilitation(obj)endendfunction actor_binder:update(delta)object_binder.update(self, delta)if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) thenjump_level.try_to_jump()self.already_jumped = truereturnend-- DEBUG slowdown-- slowdown.update()xr_s.on_actor_update(delta)local time = time_global()game_stats.update (delta, self.object)-- апдейт погодыself.weather_manager:update()-- апдейт схемы детектора--self.actor_detector:update()--' Апдейт саундменеджераxr_sound.update(self.object:id())--' Проверка потери жизни--[[if self.object.health - lasthealth > 0.001 orself.object.health - lasthealth < -0.001 thenprintf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime)lasthealth = self.object.healthlasttime = game.time()end]]-- Обновление отключения ввода с клавиатуры.if self.st.disable_input_time ~= nil andgame.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idlethenlevel.enable_input()self.st.disable_input_time = nilend-- Обновление сна с переносом чувака в указанную позициюif self.st.sleep_relocate_time ~= nil andgame.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idlethenself.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 = nilend-- Апдейт прятание оружия игрока во время диалогаif self.object:is_talking() thenif self.weapon_hide_in_dialog == false then--printf("PL:HIDE_D1 ---> self.weapon_hide = [%s] weapon_hide = [%s]", tostring(self.weapon_hide), tostring(weapon_hide))self.object:hide_weapon()self.weapon_hide_in_dialog = true--printf("PL:HIDE_D2 ---> self.weapon_hide = [%s] weapon_hide = [%s]", tostring(self.weapon_hide), tostring(weapon_hide))endelseif self.weapon_hide_in_dialog == true then--printf("PL:RESTORE_D1 ---> self.weapon_hide = [%s] weapon_hide = [%s]", tostring(self.weapon_hide), tostring(weapon_hide))self.object:restore_weapon()self.weapon_hide_in_dialog = false--printf("PL:RESTORE_D2 ---> self.weapon_hide = [%s] weapon_hide = [%s]", tostring(self.weapon_hide), tostring(weapon_hide))endend-- Апдейт прятание оружия игрока в зоне sr_no_weaponif check_for_weapon_hide_by_zones() == true then--printf("weapon_hide1 = [%s]", tostring(weapon_hide))if self.weapon_hide == false then--printf("PL:HIDE_W1 ---> self.weapon_hide = [%s] weapon_hide = [%s]", tostring(self.weapon_hide), tostring(weapon_hide))self.object:hide_weapon()self.weapon_hide = true--printf("PL:HIDE_W2 ---> self.weapon_hide = [%s] weapon_hide = [%s]", tostring(self.weapon_hide), tostring(weapon_hide))endelse--printf("weapon_hide3 = [%s]", tostring(weapon_hide))if self.weapon_hide == true then--printf("PL:RESTORE_W1 ---> self.weapon_hide = [%s] weapon_hide = [%s]", tostring(self.weapon_hide), tostring(weapon_hide))self.object:restore_weapon()self.weapon_hide = false--printf("PL:RESTORE_W2 ---> self.weapon_hide = [%s] weapon_hide = [%s]", tostring(self.weapon_hide), tostring(weapon_hide))endend-- обновление рестрикторов, которые под логикой, срабатывает через интервалы времениif self.next_restrictors_update_time < time thenself.next_restrictors_update_time = time + 200self.task_manager:update()end-- обновление постпроцессовif post_process ~= 0 thenif post_process:update () == true thenpost_process = 0endend-- обновление пси-антенныif sr_psy_antenna.psy_antenna thensr_psy_antenna.psy_antenna:update(delta)end--[[local hud_demo = get_hud()local custom_static_demo = hud_demo:GetCustomStatic("cs_demo_play")if custom_static_demo == nil thenhud_demo:AddCustomStatic("cs_demo_play", true)if level.name() == "agroprom_underground" thenhud_demo:GetCustomStatic("cs_demo_play"):wnd():SetTextST("st_demo_agr")elseif level.name() == "military_nvidia" thenhud_demo:GetCustomStatic("cs_demo_play"):wnd():SetTextST("st_demo_mil")elsehud_demo:GetCustomStatic("cs_demo_play"):wnd():SetTextST("st_demo_play")endendif jump_level.need_jump==true thenhud_demo:GetCustomStatic("cs_demo_play"):wnd():SetTextST("L: " .. level.name() .. " frame [" ..tostring(device().frame) .."] delta[" ..tostring(device().frame - self.spawn_frame) .."]")end]]----' Вывод сообщения о большой радиацииif self.object.radiation >= 0.7 thenlocal hud = get_hud()local custom_static = hud:GetCustomStatic("cs_radiation_danger")if custom_static == nil thenhud:AddCustomStatic("cs_radiation_danger", true)hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")endelselocal hud = get_hud()local custom_static = hud:GetCustomStatic("cs_radiation_danger")if custom_static ~= nil thenhud:RemoveCustomStatic("cs_radiation_danger")endendif self.bCheckStart thenprintf("SET DEFAULT INFOS")if not has_alife_info("global_dialogs") thenself.object:give_info_portion("global_dialogs")endif not has_alife_info("level_changer_icons") thenself.object:give_info_portion("level_changer_icons")endlevel_tasks.add_lchanger_location()self.bCheckStart = falseend--' Distemper 03.2008 --if xrs_dyn_music.play_combat == 0 thenxrs_dyn_music.interactive_music(0)elseif xrs_dyn_music.play_combat == 1 thenxrs_dyn_music.interactive_music(20)elseif xrs_dyn_music.play_combat == 2 thenxrs_dyn_music.interactive_music(10)endxr_s.on_actor_update(delta)--' end --if xr_surge_hide.start_surge thenif not xr_surge_hide.weather_surge thenxr_surge_hide.weather_surge = truelevel.set_weather("default_cloudy", true)endlocal diff_sec = math.ceil(game.get_game_time():diffSec(xr_surge_hide.initialization_time)/level.get_time_factor())local time_before_lag_noosphere = 0local time_before_give_task = 0if level.name() == "marsh" thentime_before_lag_noosphere = 12time_before_give_task = 15elsetime_before_lag_noosphere = 17time_before_give_task = 27endif diff_sec>=time_before_lag_noosphere and xr_surge_hide.phase == 1 thenxr_surge_hide.activate_surge()elseif diff_sec>=time_before_give_task and xr_surge_hide.phase == 2 thenxr_surge_hide.activate_surge(xr_surge_hide.time_before_surge)endendlocal al = alife()if al ~= nil thenlocal name = al:level_name(al:level_id())if(self.last_level_name==nil) thenself.last_level_name = nameelseif(name~=self.last_level_name) thenself.last_level_name = namelocal time = xr_surge_hide.surge_can_be_started(name)if time thenxr_surge_hide.activate_surge(time)endendendendif guiders.teleported_to_another_level and not guiders.level_changed thenguiders.action_teleport_to_point()endend----------------------------------------------------------------------------------------------------------------------function actor_binder:save(packet)set_save_marker(packet, "save", false, "actor_binder")object_binder.save(self, packet)--' Сохраняем уровень сложностиpacket:w_u8(level.get_game_difficulty())--' Сохраняем данные об отключенном вводеif self.st.disable_input_time == nil thenpacket:w_bool(false)elsepacket:w_bool(true)utils.w_CTime(packet, self.st.disable_input_time)endxr_logic.pstor_save_all(self.object, packet)self.weather_manager:save(packet)release_body_manager.get_release_body_manager():save(packet) --' Distemper 12.02.2008xr_surge_hide.save(packet)sr_psy_antenna.save( packet )--self.actor_detector:save(packet)packet:w_bool(sim_board.get_sim_board().simulation_started)-- Сохранение списка ожидания на команду атаки от игрокаlocal n = 0for k,v in pairs(sim_combat.wait_for_combat) don = n + 1endpacket:w_u8(n)for k,v in pairs(sim_combat.wait_for_combat) dopacket:w_u16(k)packet:w_stringZ(v)endxr_sound.actor_save(packet)packet:w_stringZ(tostring(self.last_level_name))xr_statistic.save(packet)guiders.save(packet)treasure_manager.save(packet)n = 0for k,v in pairs(delayed_alife_release_objects) don = n + 1endpacket:w_u8(n)for k,v in pairs (delayed_alife_release_objects) doprintf("TO_RELEASING OBJ:[%s]", tostring(k))packet:w_u16(k)endn = 0for k,v in pairs(db.script_ids) don = n + 1endpacket:w_u8(n)for k,v in pairs (db.script_ids) dopacket:w_u16(k)packet:w_stringZ(v)end-- minigames_manager.get_minigames_manager():save(packet)set_save_marker(packet, "save", true, "actor_binder")end----------------------------------------------------------------------------------------------------------------------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))get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])local stored_input_time = reader:r_u8()if stored_input_time == true thenself.st.disable_input_time = utils.r_CTime(reader)endxr_logic.pstor_load_all(self.object, reader)self.weather_manager:load(reader)release_body_manager.get_release_body_manager():load(reader) --' Distemper 12.02.2008xr_surge_hide.load(reader)sr_psy_antenna.load(reader)--self.actor_detector:load(reader)sim_board.get_sim_board().simulation_started = reader:r_bool()-- Загрузка списка ожидания на команду атаки от игрокаlocal n = reader:r_u8()sim_combat.wait_for_combat = {}for i = 1,n dosim_combat.wait_for_combat[reader:r_u16()] = reader:r_stringZ()endxr_sound.actor_load(reader)local n = reader:r_stringZ()if(n~="nil") thenself.last_level_name = nendxr_statistic.load(reader)guiders.load(reader)treasure_manager.load(reader)n = reader:r_u8()for i = 1,n doto_delayed_alife_release_objects[reader:r_u16()] = trueendprintf("delayed_alife_release_objects")print_table(delayed_alife_release_objects)n = reader:r_u8()for i = 1,n dodb.script_ids[reader:r_u16()] = reader:r_stringZ()end-- minigames_manager.get_minigames_manager():load(reader)set_save_marker(reader, "load", true, "actor_binder")end------------------------------------------------------------------------------------------------------------------------старт префетча звуков--if string.find(command_line(), "-noprefetch") == nil then-- sound_prefetch.prefetch_sounds()--endfunction check_for_weapon_hide_by_zones()for k,v in pairs(weapon_hide) doif v == true thenreturn trueendendreturn falseend-- Weapon functionsfunction hide_weapon(zone_id)weapon_hide[zone_id] = trueendfunction restore_weapon(zone_id)weapon_hide[zone_id] = falseendfunction add_to_delayed_release(obj_id)printf("TO_RELEASING_add OBJ:[%s]", tostring(obj_id))delayed_alife_release_objects[obj_id] = trueendfunction del_to_delayed_release(obj_id)printf("TO_RELEASING_del OBJ:[%s]", tostring(obj_id))delayed_alife_release_objects[obj_id] = nilend @ColR_iT, Укажи что я не правильно написал, я просто только учусь работать со скриптами) Ссылка на комментарий
ColR_iT 171 Опубликовано 4 Июня 2013 Автор Поделиться Опубликовано 4 Июня 2013 @Артём_killer, вообще-то, когда я говорил, чтобы ты скинул два файла, я ожидал увидеть ссылку, ну максимум две - на каждый файл... Ну да ладно. По сабжу... Я упустил из виду тот момент, что в ЧН в функцию hide_weapon передаётся (зачем-то) имя зоны. Измени функцию HideWeapon в файле medicine.script на вот эту: --# Убираем оружие. --# timeNow - время на которое убирать. function HideWeapon (timeNow) --# Прячем оружие. db.actor.hide_weapon() --# Если время вышло, то... if time_global() > timeNow + timeHide then --# Вернём оружие db.actor.restore_weapon() --# отключим данную функцию от апдейта. xr_s.unregister_callback ("update", medicine.HideWeapon) return end end Вылета более быть не должно. Вывод радиации по этому же принципу сделать можно. P.S. спасибо, за указанную ошибку. Ссылка на комментарий
Артём_killer 12 Опубликовано 4 Июня 2013 Поделиться Опубликовано 4 Июня 2013 @ColR_iT, И тебе большое спасибо) А как по этому же принципу сделать вывод радиации? Вылета нет, но медикаменты не действуют здоровье не прибавляется почему-то А еще если на базе чн используешь аптечку, то когда выходишь на болото гг не достает ничего из оружия, только детектор и все. А вообще реально медицину из зп, перенести в чн, вмести со всеми ее свойствами? Ссылка на комментарий
ColR_iT 171 Опубликовано 4 Июня 2013 Автор Поделиться Опубликовано 4 Июня 2013 @Артём_killer, в файле bind_stalker.script, в 421 строке убери повторный вызов функции on_actor_update. Возможно причина из-за этого, т.к. всё должно работать, ибо ничего архисложного там ничего нет... Ссылка на комментарий
Артём_killer 12 Опубликовано 4 Июня 2013 Поделиться Опубликовано 4 Июня 2013 визуалы это не трудно, впрочем как и сами медикаменты и предметы, но мот их функциональность этого я не могу. Ссылка на комментарий
ColR_iT 171 Опубликовано 4 Июня 2013 Автор Поделиться Опубликовано 4 Июня 2013 Вывод радиации делается аналогично функции UpdateHealth в файле medicine.script, только вместо пополнения здоровья нужно делать вывод радиации. Разгляди внимательно эту функцию, там к каждой строке приписаны комментарии, не сложно разобраться, если хоть чуть-чуть знаком с программированием, если же не знаком - "звиняйте" это не ко мне... Ссылка на комментарий
Артём_killer 12 Опубликовано 4 Июня 2013 Поделиться Опубликовано 4 Июня 2013 Убрал, тоже самое нечего не происходит @ColR_iT, Напиши пожалуйста свой bind_stalker.script, я уже все перепробовал, не выходит ничего, игра работает стабильно, но от аптечек нет толку действий ноль. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти