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

[SoC] Ковыряемся в файлах

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

@Houdini_one а как насчёт например выдачи другого предмета (предметов) при юзании одного?

И вопрос в целом - как при использовании какого либо предмета будут головокружения, и тд (чтобы был эффект типа пси-атаки контроллёра)

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

Повесить на биндер actor_binder:use_object(obj) функцию, где будет всё это обрабатываться.

Вот пример функции:

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

function use_item(obj) 
    local obj = obj:section()
    if obj then  
        if obj == "medkit" then 
            -- юзанули аптечку - торкнуло (к вопросу о головокружении)
            level.add_pp_effector("alcohol.ppe", 100, false)  

            level.add_pp_effector("duality_circle.ppe", 100, false)
            -- и спавним "пустую" аптечку, например (к вопросу о выдаче нового айтема взамен использованого)
            alife():create("medkit_empty", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) 
        end
    end
end

 

Изменено пользователем mole venomous
  • Спасибо 1

Здесь могла быть ваша реклама.

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

@mole venomousне робит... Даже просто скопировав твой код и вставив, юзанув аптечку ничё не происходит. Скрипт добавил в bind_stalker.script. В самый конец кода.


Или может я тупой, и надо было вставлять куда то в другое место? :biggrin:

Изменено пользователем Hind
забыл дописать
Ссылка на комментарий
14 минут назад, Hind сказал:

bind_stalker.script

Нужно добавить коллбек на использование предмета, если у тебя его нет.

В bind_stalker:

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

function actor_binder:net_destroy()

    ...

    self.object:set_callback(callback.use_object,           nil)  -- коллбэк на использование предмета

    ....

end

 

function actor_binder:reinit()

    ...

    self.object:set_callback(callback.use_object, self.use_object, self)

    ...

end

 

--// Использование предмета
function actor_binder:use_object(obj) 
     use_item(obj)    
end

 

function use_item(obj) 
    local obj = obj:section()
    if obj then  
        if obj == "medkit" then 
            -- юзанули аптечку - торкнуло (к вопросу о головокружении)
            level.add_pp_effector("alcohol.ppe", 100, false)  

            level.add_pp_effector("duality_circle.ppe", 100, false)
            -- и спавним "пустую" аптечку, например (к вопросу о выдаче нового айтема взамен использованого)
            alife():create("medkit_empty", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) 
        end
    end
end

 

  • Согласен 2

Здесь могла быть ваша реклама.

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

 

function actor_binder:net_destroy()

    if(actor_stats.remove_from_ranking~=nil)then
     self.object:set_callback(callback.use_object, nil)
        actor_stats.remove_from_ranking(self.object:id())
    end
--    game_stats.shutdown ()

 


 

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

function actor_binder:reinit()
   self.object:set_callback(callback.use_object, self.use_object, self)
    object_binder.reinit(self)


Функцию actor_binder:use_object(obj) в конец скрипта @mole venomous
А всё равно ничерта не пашет

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

@Hind так я же тебе кидал нормальную статью со всем этим(

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

 

function actor_binder:net_destroy()

после

    self.object:set_callback(callback.take_item_from_box, nil)

вставляешь
    self.object:set_callback(callback.use_object, nil)

function actor_binder:reinit()

после
    self.object:set_callback(callback.use_object, self.use_object, self)


вставляешь
    self.object:set_callback(callback.use_object, self.use_object, self)

после

function actor_binder:on_item_drop (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_drop_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------

вставляешь:
function actor_binder:use_object(obj)
  use_item(obj)    
end

 

function use_item(obj) 
    local obj = obj:section()
    if obj then  
        if obj == "medkit" then 
            -- юзанули аптечку - торкнуло (к вопросу о головокружении)
            level.add_pp_effector("alcohol.ppe", 100, false)  

            level.add_pp_effector("duality_circle.ppe", 100, false)
            -- и спавним "пустую" аптечку, например (к вопросу о выдаче нового айтема взамен использованого)
            alife():create("medkit_empty", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) 
        end
    end
end

 

 

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

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

@Houdini_one
Абсолютно всё сделал так, как ты сказал - и вот вылазит эррорка теперь при юзании аптеки :)
До этого функция с вызовом use_item валялась где то в конце скрипта, и не вызывала проблем (как и каких-либо действий)

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ... Òåíü ×åðíîáûëÿ\gamedata\scripts\bind_stalker.script:193: attempt to call global 'use_item' (a nil value)

Изменено пользователем Hind
забыл дописать
Ссылка на комментарий
2 минуты назад, Hind сказал:

attempt to call global 'use_item' (a nil value)

Создай новый скрипт, куда запихаешь ф-ию 'use_item'. И в бинд_сталкер вызывай эту ф-ию из этого скрипта (думаю, тут объяснять не надо?)

Здесь могла быть ваша реклама.

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

@mole venomous
аналогично..
  dmb.use_item(obj)  - сама штука которая вызывает функцию из другого скрипта, и на которую ругается

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ... Òåíü ×åðíîáûëÿ\gamedata\scripts\bind_stalker.script:193: attempt to index global 'dmb' (a nil value)

Да.. Ещё такой прикол, если переместить
function actor_binder:use_object(obj)
  dmb.use_item(obj)    
end
в сааамый конец скрипта, то вылета не произойдет.
Но стоит положить его вниз после function actor_binder:on_item_drop (obj), то происходит вылет.
 

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

@Hind ,

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

Залей сюда на какой-нибудь файлообменник по возможности. Что, куда, зачем менял.  "Напосмотреть" :biggrin:. Быстрее получится.

 

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

@Hind 

Ошибку читай: не найден модуль "dmb". У тебя должен быть в папке скриптов файл dmb.script, а в нем ф-ция use_item(obj).

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

@AndreySol да я знаю как это всё делается, создал этот скрипт, туда функцию залил...

@Купер https://drive.google.com/file/d/10eJg9RuTqN8dWCL869OoHYc6k0OLyAyM/view?usp=sharing

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

@Hind очень крутая штука - script syntax checker.

Строка 15, dmb.script

function muzika

После muzika должны стоять ()

  • Спасибо 1
  • Согласен 1
  • Полезно 1

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

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

Работает)
Ещё подскажите, как сделать задержку в скриптах? Типа..
Вот юзанул я аптеку и через 5 секунд она появляется снова

Ссылка на комментарий
1 час назад, Hind сказал:

и через 5 секунд она появляется снова

Поищи, где-то тут были скриптовые модули таймеров. Ну или сам сделай таймер...

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

@Hind Если не требуется перенос через сейв/загрузку, короткую отсрочку можно сделать через level.add_call(проверка, действие).

Spoiler
local t = time_global()

local function delay()
	return time_global() > t + dt
end

level.add_call(delay, fx)

 

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

Шпаргалка

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

Если не требуется перенос через сейв/загрузку, короткую отсрочку можно сделать через level.add_call(проверка, действие).

Загрузка может случиться в самый неподходящий момент. Не самый правильный подход.

Сталкер - наше всё!

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

@AndrewMor "Если не требуется". Действия с короткой отсрочкой, которые после бесполезны после смерти ГГ (основная причина загрузки), вполне можно обрабатывать и так.

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

Шпаргалка

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

Всем привет. Есть такой скрипт, снимает координаты актёра -

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

---------------------------------------------------
-- script for posExtracter ver.1.2. Final
--by SmanxX1
--------------------------------------------------
class "pe" (CUIScriptWnd)

function pe:__init(owner,objid) super()
    self.owner = owner
    self:InitControls()
    self:InitCallBacks()
end

function pe:__finalize() end

function pe:InitControls()
    self:Init(300,200,550,450)
    local xml = CScriptXmlInit()
    xml:ParseFile("ui_pe.xml")
    xml:InitStatic("background", self)
    self:Register(xml:Init3tButton("caption", self),"caption")
    self:Register(xml:Init3tButton("caption2", self),"caption2")
    self:Register(xml:Init3tButton("btn_1", self),"btn_1")
    self:Register(xml:Init3tButton("btn_quit", self),"btn_quit")
    self:Register(xml:InitEditBox("edit_box",     self), "edit_box")
end

function pe:InitCallBacks()
    self:AddCallback("btn_1", ui_events.BUTTON_CLICKED, self.pe1, self)
    self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.on_quit, self)
end

function pe:OnKeyboard(dik, keyboard_action)
    CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
    if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
        if dik == DIK_keys.DIK_ESCAPE then
            self:on_quit()
        end
        if dik == DIK_keys.DIK_RETURN then
            self:pe1()
        end
    end
    return true
end

function pe:pe1()
    local edit_box=self:GetEditBox("edit_box")
    local str=edit_box:GetText()
    local qt=true
    if self:check_game() then
        if ((string.len(str)>30) or (string.len(str)==0)) then
            edit_box:SetText("Ошибка!!! Незадано назваеие либо символов больше 30!!!")
            qt=false
        else
            str=string.gsub(str, "%s", "_")
            str=string.gsub(str, "|", "/")
            local pos=db.actor:position()
            get_console():execute("pe_log>>"..str.."|"..level.name().."|_X="..pos.x.."_Y="..pos.y.."_Z="..pos.z.."_gvid="..db.actor:game_vertex_id().."_lvid="..db.actor:level_vertex_id())
            qt=true
        end
    else
        edit_box:SetText("Ошибка!!! Игра не загружена!")
        qt=false
    end
    if qt then self:on_quit() end
end

function pe:on_quit()
    local console = get_console()
    self:GetHolder():start_stop_menu (self.owner, true)
    self:GetHolder():start_stop_menu (self,true)
    self.owner:Show    (true)
    if self:check_game() then
        console:execute("main_menu off")
    end
end

function pe:check_game()
    if level.present() and (db.actor ~= nil) and db.actor:alive() then
        return true
    else
        return false
    end
end

 

 

Мне нужно ещё и direction, направление взгляда. Как сделать?

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

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

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

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

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

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

Войти

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

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

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

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