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

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

13 минут назад, I am Dead сказал:

Что значит для огср? Как бы давным давно сделана поддержка тч и зп погоды. Любой погодный мод подходит, хоть CGIM, хоть какой нибудь с аномали аддонов например.

Ты можешь не в конфигах их скручивать, интенсивность саншафтов в консоли есть, выкрутил в ноль да и все

В последней ревизии движка отказались тч погоды только зп. Да и я использую 181 ревизию движка еще со всеми рендерами. Выше этой ревизии у меня ломает твои анимации. Развертка текстуры на руках неправильно отображается. Модельера нет переделывать некому поэтому отказываюсь от новых ревизий. Хотя последнюю не пробовал может исправили. Да и переход на новую ревизии потребует много затрат

Ссылка на комментарий
22 минуты назад, Stalkersof сказал:

В последней ревизии движка отказались тч погоды только зп

Как бы нет, хочешь тч, хочешь зп юзай.

23 минуты назад, Stalkersof сказал:

Выше этой ревизии у меня ломает твои анимации

ДС сервак открыт для багрепорта если что, но я не думаю что анимации и развертка ломается из за движка.

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

Мне этот эффект ночью не нравится. У вас картинка синюшная именно от лучей.

ну вот тебе не нравится, а кому-то нравится, лунный свет - синий, и зачем скриптом принудительно отключать? те кому не нравиться сами отключат объёмные лучи в консоли, а кому нравится продолжать так играть, если ты конечно хочешь делат ьмод для людей, если для себя - то крути как хочешь и скрипты тоже:)

37 минут назад, Stalkersof сказал:

Да и я использую 181 ревизию движка еще со всеми рендерами

да тот движок который со всеми рендерами, только ТЧ-погоду поддерживает ,вот как у меня на скрине типа такой)

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

Ты можешь не в конфигах их скручивать, интенсивность саншафтов в консоли есть, выкрутил в ноль да и все

В общем разобрался. Пошел на вики движка. Надо было в секции погоды прописать параметр sun_shafts_intensity. Если его выкрутить в ноль то лучей не будет. Но я поставил 0.1 для легкого эффекта. Нормально получилось.

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

@Zander_driver  Сделал так:

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

local box_info_wnd

function init(obj)
    printf("_bp: init(): name='%s'", obj:name())
    local ini = obj:spawn_ini()
    if ini and ini:section_exist("animation") then
    abort("object '%s': animation section is deprecated, use logic + impulse combination", obj:name())
    return
end
    if (not ini) or (not ini:section_exist("logic") and not ini:section_exist("drop_box")) then
    if obj:clsid() ~= clsid.projector and obj:clsid() ~= clsid.inventory_box then
    return
end
end
    db.storage[obj:id()] = {}
    local new_binder = generic_physics_binder(obj)
    obj:bind_object(new_binder)
end

class "generic_physics_binder" (object_binder)
function generic_physics_binder:__init(obj) super(obj)
    self.initialized = false
    self.loaded = false
end 

function generic_physics_binder:reload(section)
    object_binder.reload(self, section)
end

function generic_physics_binder:reinit()
    object_binder.reinit(self)
    db.storage[self.object:id()] = {}
    self.st = db.storage[self.object:id()]
end

function generic_physics_binder:update(delta)
    object_binder.update(self, delta)

    if not self.initialized and db.actor then
    self.initialized = true
    xr_logic.initialize_obj(self.object, self.st, self.loaded, db.actor, modules.stype_item)

    local particle = utils.cfg_get_string(self.st.ini, self.st.section_logic, "particle", self.object, false, "", nil)
    if particle ~= nil then
    self.particle = particles_object(particle)
    self.particle:play_at_pos(self.object:position())
end
    local graph_point_marker = utils.cfg_get_string(self.st.ini, self.st.section_logic, "graph_point_marker", self.object, false, "", nil)
    if graph_point_marker ~= nil then
    self.disable_graph_point = patrol(graph_point_marker):game_vertex_id(0)
    game_graph():accessible(self.disable_graph_point, false)
    printf("GRAPH POINT DISABLED")
end
end
    if self.st.active_section ~= nil or (self.object:spawn_ini() ~= nil and self.object:spawn_ini():section_exist("drop_box") == true) or self.object:clsid() == clsid.inventory_box then
    xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "update", delta)

    self.object:set_callback(callback.hit, generic_physics_binder.hit_callback, self)
    self.object:set_callback(callback.death, generic_physics_binder.death_callback, self)
    self.object:set_callback(callback.use_object, generic_physics_binder.use_callback, self)

    elseif self.object:section() == "inventory_box" or self.object:section() == "active_backpack" or self.object:section() == "active_system" then
    self.object:set_callback(callback.use_object, generic_physics_binder.use_callback, self)
end
    local weight = 0
    for i=0,self.object:inv_box_count()-1 do
    weight = weight + self.object:object_from_inv_box(i):get_weight()
    if box_info_wnd then
    box_info_wnd:update_info(weight)
end
end
end

function generic_physics_binder:net_spawn(data)
    if not object_binder.net_spawn(self, data) then
    return false
end
    if self.object:clsid() == clsid.projector then
    db.add_sl(self.object)
end
    if self.object:spawn_ini() ~= nil and self.object:spawn_ini():section_exist("drop_box") == true then
    self.box_items = xr_box.ph_item_box(self.object)
end
    self.object:set_callback(callback.on_inv_box_item_take, self.on_take, self)
    self.object:set_callback(callback.on_inv_box_item_drop, self.on_drop, self)

    return true
end

function generic_physics_binder:net_destroy()
    local st = db.storage[self.object:id()]
    if st.active_scheme then
    xr_logic.issue_event(self.object, st[st.active_scheme], "net_destroy")
end
    if self.particle ~= nil then
    self.particle:stop()
end
    db.del_sl(self.object)
    db.storage[self.object:id()] = nil

    self.object:set_callback(callback.on_inv_box_item_take, nil)
    self.object:set_callback(callback.on_inv_box_item_drop, nil)

    object_binder.net_destroy(self)
end

function generic_physics_binder:on_take(item)
    self.cur_box_weight = get_box_weight(self.object)
    if box_info_wnd then
    box_info_wnd:update_info(self.cur_box_weight)
end
end

function generic_physics_binder:on_drop(item)
    self.cur_box_weight = get_box_weight(self.object)
    if box_info_wnd then
    box_info_wnd:update_info(self.cur_box_weight)
end
end

function generic_physics_binder:net_save_relevant()
    return true
end

function generic_physics_binder:save(packet)
    object_binder.save(self, packet)
    xr_logic.save_obj(self.object, packet)
end

function generic_physics_binder:load(reader)
    self.loaded = true
    object_binder.load(self, reader)
    xr_logic.load_obj(self.object, reader)
end

function generic_physics_binder:use_callback(obj, who)
    if obj:section() == "inventory_box" or obj:section() == "active_backpack" or obj:section() == "active_system" then
    dxr_carbody.use_inventory_box = obj
end
    if self.st.active_section then
    xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who)
end
end

function generic_physics_binder:hit_callback(obj, amount, local_direction, who, bone_index)
    printf("_bp: generic_physics_binder:hit_callback: obj='%s'", obj:name())
    if self.st.ph_on_hit then
    xr_logic.issue_event(self.object, self.st.ph_on_hit, "hit_callback", obj, amount, local_direction, who, bone_index)
end
    if self.st.active_section then
    xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "hit_callback", obj, amount, local_direction, who, bone_index)
end
end

function generic_physics_binder:death_callback(victim, who)
    printf("_bp: generic_physics_binder:death_callback: obj='%s'", victim and victim:name() or self.object:name())
    if self.st.active_section then
    xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "death_callback", victim, who)
end
    if self.particle ~= nil then
        self.particle:stop()
end
    if self.disable_graph_point ~= nil then
    game_graph():accessible(self.disable_graph_point, true)
    printf("GRAPH POINT ENABLED")
end
    if self.object:spawn_ini() ~= nil and self.object:spawn_ini():section_exist("drop_box") == true then
    self.box_items:spawn_items()
end
end

---------------------------------------------------------------------------------------------------
function get_box_weight(box)
    if box == nil then return end
    local weight = 0
    for i=0,box:inv_box_count()-1 do
    weight = weight + box:object_from_inv_box(i):get_weight()
end
    return weight
end

function show_box_info()
    box_info_wnd = box_info_wnd or box_info()
    if box_info_wnd ~= nil then
    box_info_wnd:show()
end
end

function hide_box_info()
    if box_info_wnd then
    get_hud():RemoveDialogToRender(box_info_wnd)
end
    box_info_wnd = nil
end

class "box_info" (CUIScriptWnd)

function box_info:__init() super()
    local xml = CScriptXmlInit()
    xml:ParseFile("carbody_new.xml")
    self.weight = xml:InitStatic("weight_static", self)
    get_hud():AddDialogToRender(self)
end
    
function box_info:show()
    box_info_wnd:update_info(self.cur_box_weight)
    self:Show(true)
end

function box_info:hide()
    self:Show(false)
end

function box_info:update_info(cur)
    if cur ~= nil then
    self.weight:SetText(string.format("%5.1f",cur))
    else
    self.weight:SetText(string.format("%5.1f",0))
end
end

function on_info(info_id)
    if info_id == "ui_car_body_hide" then
    hide_box_info()
end
    if info_id == "ui_car_body" then
    show_box_info()
end
end
 

Но теперь при получении тайника(появления итемов в ящике) цифры начинают бегать.

Ссылка на комментарий
10 минут назад, Colder сказал:

Но теперь

В прошлый раз, я советовал воспользоваться логами.

Но теперь мы видим, что ни единой новой строчки вывода в лог, так и не появилось.

Хорошо, у тебя свой путь, ок. Внимание вопрос - а зачем обращаться ко мне, если советы которые я даю, тобою все равно не выполняются?

  • Спасибо 1
  • Нравится 2
  • Согласен 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Подскажите как выбрать один предмет а не все при парсинге

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

    local sec = self.items[index + 1]
    local parts = ini_parts:r_string_ex("con_list", sec)
    parts = string.gsub(parts,"[,]"," ")

    for k, v in string.gmatch(parts, "[%p0-z]+") do
    sim:create(k, pos, lvid, gvid, pid)

 

 

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

 

