Norman Eisenherz 316 Опубликовано 16 Ноября Поделиться Опубликовано 16 Ноября [ТЧ 1.0006] В обработчике логики [xr_remark.script] для выдачи сообщений сделано что-то странное: - после проверки "в конфиге логики есть параметр tips" запускается проверка наличия звука, сопоставленного с таким текстом в [news_manager.script]; - если получена ссылка на сопоставленный звук, этот звук проигрывается в дополнение к звуку, указанному в логике через параметр "snd" (при разнице в задержке вывода или ссылках будет каша); - "настоящий" звук запускается отдельным обработчиком xr_sound.set_sound_play вне проверки tips; - в проверку наличия звука передаются аргументы "объект ГГ, tips_id, tips_sender", хотя принимаются аргументы "объект ГГ, tips_id, задержка вывода, tips_sender", из которых проверяется только tips_id; - задержка вывода при обработке указана заново, причем глобальной переменной и применяется только для вывода обычного звука КПК; - отправка сообщения не выполняется ни в каком виде. Я упускаю какой-то хитрый замысел, или этот огород не делает ничего полезного? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Balavnik 118 Опубликовано 22 Ноября Поделиться Опубликовано 22 Ноября (изменено) Можно ли отключить голод у актора скриптом? Изменено 22 Ноября пользователем Balavnik Осенний каламбур. Сентябрь - лето. Ссылка на комментарий
Balavnik 118 Опубликовано 27 Ноября Поделиться Опубликовано 27 Ноября (изменено) Почему у некоторых объектов вызов метода :id() вызывает ошибку: attempt to call method 'id' (a number value)? При этом метод :name() работает, и выводит всё как надо. Изменено 27 Ноября пользователем Balavnik Осенний каламбур. Сентябрь - лето. Ссылка на комментарий
Купер 2 917 Опубликовано 28 Ноября Поделиться Опубликовано 28 Ноября @Balavnik , с каким типом объекта пытаемся при этом работать? Для клиентского объекта ID это функция, для серверного - параметр (константа, идентификатор). Соответственно: obj.id -- для серверного объекта obj:id() -- для клиентского объекта Также у некоторых игровых объектов (болт, например) может отсутствовать серверная сущность. Т.е. клиентский класс объекта присутствует, а серверного не существует. p.s.: вообще, краткость далеко не всегда сестра таланта, доложу я вам, господа самоделкины. 1 1 Ссылка на комментарий
Balavnik 118 Опубликовано 28 Ноября Поделиться Опубликовано 28 Ноября (изменено) @Купер Но почему для этого же объекта метод :name() корректно возвращает имя, а для него же при вызове метода :id() вылетает ошибка? P.s. Приложу код и лог. OGSR, если что. Скрытый текст log1(wpn:name()) log1(""..wpn:id()) Скрытый текст [28.11.24 10:40:07.103] [16192] wpn_pm0420 [28.11.24 10:40:07.103] [16192] 420 wpn_pm0341 [28.11.24 10:40:16.126] [16192] ********************************************************************************* [28.11.24 10:40:16.126] [16192] [print_output([CScriptEngine::lua_pcall_failed])] SCRIPT RUNTIME ERROR: d:\games\s.t.a.l.k.e.r\gamedata\scripts\rx\rx_utils.script:457: attempt to call method 'id' (a number value) Изменено 28 Ноября пользователем Balavnik 1 Осенний каламбур. Сентябрь - лето. Ссылка на комментарий
Fllfll 7 Опубликовано 28 Ноября Поделиться Опубликовано 28 Ноября @Balavnik в скриптах есть lua_help.script, сверяйся с ним, практически всё там есть Ссылка на комментарий
Norman Eisenherz 316 Опубликовано 28 Ноября Поделиться Опубликовано 28 Ноября Есть еще один специфический вариант: при разбивании ящика объект-убийца передается в обработчик callback.death как движковый (C++), а не как игровой (Lua), из-за чего случается вылет при проверке who:id(). 2 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Это популярное сообщение. Kirgudu 1 217 Опубликовано 28 Ноября Это популярное сообщение. Поделиться Опубликовано 28 Ноября (изменено) 10 часов назад, Balavnik сказал: Но почему для этого же объекта метод :name() корректно возвращает имя, а для него же при вызове метода :id() вылетает ошибка? Потому что так написан движок. Метод серверного объекта :name() существует, а метод того же объекта :id() - нет, вместо него числовое свойство .id. На это тебе даже лог намекает: 10 часов назад, Balavnik сказал: (a number value) И если в данном случае ты напишешь log1(""..wpn.id), то будет тебе счастье. Изменено 28 Ноября пользователем Kirgudu 2 3 Инструмент Ссылка на комментарий
Pavel_2000 5 Опубликовано 30 Ноября Поделиться Опубликовано 30 Ноября (изменено) Здравствуйте, есть вот такой скрипт(зп) Скрытый текст function delete_af_mahovik_1() local lc = alife():story_object(story_ids.af_mahovik_1) alife():release(lc, true) end находится он у меня в xr_effects, использую в логике рестриктора %=delete_af_mahovik_1%. Сильно за скрипты не шарю. Поэтому и такой вопрос: Как переделать этот скрипт что бы в логике писать нужный мне id по типу %=delete_af(af_mahovik_1)%. Заранее спасибо. Изменено 30 Ноября пользователем Pavel_2000 Ссылка на комментарий
Norman Eisenherz 316 Опубликовано 30 Ноября Поделиться Опубликовано 30 Ноября По образу и подобию других функций в том же скрипте: сделать обработку стандартных для логики аргументов actor, npc, p (названия любые, типы "объект, объект, список") и читать свои значения, переданные из логики, по ссылкам p[1], p[2], … Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Pavel_2000 5 Опубликовано 1 Декабря Поделиться Опубликовано 1 Декабря @Norman Eisenherz так я и делал только у меня ничего не получается, то вылетает то вообще не работает Я перепробовал разные варианты, но так так синтаксис луан мне не знаком, у меня ничего не выходит function delete_af_mahovik_1(actor, object, p) local lc = alife():story_object(story_ids.p[1]) alife():release(lc, true) end Вот так вот пробовал не работает Я пробовал переделать функции remove_npc и destroy_object под свои задачи не получилось. Пытался с умным лицом читать статьи про Lua, но из этого ничего не вышло. Помогите написать этот скрипт пожалуйста Ссылка на комментарий
Это популярное сообщение. Kirgudu 1 217 Опубликовано 1 Декабря Это популярное сообщение. Поделиться Опубликовано 1 Декабря (изменено) @Pavel_2000 если со всеми проверками "на дурака", то примерно так: function delete_af(actor, npc, p) if type(p) == "table" then -- проверяем, что параметр передан и имеет табличный тип local story_id = p[1] -- присваиваем story_id из параметра if type(story_id) == "string" then -- но если передана строка, то story_id = tonumber(story_id) or story_ids[story_id] -- пробуем превратить строку в число или получить числовой story_id из штатного перечисления по его наименованию end if type(story_id) == "number" and story_id > 0 then -- проверяем, что story_id найден, имеет числовой тип и больше нуля local lc = alife():story_object(story_id) -- ищем объект по story_id if lc ~= nil then -- проверяем, что объект найден alife():release(lc, true) -- производим удаление объекта end end end end Использовать так: %=delete_af(af_mahovik_1)% или так: %=delete_af(111)% Это, разумеется, сильно избыточный вариант, который полностью исключает вылет, если передано что-то не то. Но если уверен в том, что пишешь в логике, скрипт можно и сократить. Изменено 1 Декабря пользователем Kirgudu 1 2 2 Инструмент Ссылка на комментарий
Stalkersof 183 Опубликовано 2 Декабря Поделиться Опубликовано 2 Декабря Можно как то скриптом сделать одного монстра из группировки нейтралом по отношению к актору. Freeplay Graphic Mod(FGM) Ссылка на комментарий
Norman Eisenherz 316 Опубликовано 9 Декабря Поделиться Опубликовано 9 Декабря Как на оригинальном движке создать циклическую проверку time_global вне загруженной игры, то есть без апдейта ГГ или другого объекта? Хочу сделать перемотку списка сейвов удерживанием клавиш. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Капрал Хикс 534 Опубликовано 9 Декабря Поделиться Опубликовано 9 Декабря Есть скрипт, отвечающий за проигрывание анимок при ходьбе с оружием и так далее... Скрытый текст --[[----------------------------------------------------------------------------------------------- File : sa_hud_animations_mgr.script Description : Дополнительные анимации худа Copyright : Shadows Addon Author : Ray Twitty aka Shadows Date : 17.12.2012 Last edit : 26.12.2018--------------------------------------------------------------------------------------------------- * Описание возможностей - анимация ходьбы (moving) - анимации удара прикладом (kick), учитывающие подствольник и затворную задержку (параметры kick_enabled, kick_hit_power, kick_hit_impulse, kick_hit_distance, kick_hit_time, kick_sound_time) - исправление сброса анимации при попытках: включить подствольник, стрелять, перезаряжаться и использовать автомобили на расстоянии - скрытие патронов у дробовиков после стрельбы и перезарядки (параметр cartridge_bone)--]]-----------------------------------------------------------------------------------------------local hud_animations_mgrlocal MAX_ANIM_COUNT = 8---------------------------------------------------------------------------------------------------local weapon_states = { idle = 0, fire = 1, fire2 = 2, reload = 3, showing = 4, hiding = 5, hidden = 6, misfire = 7, mag_empty = 8, switch = 9}---------------------------------------------------------------------------------------------------local missile_states = { hidden = 0, showing = 1, idle = 2, attack_begin = 3, attack_idle = 4, attack_act = 5, attack_end = 6, empty = 7, hiding = 8, playing = 9}--[[----------------------------------------------------------------------------------------------- * HUD ANIMATIONS MANAGER--]]-----------------------------------------------------------------------------------------------class "CHudAnimationsMgr"function CHudAnimationsMgr:__init() self.last_item_id = 0 self.animation = "" self.animation_length = 0end---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:update() self.item = db.actor:active_item() if self.item then self.item_id = self.item:id() self.current_state = self.item:get_hud_item_state() if self.last_item_id ~= self.item_id then self:update_item_data() self:reset_animation() self.last_item_id = self.item_id end if self:is_idle_state() then self:moving_and_idle_animation() else self:reset_animation() end if self.last_current_state ~= self.current_state then if self.item:is_weapon_shotgun() and self.cartridge_bone then if self.current_state == weapon_states.fire or self.current_state == weapon_states.reload then self.item:set_hud_bone_visible(self.cartridge_bone, 1) else self.item:set_hud_bone_visible(self.cartridge_bone, 0) end end self.last_current_state = self.current_state end endend---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:moving_and_idle_animation() if self.animation ~= "kick" then if db.actor:is_actor_running() or db.actor:is_actor_walking() then if self.animation ~= "moving" then self:play_hud_animation(self:get_type_animation("moving")) self.animation = "moving" end elseif db.actor:is_actor_sprinting() then if self.animation ~= "sprint" then self:play_hud_animation(self:get_type_animation("sprint")) self.animation = "sprint" end else if self.animation ~= "idle" then self:play_hud_animation(self:get_type_animation("idle")) self.animation = "idle" end end endend---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:kick_animation() if self.animation ~= "kick" and self.kick_enabled and self:is_idle_state() and get_actor_data("camera_type") == EActorCameras.eacFirstEye then self:play_hud_animation(self:get_type_animation("kick")) self.animation = "kick" start_real_timer("kick_end", self.animation_length, "sa_hud_animations_mgr.get_hud_animations_mgr():reset_animation") start_real_timer("kick_hit", self.kick_hit_time, "sa_hud_animations_mgr.get_hud_animations_mgr():kick_hit") start_real_timer("kick_sound", self.kick_sound_time, "sa_hud_animations_mgr.get_hud_animations_mgr():kick_sound") endend---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:get_type_animation(state) if self.item:is_weapon_gl() then if get_weapon_data(self.item, "grenade_mode") then if state == "idle" then return "anim_idle_g" elseif state == "moving" then return "anim_idle_g_moving" elseif state == "sprint" then return "anim_idle_g_sprint" elseif state == "kick" then return "anim_kick_g" end elseif get_weapon_data(self.item, "is_attached_grenade_launcher") or read_line(self.section, "grenade_launcher_status") == 1 then if state == "idle" then return "anim_idle_gl" elseif state == "moving" then return "anim_idle_gl_moving" elseif state == "sprint" then return "anim_idle_gl_sprint" elseif state == "kick" then return "anim_kick_gl" end end elseif self.item:is_weapon_pistol() and self:is_mag_empty() then if state == "idle" then return "anim_empty" elseif state == "moving" then return "anim_idle_moving_empty" --elseif state == "sprint" then --return "anim_idle_sprint_empty" elseif state == "kick" then return "anim_kick_empty" end elseif get_clsid(self.item) == clsid.wpn_bm16_s then local mag_size = self.item:get_ammo_in_magazine() if mag_size == 1 then if state == "idle" then return "anim_idle_1" elseif state == "moving" then return "anim_idle_moving_1" end elseif mag_size == 2 then if state == "idle" then return "anim_idle_2" elseif state == "moving" then return "anim_idle_moving_2" end end end if state == "idle" then return "anim_idle" elseif state == "moving" then return "anim_idle_moving" elseif state == "sprint" then return "anim_idle_sprint" elseif state == "kick" then return "anim_kick" endend---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:play_hud_animation(anim_type) if anim_type then local anim_name = read_line(self.hud_section, anim_type, "string") if anim_name then local animations_list = self:fill_animations_list(anim_name) if table.size(animations_list) > 0 then anim_name = animations_list[math.random(#animations_list)] self.item:play_hud_animation(anim_name, true) self.animation_length = self.item:get_hud_animation_length(anim_name) end end endend---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:update_item_data() self.section = self.item:section() self.hud_section = get_hud_data(self.item, "hud_section") self.cartridge_bone = read_line(self.hud_section, "cartridge_bone", "string") self.kick_enabled = read_line(self.section, "kick_enabled", "bool") if self.kick_enabled then self.kick_hit_power = read_line(self.section, "kick_hit_power") self.kick_hit_impulse = read_line(self.section, "kick_hit_impulse") self.kick_hit_distance = read_line(self.section, "kick_hit_distance") self.kick_hit_time = read_line(self.section, "kick_hit_time") self.kick_sound_time = read_line(self.section, "kick_sound_time", "number", system_ini(), self.kick_hit_time) endend---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:fill_animations_list(anim_name) local animations_list = {} if anim_name then table.insert(animations_list, anim_name) for i = 2, MAX_ANIM_COUNT do if self.item:has_hud_animation(anim_name..i) then table.insert(animations_list, anim_name..i) end end end return animations_listend---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:is_idle_state() if not get_actor_data("zoom_mode") then if self.item:is_weapon() then return self.current_state == weapon_states.idle else return self.current_state == missile_states.idle end endend---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:is_mag_empty() return self.item:get_ammo_in_magazine() == 0end---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:reset_animation() self.animation = "" self.animation_length = 0end---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:on_keyboard(dik, keyboard_action) if self.item and self.item:is_weapon() then if keyboard_action == key_events.pressed then if dik == bind_to_dik(key_bindings.kEXT_1) then self:kick_animation() elseif dik == bind_to_dik(key_bindings.kWPN_RELOAD) then if self.item:get_ammo_in_magazine() ~= get_weapon_data(self.item, "mag_size") then self:reset_animation() end elseif dik == bind_to_dik(key_bindings.kUSE) then local target_obj = level.get_target_obj() if target_obj and target_obj:is_holder() then self:reset_animation() end end elseif keyboard_action == key_events.released then if dik == bind_to_dik(key_bindings.kWPN_FIRE) then if self:is_mag_empty() then self:reset_animation() end elseif dik == bind_to_dik(key_bindings.kWPN_FUNC) then if read_line(self.section, "grenade_launcher_status") == 2 and not get_weapon_data(self.item, "is_attached_grenade_launcher") then self:reset_animation() end end end endend---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:kick_hit() local target_obj = level.get_target_obj() local target_dist = level.get_target_dist() if target_obj and target_dist <= self.kick_hit_distance then make_hit(target_obj, self.kick_hit_power, self.kick_hit_impulse, hit.wound, device().cam_dir, db.actor, get_bone_name_by_id(target_obj, level.get_target_element())) endend---------------------------------------------------------------------------------------------------function CHudAnimationsMgr:kick_sound() play_safe_sound_object("weapons\\swing_"..math.random(4))end--[[----------------------------------------------------------------------------------------------- * INIT--]]-----------------------------------------------------------------------------------------------function get_hud_animations_mgr() if not hud_animations_mgr then hud_animations_mgr = CHudAnimationsMgr() end return hud_animations_mgrend Подозреваю, вот сюда: function CHudAnimationsMgr:get_type_animation(state) Нужно как-то вклинить кусок кода с проверкой на то, что в руках артефакт. Но у меня if self.item:is_artefact() и if get_clsid(self.item) == clsid.artefact_s варианты не проконали. Просто анимка не работает. Ну а дальше проще... if state == "idle" then return "anim_idle" elseif state == "moving" then return "anim_idle" elseif state == "sprint" then return "anim_idle_sprint"... Но у меня лыжи не едут. Ссылка на комментарий
RayTwitty 508 Опубликовано 10 Декабря Поделиться Опубликовано 10 Декабря (изменено) @Капрал Хикс там просто выбор анимки в зависимости от условия, типа с надетым подстволом одно, у двустволки другое и т.д. -- В той же ветке, после elseif get_clsid(self.item) == clsid.wpn_bm16_s then ... -- впилить elseif self.item:is_artefact() then ... end Кстати, в актуальной версии скрипт посвежее 14 часов назад, Norman Eisenherz сказал: Как на оригинальном движке создать циклическую проверку time_global вне загруженной игры, то есть без апдейта ГГ или другого объекта? Хочу сделать перемотку списка сейвов удерживанием клавиш. В меню можно же подвязаться на апдейт UI-системы: function Менюшка:Update() CUIScriptWnd.Update(self) ... end Изменено 10 Декабря пользователем RayTwitty 1 Ссылка на комментарий
Stalkersof 183 Опубликовано 10 Декабря Поделиться Опубликовано 10 Декабря (изменено) В Shadows Addon наверно расширения движка. Попытался прикрутить анимации. Ловлю вылеты. function get_hud_data(obj, param) if obj and param then if param == "hud_section" then set_int_arg0(24) return obj:get_hud_shared_str() end end end Что это за set_int_arg0(24) и такого метода не существует obj:get_hud_shared_str() ОГСР движок PS. Короче да куча методов своих не совместимо с ОГСР Изменено 10 Декабря пользователем Stalkersof Freeplay Graphic Mod(FGM) Ссылка на комментарий
Norman Eisenherz 316 Опубликовано 10 Декабря Поделиться Опубликовано 10 Декабря @RayTwitty Добавил в [ui_load_dialog.script] код, показанный ниже: один раз сработало, дальше молчит. Spoiler local t = 0 function load_dialog:Update() CUIScriptWnd.Update(self) if t < time_global() then t = time_global() + 245 get_console():execute(t) end end Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
RayTwitty 508 Опубликовано 10 Декабря Поделиться Опубликовано 10 Декабря 7 часов назад, Norman Eisenherz сказал: один раз сработало, дальше молчит. Нужно выводить в лог значение time_global за пределами условия и смотреть, что не так. Там же игра на паузе стоит, я не помню меняется ли time_global в этом случае. Первый раз гарантировано сработает потому что сравнение с нулем. Ссылка на комментарий
Stalkersof 183 Опубликовано 11 Декабря Поделиться Опубликовано 11 Декабря Огср движок функция на апдейте. Вроде бы все просто а не работает. Есть артефакт на поясе прибавляем вес нет артефакта обнуляем. Прибавлять прибавляет а обнулять не хочет. db.actor:iterate_belt( function(dummy, obj) if obj:section() == "af_medusa" then af_add = ini:r_float(obj:section(), "additional_inventory_weight") log1(af_add) else af_add = 0 log1(af_add) end end ) Freeplay Graphic Mod(FGM) Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти