Перейти к контенту

Рекомендуемые сообщения

[ТЧ 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

Осенний каламбур. Сентябрь - лето.

img.php?nick=Balavnik&sert=2&text=t6

Ссылка на комментарий

Почему у некоторых объектов вызов метода :id() вызывает ошибку:  attempt to call method 'id' (a number value)?

 

При этом метод :name() работает, и выводит всё как надо.

Изменено пользователем Balavnik

Осенний каламбур. Сентябрь - лето.

img.php?nick=Balavnik&sert=2&text=t6

Ссылка на комментарий

@Balavnik , с каким типом объекта пытаемся при этом работать?

Для клиентского объекта ID это функция, для серверного - параметр (константа, идентификатор). Соответственно:

obj.id -- для серверного объекта
obj:id() -- для клиентского объекта

Также у некоторых игровых объектов (болт, например) может отсутствовать серверная сущность. Т.е. клиентский класс объекта присутствует, а серверного не существует.

 

p.s.: вообще, краткость далеко не всегда сестра таланта, доложу я вам, господа самоделкины.

  • Нравится 1
  • Согласен 1
Ссылка на комментарий

@Купер Но почему для этого же объекта метод :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)

 

Изменено пользователем Balavnik
  • Смешно 1

Осенний каламбур. Сентябрь - лето.

img.php?nick=Balavnik&sert=2&text=t6

Ссылка на комментарий

Есть еще один специфический вариант: при разбивании ящика объект-убийца передается в обработчик callback.death как движковый (C++), а не как игровой (Lua), из-за чего случается вылет при проверке who:id().

  • Нравится 2

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

Здравствуйте, есть вот такой скрипт(зп)

Скрытый текст
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)%. Заранее спасибо.

Изменено пользователем Pavel_2000
Ссылка на комментарий

По образу и подобию других функций в том же скрипте: сделать обработку стандартных для логики аргументов actor, npc, p (названия любые, типы "объект, объект, список") и читать свои значения, переданные из логики, по ссылкам p[1], p[2], …

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

@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, но из этого ничего не вышло. Помогите написать этот скрипт пожалуйста 

Ссылка на комментарий

Как на оригинальном движке создать циклическую проверку time_global вне загруженной игры, то есть без апдейта ГГ или другого объекта? Хочу сделать перемотку списка сейвов удерживанием клавиш.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

Есть скрипт, отвечающий за проигрывание анимок при ходьбе с оружием и так далее...

Скрытый текст

--[[-----------------------------------------------------------------------------------------------
 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_mgr
local 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 = 0
end
---------------------------------------------------------------------------------------------------
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
    end
end
---------------------------------------------------------------------------------------------------
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
    end
end
---------------------------------------------------------------------------------------------------
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")
    end
end
---------------------------------------------------------------------------------------------------
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"
    end
end
---------------------------------------------------------------------------------------------------
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
    end
end
---------------------------------------------------------------------------------------------------
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)
    end
end
---------------------------------------------------------------------------------------------------
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_list
end
---------------------------------------------------------------------------------------------------
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
    end
end
---------------------------------------------------------------------------------------------------
function CHudAnimationsMgr:is_mag_empty()
    return self.item:get_ammo_in_magazine() == 0
end
---------------------------------------------------------------------------------------------------
function CHudAnimationsMgr:reset_animation()
    self.animation = ""
    self.animation_length = 0
end
---------------------------------------------------------------------------------------------------
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
    end
end
---------------------------------------------------------------------------------------------------
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()))
    end
end
---------------------------------------------------------------------------------------------------
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_mgr
end

Подозреваю, вот сюда:

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"...

Но у меня лыжи не едут.

Ссылка на комментарий

@Капрал Хикс там просто выбор анимки в зависимости от условия, типа с надетым подстволом одно, у двустволки другое и т.д.

-- В той же ветке, после
elseif get_clsid(self.item) == clsid.wpn_bm16_s then
...
-- впилить
elseif self.item:is_artefact() then
...
end

Кстати, в актуальной версии скрипт посвежее :happy:

 

14 часов назад, Norman Eisenherz сказал:

Как на оригинальном движке создать циклическую проверку time_global вне загруженной игры, то есть без апдейта ГГ или другого объекта? Хочу сделать перемотку списка сейвов удерживанием клавиш.

В меню можно же подвязаться на апдейт UI-системы:

function Менюшка:Update()
	CUIScriptWnd.Update(self)
    ...
end

 

Изменено пользователем RayTwitty
  • Полезно 1
Ссылка на комментарий

В 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. Короче да куча методов своих не совместимо с ОГСР

Изменено пользователем Stalkersof
Ссылка на комментарий

@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

 

 

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
7 часов назад, Norman Eisenherz сказал:

один раз сработало, дальше молчит.

Нужно выводить в лог значение time_global за пределами условия и смотреть, что не так. Там же игра на паузе стоит, я не помню меняется ли time_global в этом случае. Первый раз гарантировано сработает потому что сравнение с нулем.

Ссылка на комментарий

Огср движок функция на апдейте. Вроде бы все просто а не работает. Есть артефакт на поясе прибавляем вес нет артефакта обнуляем. Прибавлять прибавляет а обнулять не хочет. 

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
		)

 

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   1 пользователь

×
×
  • Создать...