Jump to content

Recommended Posts

Dennis_Chikin    3,605

Данная строка просто читает название запчасти из конфига.

Вообще, конечно, изучение кода ОПы - занятие, опасное для психического здоровья.

 

  • Полезно 1
  • Haha 1

Share this post


Link to post
Share on other sites

Ну, ОП для примера. Отрезание частей монстров ножом есть в ButcherMod_ShoC, но...

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

-- Срезание трофеев с монстров / Идея: мод "Мясник" (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)
        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

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

Вкратце:

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

function main_check(obj, amount, local_direction, who, bone_index)
    local sc = obj:section()

    if tD[sc] then
        local section = tD[sc]
        for k,v in pairs (m_Tbl[section].bones) do
            if bone_index == v then
                if (m_Tbl[section].data == "boar_leg_count" or
                                    m_Tbl[section].data == "snork_leg_count" or
                                    m_Tbl[section].data == "burer_handy_count" or
                                    m_Tbl[section].data == "zombie_handy_count" or
                                    m_Tbl[section].data == "handy_kontroler_count" or
                                    m_Tbl[section].data == "himera_kogot_count") and m_Tbl[section].param > 0 then
                    m_Tbl[section].param = m_Tbl[section].param - 1
                else
                    m_Tbl[section].param = 0
                end
                break
            end
        end
    end
end

function spawn_parts(obj)
    local sc = obj:section()

    if tD[sc] then
        local section = tD[sc]
            if m_Tbl[section].param > 0 then
                if m_Tbl[section].param > 1 then
                    for i=1, m_Tbl[section].param do
                        amk.spawn_item_in_inv(m_Tbl[section].item,obj)
                    end
                else
                    amk.spawn_item_in_inv(m_Tbl[section].item,obj)
                end
            end
        m_Tbl[section].param = m_Tbl[section].default_param
    end
end

 

И вот как это сделать правильно, я не знаю.

Edited by Капрал Хикс
Добавлено  HellRatz,

Есть же мод "умное выпадение частей мутантов". Там все уже сделано, только адаптировать надо под себя.

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,605

Spawn_Inventory_Item_Amount",1

 

Собственно, есть же все необходимое.

То есть, надо просто количество брать не из конфига, а из где-то сохраненного при убиении. Хоть бы и в pstor монстра.

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

 

  • Sad 1

Share this post


Link to post
Share on other sites
3 часа назад, Dennis_Chikin сказал:

То есть, надо просто количество брать не из конфига, а из где-то сохраненного при убиении.

Именно про это я и спрашивал - КАК.

3 часа назад, Dennis_Chikin сказал:

спавн запчастей при смерти монстра, но их возвращение обратно в тушу при взятии без ножа.

Извини, я по-прежнему не догоняю. Я ни в коей мере не прошу сделать за меня готовый скрипт, но - извини, я не понимаю тебя.

3 часа назад, Dennis_Chikin сказал:

Хоть бы и в pstor монстра.

Не использую, не умею.

Ладно, дабы не устраивать чат, посты под снос.

Share this post


Link to post
Share on other sites

 HellRatz, дружище. Умное выпадение частей мутантов я под себя уже подогнал, но там нет фишки в виде срезания этих самых частей с помощью ножа, что я поверх умного выпадения и пытаюсь прикрутить. Я ж вроде понятно описал, в чём мне знаний не хватает :).

Share this post


Link to post
Share on other sites
Comador    195

@Капрал Хикс, в свое время был аддон для НС от Monnoroch, так вот в этом аддоне было срезание частей монстров ножом.

  • Полезно 1

Неважно – сколько у тебя друзей. Важно - сколько из них помогут тебе в трудную минуту и сколько вспомнят о тебе когда им хорошо.

"Худ" и "Умное выпадание частей монстров" для Народной солянки

Share this post


Link to post
Share on other sites
3 часа назад, Comador сказал:

аддон для НС от Monnoroch

Спасибо. Нашёл, глянул реализацию - насколько я понял, там есть умное выпадение, но фишка в том, что запчасти спавнятся в тушку мутанта в момент его смерти только при наличии в инвентаре ГГ ножа. Обыск же тушки производится обычным способом - это не то, что мне нужно.

