CRAZY_STALKER666 36 Опубликовано 23 Июля 2016 Поделиться Опубликовано 23 Июля 2016 Другой вопрос - xr_robbers - кто-нибудь когда-нибудь пытался эту схему использовать? Работоспособна ли она? Не соответствует правилам. Ссылка на комментарий
UnLoaded 313 Опубликовано 23 Июля 2016 Поделиться Опубликовано 23 Июля 2016 @CRAZY_STALKER666 Вообще-то насчет не используемых вещей в скриптах\конфигах\спавне - не ужели ты впервые узнал, что разрабы наплодили вышеназванного в приличном кол-ве и не удосужились это подчистить даже в релизе ? Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 23 Июля 2016 Поделиться Опубликовано 23 Июля 2016 Вообще-то насчет не используемых вещей в скриптах\конфигах\спавне - не ужели ты впервые узнал, что разрабы наплодили вышеназванного в приличном кол-ве и не удосужились это подчистить даже в релизе ? Знал. Но не я один их замечал, исследовал. Может кто и довел скрипт до конца. Вот и интересуюсь... Не соответствует правилам. Ссылка на комментарий
Kondr48 314 Опубликовано 24 Июля 2016 Поделиться Опубликовано 24 Июля 2016 Как можно из скрипта обновить окно инвентаря? Ссылка на комментарий
Карлан 1 049 Опубликовано 24 Июля 2016 Поделиться Опубликовано 24 Июля 2016 @Kondr48, есть функция: ui.reinit_show_ui() В репозитории xp-dev, если ты на нем, то она перегружает карбоди и инвентарь, если не на нем, то посмотри как сделано. Обновление окон в оригинале достаточно странно сделано, сравнивается фрейм, который меняется в куче мест совершенно непонятно зачем, это все можно сделать на флагах и в таком случае все гораздо проще будет экспортировать в скрипты, да и в целом с этим работать. А сейчас роль флага выполняют фреймы, я до сих пор не понял почему они так сделали. 1 Ссылка на комментарий
Kondr48 314 Опубликовано 24 Июля 2016 Поделиться Опубликовано 24 Июля 2016 Если кто-то еще захочет использовать, в посте Карлана небольшая опечатка, функция называется ui.reinit_shown_ui() Ссылка на комментарий
Kondr48 314 Опубликовано 25 Июля 2016 Поделиться Опубликовано 25 Июля 2016 Почему если получить инвентарь вот так: inv = ui.get_inventory_wnd()и приаттачить к полученному окну статик, то он не пропадает из инвентаря пока игру полностью не перезапустить. Как его удалить как только мы закрыли инвентарь? Чтобы при новом открытии он заново создался. Ссылка на комментарий
Malandrinus 615 Опубликовано 25 Июля 2016 Поделиться Опубликовано 25 Июля 2016 Почему ... не пропадает из инвентаря пока игру полностью не перезапустить Потому что окно инвентаря в игре создаётся один раз и при открытии инвентаря просто показывается, а затем скрывается. Как его удалить как только мы закрыли инвентарь? Надо создавать и удалять соответственно по открытию и закрытию инвентаря. Подходов масса. Один из распространённых - повесить создание и удаление своих контролов на выдачу специальных инфопорций. Пример такого навешивания дополнительных элементов управления есть в огсе/огср. Там есть модуль ogse_addons.script, где поверх оружейных слотов добавляются кнопочки для управления аддонами. 1 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Gray Hawk 0 Опубликовано 26 Июля 2016 Поделиться Опубликовано 26 Июля 2016 @Kondr48, 1-2 страницы именно, если не меньше, мне чисто для просмотра записок и заметок всяческих Ссылка на комментарий
Kondr48 314 Опубликовано 26 Июля 2016 Поделиться Опубликовано 26 Июля 2016 (изменено) Gray Hawk, ну раз их будет несколько, лучше в любом случае на фон выводить текст, а не писать на каждой текстуре (меньший вес будет) ---Вопрос по скриптовым окнам. Вот допустим у меня есть окошко с элементами. Вот если у меня этих элементов столько, что они начинают вылезать за границу окошка, как мне ползунок прикрутить? Изменено 26 Июля 2016 пользователем Kondr48 Ссылка на комментарий
AndrewMor 527 Опубликовано 27 Июля 2016 Поделиться Опубликовано 27 Июля 2016 Напомните кто-нибудь, как узнать максимальное количество lvid на конкретной локации? 1 Сталкер - наше всё! Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 27 Июля 2016 Поделиться Опубликовано 27 Июля 2016 (изменено) максимальное количество lvid на конкретной локации? Тут посмотри: https://github.com/dsh2dsh/op2ogse/blob/master/gamedata/scripts/ogse_anomaly.script Изменено 27 Июля 2016 пользователем CRAZY_STALKER666 Не соответствует правилам. Ссылка на комментарий
AndrewMor 527 Опубликовано 27 Июля 2016 Поделиться Опубликовано 27 Июля 2016 Тут посмотри: Список локаций там неполный. Меня интересовало, как скриптово узнать максимальное кол-во левел-вертексов. 1 Сталкер - наше всё! Ссылка на комментарий
dsh 3 824 Опубликовано 27 Июля 2016 Поделиться Опубликовано 27 Июля 2016 @AndrewMor, вот тут вот https://github.com/dsh2dsh/op2ogse/blob/master/gamedata/scripts/dsh.script см. функции GetLevelVertexes( level ) и GetGameVertexes( level ). Взято отсюда же. Выше есть примеры использования. 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Kirgudu 1 217 Опубликовано 27 Июля 2016 Поделиться Опубликовано 27 Июля 2016 (изменено) @AndrewMor, например так: function GetMaxLevelVertexId(idLevel) local gg, idLvMax, levelChecked, i, idLv = game_graph(), 0, false, 0, nil while i < 65536 do if gg:valid_vertex_id(i) and gg:vertex(i):level_id() == idLevel then idLv = gg:vertex(i):level_vertex_id() if idLvMax < idLv then idLvMax = idLv end if not levelChecked then levelChecked = true end elseif levelChecked then break end i = i + 1 end return idLvMax end -- пример вызова для текущей локации: idLvMax = GetMaxLevelVertexId(alife():level_id()) Изменено 28 Июля 2016 пользователем Kirgudu Инструмент Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 27 Июля 2016 Поделиться Опубликовано 27 Июля 2016 Добрый день. Как заполнять таблицу функцией. Например есть пустая таблица: t_tbl = {} Которую мне нужно заполнять определенными значениями. А эти значения будут появляться в переменной(например): local dd = любое_значение Ссылка на комментарий
Kirgudu 1 217 Опубликовано 27 Июля 2016 Поделиться Опубликовано 27 Июля 2016 @Kober(BRUC), table.insert(t_tbl, dd) 2 2 Инструмент Ссылка на комментарий
AndrewMor 527 Опубликовано 27 Июля 2016 Поделиться Опубликовано 27 Июля 2016 например так: Спасибо. Только после alife нужны скобки Добавлено Kirgudu, 28 Июля 2016 Да-да, был невнимателен, спасибо. Писал по памяти, вот и пропустил. В том посте исправил. Сталкер - наше всё! Ссылка на комментарий
злойлеший 0 Опубликовано 29 Июля 2016 Поделиться Опубликовано 29 Июля 2016 Всем доброго времени суток. В чистую ТЧ сделал себе, по статьям из вики, спальник и ремкомплект. По отдельности они работают без проблем, но при соединении в одну геймдату работает только спальник. Совместно ими используется только bind_stalker.script. function init (obj) xr_motivator.AddToMotivator(obj)endfunction actor_init (npc)npc:bind_object(actor_binder(npc))endlocal game_difficulty_by_num = {[0] = "gd_novice",[1] = "gd_stalker",[2] = "gd_veteran",[3] = "gd_master"}lasthealth = 0lasttime = 0post_process = 0local weapon_hide = false----------------------------------------------------------------------------------------------------------------------class "actor_binder" (object_binder)----------------------------------------------------------------------------------------------------------------------function actor_binder:__init (obj) super(obj)self.bCheckStart = falseself.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 = trueself.weapon_hide = false -- спрятано или нет оружие при разговоре.weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.if object_binder.net_spawn(self,data) == false thenreturn falseenddb.add_actor(self.object)if self.st.disable_input_time == nil thenlevel.enable_input()endself.weather_manager:reset()-- game_stats.initialize ()if(actor_stats.add_to_ranking~=nil)thenactor_stats.add_to_ranking(self.object:id())end--' Загружаем настройки дропаdeath_manager.init_drop_settings()return trueend----------------------------------------------------------------------------------------------------------------------function actor_binder:net_destroy()if(actor_stats.remove_from_ranking~=nil)thenactor_stats.remove_from_ranking(self.object:id())end-- game_stats.shutdown ()db.del_actor(self.object)sr_light.clean_up ()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 = falseendxr_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 = 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_object, self)self.object:set_callback(callback.use_object, self.repair_outfit_start, self)end----------------------------------------------------------------------------------------------------------------------function actor_binder:take_item_from_box(box, item)local story_id = box:story_id()if story_id == nil thenreturnendtreasure_manager.take_item_from_box(box, story_id)--[[local respawner = se_respawn.get_respawner_by_parent(story_id)if respawner == nil thenreturnend--' Необходимо уменьшить счетчик в респавнереrespawner:remove_spawned(item:id())local smart_terrain = db.strn_by_respawn[respawner:name()]if smart_terrain == nil thenreturnendlocal npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position())if npc ~= nil thenxr_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)--' Сюжет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)elsegame_stats.money_trade_update (-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)--game_stats.update_take_item (obj, self.object)end----------------------------------------------------------------------------------------------------------------------function actor_binder:on_item_drop (obj)level_tasks.proceed(self.object)--game_stats.update_drop_item (obj, self.object)endfunction actor_binder:use_obj(obj)main_sleep.sleep(obj)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 thenif _state == task.fail thennews_manager.send_task(db.actor, "fail", _task, _objective)elseif _state == task.completed thentask_manager.reward_by_task(_task)news_manager.send_task(db.actor, "complete", _task, _objective)elsenews_manager.send_task(db.actor, "new", _task, _objective)endelseif _task:get_objective(0):get_state() == task.in_progress thennews_manager.send_task(db.actor, "update", _task, _objective)endendend----------------------------------------------------------------------------------------------------------------------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)-- DEBUG slowdown-- slowdown.update()local time = time_global()game_stats.update (delta, self.object)show_time.show_time()-- апдейт погодыself.weather_manager:update()-- апдейт схемы детектораself.actor_detector:update()-- апдейт звуковой схемы актераxr_sound.update_actor()--' Проверка потери жизни--[[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 weapon_hide == true or self.object:is_talking() thenif self.weapon_hide == false thenself.object:hide_weapon()self.weapon_hide = trueendelseif self.weapon_hide == true thenself.object:restore_weapon()self.weapon_hide = falseendend-- обновление рестрикторов, которые под логикой, срабатывает через интервалы времениif self.next_restrictors_update_time < time thenbind_restrictor.actor_update(delta)self.next_restrictors_update_time = time + 200task_manager.actor_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--' Вывод сообщения о большой радиации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("storyline_actor_start") and(level.name() == "l01_escape")thenself.object:give_info_portion("storyline_actor_start")_G.g_start_avi = trueprintf("*AVI* RUN START AVI")end-- if not has_alife_info("encyclopedy") then-- self.object:give_info_portion("encyclopedy")-- endif 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--autosave.save_update()end----------------------------------------------------------------------------------------------------------------------function actor_binder:save(packet)local save_treasure_manager = trueprintf("actor_binder:save(): self.object:name()='%s'", self.object:name())object_binder.save(self, packet)--' Сохраняем уровень сложностиif save_treasure_manager == true thenpacket:w_u8(level.get_game_difficulty() + 128)elsepacket:w_u8(level.get_game_difficulty())end--' Сохраняем данные об отключенном вводеif self.st.disable_input_time == nil thenpacket:w_bool(false)elsepacker: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)sr_psy_antenna.save( packet )if save_treasure_manager == true thentreasure_manager.save(packet)endtask_manager.save(packet)self.actor_detector:save(packet)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 = falseif game_difficulty >= 128 thengame_difficulty = game_difficulty - 128load_treasure_manager = trueendget_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])if reader:r_eof() thenabort("SAVE FILE IS CORRUPT")endlocal 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)sr_psy_antenna.load(reader)if load_treasure_manager == true thentreasure_manager.load(reader)endtask_manager.load(reader)self.actor_detector:load(reader)endfunction actor_binder:repair_outfit_start(obj, who)if obj thenif obj:section() == "abc_repair" thenremkomplekt.action_repair()endendend------------------------------------------------------------------------------------------------------------------------старт префетча звуков--if string.find(command_line(), "-noprefetch") == nil then-- sound_prefetch.prefetch_sounds()--end-- Weapon functionsfunction hide_weapon()weapon_hide = trueendfunction restore_weapon()weapon_hide = falseend// 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 = "", "", resultfor i=0,n-1 doresult, id, value = file:r_line(section_name,i,"","")printf ("line %d : %s = %s",i,id,value)endendtest_section_iteration("system.ltx","space_restrictor")/**/ Вопрос как их заставить работать в одном моде? Ссылка на комментарий
Kondr48 314 Опубликовано 29 Июля 2016 Поделиться Опубликовано 29 Июля 2016 (изменено) self.object:set_callback(callback.use_object, self.use_object, self) self.object:set_callback(callback.use_object, self.repair_outfit_start, self) А чего вы для одного колбека делаете две разные функции? Оставьте только первое. self.object:set_callback(callback.use_object, self.use_object, self) Потом ищите свою функцию use_object (она у вас почему-то use_obj называется), где спальник прописан и переносите кусочек, который отвечает за ремкоплект из функции repair_outfit_start в use_object. Вот так: function actor_binder:use_object(obj) main_sleep.sleep(obj) if obj:section() == "abc_repair" then remkomplekt.action_repair() end end function actor_binder:use_obj(obj) main_sleep.sleep(obj) end function actor_binder:repair_outfit_start(obj, who) if obj then if obj:section() == "abc_repair" then remkomplekt.action_repair() end end end P.S. А вообще старайтесь думать. Потому что в bind_stalker справки внесены совсем без понимания. Изменено 29 Июля 2016 пользователем Kondr48 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти