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

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


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

@Akros В ОП стоит античит, любое ковыряние файлов, и твои сейвы будут меченными красным ( возможно ошибаюсь). 

Распаковать файлы sounds.xdb

В папке sound/actors найти не нужные реплики, заменить их, и закинуть в папку с ОП. Я в ОП не гоняю, не факт что все что я написал сработает. 

Загляни в тему ковыряние ОП 2.2 

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

@h0N0r , ни разу не специалист, но там же вроде булев (true/false) ключ добавлен:

function generic_object_binder:__init(obj) super(obj)
...    self.used = false
end
function generic_object_binder:save(packet)
...    packet:w_bool(self.used)
end
function generic_object_binder:load(reader)
 ...   self.used = reader:r_bool()
end

А в самом теле функции уже проверка на предмет "первого раза":

generic_object_binder:use_callback(obj, who):

...    if self.object:alive() or self.used then return end

+ выше там же ещё одна "отсечка".

  • Полезно 1
Ссылка на комментарий

Народ, я снова по теме срезания запчастей с мутантов.

Что здесь нужно изменить, чтобы открывался  инвентарь, только когда нож в руках

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

-- Срезание трофеев с монстров / Идея: мод "Мясник" (CoP) от Singapur22
function generic_object_binder:use_callback(obj, who)
    if self.use_flag == nil and self.object:section()~="m_trader" then
        self.object:set_nonscript_usable(false)  --если (true) инвентарь работает
        self.use_flag = true
    end
    
    if self.object:alive() or self.used then return end
    
    local knife = who:item_in_slot(0)
    if who:id() ~= db.actor:id() or (knife~=nil and who:active_slot() == 0) then
        self.used = true
    else
        if knife then
            news_manager.send_tip(db.actor,"Чтобы cрезать трофей, нужно достать нож.")
        end
        return
    end
    
    self.item = read_if_exist("s",nil,self.object:section(),"Spawn_Inventory_Item_Section",nil)
    if self.item then
        self.item_count = read_if_exist("f",nil,self.object:section(),"Spawn_Inventory_Item_Amount",1)
    else
        return
    end
    
    for i=1, self.item_count do
        alife():create(self.item, who:position(), who:level_vertex_id(), who:game_vertex_id(), who:id())
    end
    
    self.object:set_tip_text("")
    
    local h = hit()
    h.draftsman = self.object
    h.type = hit.fire_wound
    h.direction = vector():set(0,1,0)
    h:bone(read_if_exist("s",nil,self.object:section(),"bone_impuls_abscission","bip01_spine"))
    h.power = 1
    h.impulse = (read_if_exist("f",nil,self.object:section(),"impuls_abscission",150))
    self.object:hit(h)
    
    local sound_use = sound_object("material\\dead-body\\collide\\hithard0"..tostring(math.random(1, 6)).."hl")
    sound_use:play_at_pos(self.object, self.object:position(), sound_object.s3d)
end

Звуки не воспроизводятся, не нахожу нужного калбэка

 

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

Забавно, а ведь оно действительно в таком виде не желает работать. По крайней мере, на "классике". Интересно, почему?

 

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

Доброго времени суток Всем! Какой файл отвечает за вывод номера патча в главном меню (навеяно одним вопросом на Ответах mail.ru). Я прошерстил папки scripts, ui и text, но не нашел ничего. 

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

@Ali_Babai_45 , для оригинала:

ui_main_menu.script->

function main_menu:InitControls()
...
    local _ver = xml:InitStatic        ("static_version",self)
    local mm                        = _G.main_menu.get_main_menu()
    _ver:SetText                    ("ver. " .. mm:GetGSVer())   
end

Тут более подробно.

Изменено пользователем Купер
  • Спасибо 1
  • Согласен 1
Ссылка на комментарий

@Ali_Babai_45 , а пламенный привет борцунам за всё хорошее против всего плохого. Они весь домен gameru.net в РФ грохнули. Тут есть копипаста.

 

Боюсь ошибиться, вот это вот GetGSVer() движком вычитывается по-моему. Сам формат текста здесь:

ui_mm_main.xml (gamedata\config\ui) ->

<static_version>...</static_version>

Т.е., что-то наподобие такого можно соорудить:

ver:TextControl():SetText  ("ver. "..mm:GetGSVer().." + здесь название и версия"). То, что в "..." можно менять/мучить, а mm:GetGSVer() вряд ли изменить получится.

Изменено пользователем Купер
  • Спасибо 1
  • Нравится 1
  • Согласен 1
Ссылка на комментарий
10 часов назад, Купер сказал:

 Оно действительно в таком виде не желает работать. По крайней мере, на "классике". Интересно, почему?

 

Разберусь с этим когда получу вывих мозга. Но это не точно. :dash3: 

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

@андрей дронав ,

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

да обойти несложно, конечно, хотелось бы понять почему в такой конфигурации не работает?

 

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

@андрей дронав ,

  off topic (Скрыть)

хотелось бы понять почему в такой конфигурации не работает?

 

Дружище, я никогда не учил язык программирования, для меня этот код "Абракадабра". Я умею пользоваться "WinMerge", и на этом мой навык мододела кончился. Буду пробовать ковырять ссылаясь на прошлые темы, а вдруг узнаю, ПАЧИМУ НЕ РАБОТАЕТ:laugh:

 

Может быть так?

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

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

  function actor_binder:use_object(obj)
        sound_obj_left = sound_object([[material\\dead-body\\collide\\hithard0]])
        sound_obj_left:play_at_pos(db.actor, vector():set(1, 0, 1), 0, sound_object.s2d)
    end

 

Изменено пользователем андрей дронав
  • Смешно 1
Ссылка на комментарий
6 часов назад, Купер сказал:

ui_main_menu.script->

function main_menu:InitControls() ...     local _ver = xml:InitStatic        ("static_version",self)     local mm                        = _G.main_menu.get_main_menu()     _ver:SetText                    ("ver. " .. mm:GetGSVer())    end

function main_menu:InitControls()
...
    local _ver = xml:InitStatic        ("static_version",self)
    local mm                        = _G.main_menu.get_main_menu()
    _ver:SetText                    ("ver. " .. mm:GetGSVer())   
end

 

Еще можно так:      _ver:SetText ("Ж.О.П.А.")

Изменено пользователем macron
  • Согласен 1
  • Смешно 3
Ссылка на комментарий
30.06.2022 в 17:56, Zander_driver сказал:

Вот просто интересно, каких ответов люди хотят на подобные вопросы... Ты же понимаешь что ответить тебе по существу, невозможно.

.

Пытался адаптировать этот скрипт

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

-- Отрезание запчастей монстров ножом и озвучка. Для отрезания достаточно, чтобы нож был в рюкзаке.
local monster = nil
local snd = nil
function get_monster()
    return monster
end

-- Ножи и прочее ХО, которым можно отрезать запчасть
local knives = {
    ["wpn_knife"]=true
}

function right_knife(knife)
    return (knives[knife:section()] and knife:condition()>0.1) or false
end

function on_part_take(obj)
    if not monster then
        return 
    end
    local item_part=ini_reader.iniReader():readBool(obj:section(),"monster_part",false)
    local monster_part=ini_reader.iniReader():readString(monster:section(),"Spawn_Inventory_Item_Section","")
    if not item_part or monster_part~=obj:section() then
        return
    end
    
    if actor_has_knife() then
        level.start_stop_menu(level.main_input_receiver(), true)
        if snd and snd:playing() then
            snd:stop()
        end
        snd = voice("zwuk\\inv_mutant_loot_"..math.random(1,16))
        snd:play_at_pos(db.actor, vector(), 0, sound_object.s2d)
        archievements.acv_count_event("acv_gvdr", 500, "acv_gvdr") 
        local knife=db.actor:item_in_slot(0)
        local cond_dec=ini_reader.iniReader():readString(knife:section(),"condition_shot_dec",0)
        if cond_dec~=0 then
            knife:set_condition(knife:condition()-cond_dec)
        end
        return
    end
    sms("on_part_take_0", nil, "nano", 5000)
    db.actor:transfer_item(obj, monster)
end

function actor_has_knife()
    local item_in_slot=db.actor:item_in_slot(0)
    if item_in_slot and item_in_slot:condition()>0.1 then
        return knives[item_in_slot:section()] or false
    end
    return false
end

function on_monster_use(victim, who)
    monster = victim
end

function on_monster_stop_use()
    monster = nil
end

function move_on()
    snp.move_on()
end
 

 

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

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

(Платформа ОП, rx_kill_wounded.script). 

Какой из? Их же уже столько, а в каждом по своему! :biggrin: 

По идее, достаточно в rx_ai.script просто откомментировать загрузку и включение ненужной схемы:

function load_schemes()
function enable_schemes(ini,npc)

В оригинале модулей AI, кстати, достаточно просто удалить/переместить нужный/ненужный файл с соответствующим модулем.

 

 

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

@Купер не все так просто может оказаться. Например,если отключить движковую схему добивания раненных, то ничего хорошего не выйдет. В движке эта схема сильно связана с боевкой. Т.е. раненный остаётся в списке врагов и пока есть в памяти хоть один не раненный, то бой идёт с ним(и). Если в памяти остались только раненные враги, то активизируется схема добивания раненных. А если она отключена, будет упс, т.к. движок на такое не рассчитан и не знает, что делать. Враг как бы есть, а что делать - не понятно. Т.ч. насчёт "по идее" отключить, все может оказаться не так просто.

  • Нравится 1
  • Согласен 1
  • Полезно 2
Ссылка на комментарий
1 час назад, dsh сказал:

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

В принципе, добивать раненых не есть хорошо... Было бы хорошо, если бы нпс "добивали" раненых аптечкой, т.е. вербовали в свою группировку, как это делает ГГ

Опционально, для драматизма ситуации: лечить только бойцов с легкими ранениями, тяжелых - в расход.

Отношения между людьми- главная ценность в человеческом обществе.
Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

А где-то можно почитать предметно относительно недоработок оригинальной движковой GSC схемы добивания подранков? В смысле: " подводные камни", что сделано через пень колоду, etc.

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

@Купер в исходниках движка? Мои данные основаны именно на этом. Это узнано в процессе переделки, что бы добиванием занимался тот, кто ближе, а не шли всей толпой.

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

  • Полезно 2
Ссылка на комментарий
5 часов назад, EGER.OVERKILL WF сказал:

У меня там следующая билеберда: (брал из этого же файла, с другого рестриктора) 

  Настройки шейпа (Скрыть)

; cse_shape properties
shapes = 1
shape_0:type = sphere
shape_0:offset = 0,0,0
shape_0:radius = 4.5480751991272

@EGER.OVERKILL WF, давай-ка полную выкладку, как оно сейчас выглядит?

; cse_shape properties
shapes = shape0 <- ??? - кол-во шейпов
shape0:type = sphere - тип (сфера/параллелепипед)
shape0:offset = 0,0,0 - смещение 
shape0:radius = 5 - радиус (для типа "сфера")

; cse_alife_space_restrictor properties
restrictor_type = 0

В логике я бы лично подстраховался (хотя, в принципе, и лишнее, наверное):

[logic]
active = sr_idle

[sr_idle]
on_actor_inside = {-kura} nil %+kura%

{...} - условия для выполнения

%...% - действия

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

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

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

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

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

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

Войти

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

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

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