Share this post


Link to post
Share on other sites
naxac    1,510

@Капрал Хикс, а что хранится в таблице tD в "умном выпадении запчастей"? По идее, нужно сохранять где-то по id монстра количество оставшихся рогов и копыт (у тебя, я так понял, это m_Tbl[section].param), а потом при "отрезании" тут:

if self.item then

        self.item_count = ...

брать значение не из конфига, а по self.object:id() из этого "где-то", вот и всё.


Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Share this post


Link to post
Share on other sites

Всем доброго времени суток.

 

Сделал первый в жизни скриптик к "Сталкеру ТЧ" - естественно, получил вылет :). Подскажите, что не так сделал, пожалуйста.


 

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

 

Задача была повысить сопротивляемость урону всех НПС из сталкеров-одиночек (ну, просто надоело их трупы находить повсеместно). Сделать через конфиги не смог - разработчики там запутали все в какую-то безумную паутину перекрестных ссылок и #include-сов. Либо вообще не работают изменения, либо работают на всех НПС-людей, всех фракций сразу.

 

Сделал маленькую функцию:

 

function superresistance()
if npc:character_community(stalker) then
npc.health_hit_part = 0.1
end

 

Параметр health_hit_part взят из конфигов сталкеров, это "процент хита, уходящий на отнимание здоровья".

Прописал в файлик test.script 

 

В bind_stalker.script вставил ссылочку test.superresistance(), ну вот так:

 

...

    -- апдейт схемы детектора
    self.actor_detector:update()

    -- сверхсопротивляемость НПС
    test.superresistance()

    -- апдейт звуковой схемы актера
    xr_sound.update_actor()

...

 

 

Что не так сделал? Заранее - спасибо.

Добавлено  W.A.S.P.,

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

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,605

@naxac, я ему уже предлагал: db.storage[mob:id()].pstor.mparts = n

Не хочет.

 

@F.Constantine, естественно, вылет.

if npc:character_community(stalker) - во-первых, здесь не существует никаких "npc", во-вторых - у неписей нет свойства health_hit_part

 

Это задается именно через конфиг. Разбирайтесь.

Ну и традиционно, горы трупов неписей в модах - результат работы некоей "оффлайн боевки", которая amk_offline_alife.script, вообще не имеет отношения к параметрам неписей, ибо они там просто убиваются случайным образом.

Edited by Dennis_Chikin

Share this post


Link to post
Share on other sites

@Dennis_Chikin, Спасибо за "совет", конечно :(. Я уже неделю разбираюсь с конфигами, весь опус моих разбирательств подробненько 

в теме "[SoC] Ковыряемся в файлах", на 992 странице

если интересно - хотя вряд ли интересно.

А можно хотя бы подсказать, как правильно прописать проверку НПС на принадлежность к фракции :)?

 

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,605

function myfunction( npc )
if npc:character_community() ==  "stalker" then

 

Как-то так, наверное.

 

И при вызове его надо туда передать. В bind_stalker, разумеется, никаких npc тоже нет, и откуда бы они там взялись - я не знаю.

Edited by Dennis_Chikin

Share this post


Link to post
Share on other sites

@Dennis_Chikin, Спасибо, но не помогло.

Я, собственно попытался сделать все по подобию довольно известного метода (он есть где-то здесь на форуме) "как сделать НПС бессмертным" - отдельно взятого НПС по его CID:

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

        Как сделать игрового НПС бессмертным

Пример:

 

function immortal()
local npc = level_object_by_sid(006) --волк
local npc2 = level_object_by_sid(092) --проводник
local npc3 = level_object_by_sid(032)-- кузнецов
local npc4= level_object_by_sid(100) --серый 
npc.health = 1
npc2.health = 1
npc3.health = 1
npc4.health = 1
end

 

Вызов функции прописываем в файле bind_stalker.script :

имя_файла.immortal() -- вызов нашей функции бессмертия
имя файла - это имя файла куда мы положим функцию. 
Например, если в файл test.script - пишем test.immortal() и т.п. 

 

Я эту функцию себе в игре прописал, обессмертил с десяток важных персон, все прекрасно функционирует.

 

Теперь, пользуясь Вашей подсказкой, сделал следующее:

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

Создал маленькую функцию:

 

function superresistance( npc )
if npc:character_community() == "stalker" then
npc.health = 1
end

 

Прописал ее в файлик test.script. А в bind_stalker.script вставил вызов этой функции:

 

...

    -- апдейт схемы детектора
    self.actor_detector:update()

    -- сверхсопротивляемость НПС
    test.superresistance( npc )

    -- апдейт звуковой схемы актера
    xr_sound.update_actor()

...

 

 

 

В общем, снова вылеты. Кстати, в вызове нужно прописывать:

test.superresistance( npc )

или

test.superresistance()

?

 

Edited by F.Constantine

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,605

В вызове должен быть передан непись, с которым что-то делаете.

Кстати, в том примере если кого-то из перечисленных не будет в игре - тоже будет вылет.

Share this post


Link to post
Share on other sites
2 минуты назад, Dennis_Chikin сказал:

Кстати, в том примере если кого-то из перечисленных не будет в игре - тоже будет вылет.

 

Да, у меня эта функция с проверкой на живой-неживой для каждого персонажа. Я просто упрощенный вариант написал.

 

4 минуты назад, Dennis_Chikin сказал:

В вызове должен быть передан непись, с которым что-то делаете.

 

Ну, т.е. в данном случает должно быть именно test.superresistance( npc )

Share this post


Link to post
Share on other sites
3 часа назад, Dennis_Chikin сказал:

Не хочет.

Денис, ну, во-первых, не “не хочу”, а “не умею”, о чём я чётко и честно написал выше.
Я понимаю, что тебе решение этой задачи видится простым, ясным и сразу, но извини, не все обладают такими познаниями в написании скриптового кода.
Мои скромные скиллы пока не дотягивают до решения таких задач, потому и обратился за помощью. А до:

3 часа назад, Dennis_Chikin сказал:

db.storage[mob:id()].pstor.mparts = n

Я б в жизни не додумался
В каких модах и скриптовых сборках можно наглядно посмотреть практическое использование метода записи в pstor монстра и чтения из него?
 

Share this post


Link to post
Share on other sites
abramcumner    886

@Капрал Хикс, тебе по идее вообще с пстором не надо заморачиваться. Если я правильно понял скрипт мясника, то когда ты юзаешь монстра и у тебя есть ножик, то спавнятся запчасти от монстра.

По идее тебе надо следующий код из мясника:

        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

заменить на вызов функции

скрипт_реальных_частей.spawn_parts(self.object)

из скрипта реальных частей монстра. Эта функция заспавнит, сколько ей надо запчастей.

Edited by abramcumner
  • Полезно 1

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,605

"В каких модах и скриптовых сборках можно наглядно посмотреть" - понятия не имею.

Разницы с неписями и даже актором - вообще ни какой.

 

Точнее, единственная с конкретно актором в том, что актор в офлайн не ходит, и, соответственно, записанное сохраняется всегда. Впрочем, трупы в офлайн тоже, как правило, не ходят.

 

@abramcumner, в "реальных запчастях" типа только количество увеличивается, без учета способа забоя? и всегда одинаковое? Ну и все равно надо хранить, что запчасти уже спавнили.

 

upd: посмотрел исходный пост еще раз: там в приведенном куске вообще странное делается. Так что хранить надо "минус запчасти", и при смерти вычислять разницу. При использовании тушки - создавать, и обнулять сохраненное.

Edited by Dennis_Chikin

Share this post


Link to post
Share on other sites
abramcumner    886
1 минуту назад, Dennis_Chikin сказал:

 

@abramcumner, в "реальных запчастях" типа только количество увеличивается, без учета способа забоя?

По идее нет, отслеживаются хиты по костям моба и если хит в неудачную кость, количество частей уменьшается. Результаты этого подсчета наверное хранятся в таблицах m_tD  и m_Tbl.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

AMK-Team.ru

×
×
  • Create New...