Сделал так:

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

    local parts = ini_parts:r_string_ex("con_parts_list", sec)
    if parts then
    local parts_tbl = str_explode(parts,",")
    local t = parts_tbl[math.random(#parts_tbl)]

    sim:create(t, pos, lvid, gvid, pid)

 

А еще вопрос, если мне нужно пару итемов?

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

Прочитать случайный ключ в переменную, сделать выбор, сделать table.remove с этим ключом, повторить выбор.

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

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

Шпаргалка

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

Привет, нужна помощь, я в скриптах пока не особо разбираюсь, поэтому хотелось бы спросить у знающих.
Нашёл личный дневник для зп (тык)
Это типа дневник с записями и в нём есть такая проблема, что когда записей становится больше 9, то начиная от 10  и до 19 записи у них используется описание от первой записи, следовательно, у 20-29 описание от второй записи.
И я вот думаю, что проблема в скрипте, но в них я не очень разбираюсь вот сам скрипт:

Скрытый текст
local list_of_pages = {}
local list_of_note     = {}
local note_of_pages = {}
local pages_list     = {}
local diary_ini = ini_file("misc\\diary_records.ltx")

function give_diary_record(record_name)
    if not diary_ini:section_exist(record_name)
    or note_of_pages[record_name] ~= nil then
        return
    end
    local diary_text = diary_ini:r_string(record_name, "text")
    local diary_page = diary_ini:r_string(record_name, "page")
    if not list_of_pages[diary_page] then
        list_of_pages[diary_page] = {}
        table.insert(pages_list, diary_page)
    end
    note_of_pages[record_name] = {}
    note_of_pages[record_name].text = diary_text
    table.insert(list_of_pages[diary_page], record_name)
    table.insert(list_of_note, record_name)
end

function get_pages_list()
    local count = diary_ini:line_count("records") - 1
    local info, value = "", "", result
    for i = 0, count do
        result, info, value = diary_ini:r_line("records",i,"","")
        if has_alife_info(info) then
            give_diary_record(info)
        end
    end
end

class "list_item" (CUIListBoxItem)

function list_item:__init(height) super(height)
    self.text                    = self:GetTextItem()
    self:SetTextColor            (GetARGB(255, 92, 84, 69))
    self.text:SetFont            (GetFontLetterica25())
    self.text:SetWndSize        (vector2():set(325,height))
    self.text:SetEllipsis        (true)
end

class "diary_dialog" (CUIScriptWnd)

function diary_dialog:__init() super()
     self:InitControls    ()
     self:InitCallBacks    ()
     self:FillList        (pages_list, true)
end

function diary_dialog:__finalize()
end

function diary_dialog:FillList(tbl, is_pages)
    self.list:Clear()
    
    self.is_pages = is_pages
    self.tbl = tbl
    
    for i = 1, #tbl do
        self:AddItemToList(tbl, i)
    end
end

function diary_dialog:InitControls()
    local xml                = CScriptXmlInit()
    self:SetWndRect            (Frect():set(0,0,1024,768))
    local ctrl
    
    xml:ParseFile            ("ui_diary.xml")
    xml:InitFrame            ("background",self)

    self.text = xml:InitTextWnd ("paragraph", self)
    self.header = xml:InitTextWnd ("header", self)

    self.list = xml:InitListBox    ("list",self)

    self.list:ShowSelectedItem    (true)
    self:Register                (self.list, "list_window")

    local ctrl = xml:Init3tButton        ("back",self)
    self:Register                (ctrl, "btn_close")
    
    self.header:SetTextST    ("st_diary_header")
end

function diary_dialog:InitCallBacks()
    self:AddCallback("btn_close",        ui_events.BUTTON_CLICKED,             self.OnButton_close_clicked,    self)
    self:AddCallback("list_window",        ui_events.WINDOW_LBUTTON_DB_CLICK,      self.OnButton_create_clicked,    self)
end

function diary_dialog:OnButton_create_clicked()
    if self.list:GetSize()==0 then
        return
    end

    local item    = self.list:GetSelectedItem()
    
    if not item then
        return
    end
    local itmname        = item.text:GetText()

    local itemnum = tonumber(itmname:sub(1, itmname:find(".")))
    
    if self.is_pages then
        self:FillList(list_of_pages[pages_list[itemnum]], false)
        self.text:SetText("")
        self.header:SetTextST(pages_list[itemnum])
    else
        local tbl = note_of_pages[self.tbl[itemnum]]
        self.text:SetTextST(tbl.text)
        self.header:SetTextST(self.tbl[itemnum])
    end
end

function diary_dialog:OnButton_close_clicked()
    if not self.is_pages then
        self:FillList        (pages_list, true)
        self.text:SetText    ("")
        self.header:SetTextST    ("st_diary_header")
    else
        self:HideDialog()
    end
end

function diary_dialog:OnKeyboard(dik, keyboard_action)
    CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)

    local bind = dik_to_bind(dik)
    
    if bind == key_bindings.kQUIT then
        self:HideDialog()
    end

    return true
end

function diary_dialog:AddItemToList(item_name, number)
    local _itm                    = list_item(30)
    _itm.text:SetText            (string.format("%d. %s", number, game.translate_string(item_name)))
    self.list:AddExistingItem    (_itm)
end

function ShowNotepad ()
    get_pages_list ()
    diary_dialog():ShowDialog(true)
end

 

а вот скрины самой проблемы

https://disk.yandex.ru/a/qgq0mhJvjFU2uw

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

Точка при поиске/замене – спецзнак "один любой знак": поиск находит цифру после 1 или 2 и отсекает строку.

Запись для поиска точки просто как точки:

find("%.") -- обход спецзнака

find(".", 1, true) -- поиск всех знаков в режиме "простой текст" (1 = отсчет слева)

  • Спасибо 1

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

Шпаргалка

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

find(".", 1, true)

Спасибо большое! помогло

Сделал скрипт в ЗП чтоб при поднятии арта приходило сообщение "артефакт найден"(скрипт вызываю из биндера on_item_take)

    if db.actor:object("af_medusa") and not db.actor:has_info("medusa") then
	db.actor:give_info_portion("medusa")
	news_manager.send_tip(db.actor, "st_find_af", 0, "got_artefact", 3000)
    end

И вот вопрос: можно как нибудь сделать чтоб писало "Найден артефакт: (арт)" 

сейчас я пока что вижу одну возможность как это реализовать, просто прописать для каждого арта свою надпись в text\rus, но артов у меня 160... и хотелось бы упростить себе задачу. Поэтому прошу помощи может кто знает. Спасибо.

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

@Pavel_2000 в том же скрипте, посредством которого ты отправляешь сообщение, есть функция получения идентификатора наименования предмета через его секцию: get_inv_name(section).

Пример:

local obj = db.actor:object("af_medusa")
if obj and not db.actor:has_info("medusa") then
    db.actor:give_info_portion("medusa")
    local news_text = game.translate_string("st_find_af")..": "..game.translate_string(news_manager.get_inv_name(obj:section()))
    db.actor:give_game_news(game.translate_string("st_tip"), news_text, "ui_inGame2_D_gonets_pravosudiya", 0, 3000, 0)
end

 

  • Спасибо 1
Ссылка на комментарий
2 часа назад, Pavel_2000 сказал:

чтоб писало "Найден артефакт: (арт)" 

 

	if db.actor:object("af_medusa") and not db.actor:has_info("medusa") then
		db.actor:give_info_portion("medusa")
        local art_name = "Найден артефакт: %c[255,255,50,50]"..game.translate_string(system_ini():r_string("af_medusa", "inv_name")).."%c[default]"
        news_manager.send_tip(db.actor, art_name, 0, "got_artefact", 3000)
	end

 

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

@Kirgudu @ted.80 Спасибо, в конечном результате получилось так:

    if db.actor:object("af_medusa") and not db.actor:has_info("medusa") then
	    db.actor:give_info_portion("medusa")
        local art_name = game.translate_string("st_find_af")..": %c[255,255,50,50]"..game.translate_string(system_ini():r_string("af_medusa", "inv_name")).."%c[default]"
        news_manager.send_tip(db.actor, art_name, 0, "got_artefact", 3000)
    end

Результат(тык)

У меня новый вопрос. Не могу найти где в зп прописан спавн квестовых трупов типо Баржи, Майрона в пещере контролёра и тому подобных

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

@Colder Поиском по коду найти где она выводится, и закомментировать эту строку.

  • Спасибо 1
  • Нравится 2

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Как в труп заспавнить предмет? Пробывал так:

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

    local obj = alife():create("stalker_general_1", vector():set(37.906, -11.880, -246.436), 57809, 1482)
    if obj then
    obj:on_death()
    ogse.spawn_item_in_inv("mutant_krovosos_jaw", obj)

 

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

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

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

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

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

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

Войти

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

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

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