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

Скриптование


Svoboда

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

В 28.11.2017 в 09:47, DaSTi002 сказал:

Можно ли значки кровотечения, голода и т.д. из Теней Чернобыля заменить на Зов Припятские? 

Можно, редактируй текстуру, где эти значки все расположены.

В 28.11.2017 в 13:41, Dennis_Chikin сказал:

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

Полагаю, парень имел в виду заменить значки изначально, а не динамически прям во время игры менять одни на другие.

  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
В 18.07.2018 в 21:37, _Sk8_AsTeR_ сказал:

что-то испортил в скриптах игры и теперь спальный мешок работает не правильно.

Я чот нажала и всё исчезло ©

В 18.07.2018 в 21:37, _Sk8_AsTeR_ сказал:

Помогите пожалуйста

Ну вот как мы должны узнать, что у тебя там понаверчено, телепатическим путём?

В 18.07.2018 в 21:37, _Sk8_AsTeR_ сказал:

Какие файлы трогать?

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

И вообще закусывать бэкапы делать надо.

Изменено пользователем Капрал Хикс
  • Нравится 1
  • Согласен 3

Поделиться этим сообщением


Ссылка на сообщение

Кто-нибудь совмещал мод на умное выпадение частей монстров (отстреливаешь кабану ногу, выпадает копыта вместо 4) с модом "мясник" (отрезание частей монстров только при наличии ножа в инвентаре)? Хотелось бы где рабочий вариант подсмотреть, сам уже пытался смотать всё синей изолентой и писал тут, но увы...

Поделиться этим сообщением


Ссылка на сообщение

Хм, я вот о чём. В ОП-2.1 строка функция спавна конечности монстра по факту юзания его с тушки с ножом

local monster_part=ini_reader.iniReader():readString(monster:section(),"Spawn_Inventory_Item_Section","") - учитывает кол-во его запчастей на момент его смерти?

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Ну, ОП для примера. Отрезание частей монстров ножом есть в 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

 

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

Изменено пользователем Капрал Хикс

Поделиться этим сообщением


Ссылка на сообщение
3 часа назад, Dennis_Chikin сказал:

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

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

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

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

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

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

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

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

Поделиться этим сообщением


Ссылка на сообщение
3 часа назад, Comador сказал:

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

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

Поделиться этим сообщением


Ссылка на сообщение
3 часа назад, Dennis_Chikin сказал:

Не хочет.

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

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Проблема в том, что функция спавна запчасти из smart_monster_part срабатывает в момент смерти монстра, и думаю вызывать её в момент обыска трупа будет некорректно.

Поделиться этим сообщением


Ссылка на сообщение

Попробовал всё по рецепту... Надпись "Срезать трофей" появляется, но тушка обыскивается и с ножом и без ножа в руках и даже с ножом выкинутым (стоит такая возможность).

Запчасти вроде спавнятся. Копаю дальше.

Поделиться этим сообщением


Ссылка на сообщение
21 час назад, Norman Eisenherz сказал:

от мифического Сяка

С чего это "мифический" вдруг? Вполне реальный человек.

Поделиться этим сообщением


Ссылка на сообщение

Никто часом не пробовал создать детектор оружия для предметов находящихся в онлайне на локации? Навесить и удалить метки нетрудно, интересует функция определения объектов в онлайне. Чтобы, скажем, по классам пистолета, автомата, снайперки и так далее отображать соответствующую иконку.

Поделиться этим сообщением


Ссылка на сообщение
55 минут назад, dsh сказал:

Вот тебе похоже туда же нужно.

Эх, мудрёно там :)

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Неверно я выразился, некорректно... Нужно отображение оружия на текущей локации. Я так понимаю, удобней всего вешать проверку на соответствие предметов классу оружия в xr_motivator.script и вызывать функцию отображения меток отсюда (подсмотрено в DMX мод для меток НПС):

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

function motivator_binder:net_spawn(sobject):

  local obj = alife():object(self.object:id()).w_story_id
  if obj then myscript.mark_wpn() end

а удалять метки при уходе с локации здесь function motivator_binder:net_destroy()...

  local obj = alife():object(self.object:id()) and alife():object(self.object:id()).w_story_id
  if obj then myscript.unmark_wpn(sid,self.object:id()) end


В самом же файле myscript...

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

 

-Здесь задаём соответствие секции оружия определённому типу, чтобы не мучиться с классами оружия
local weapons_id = {
["base_id"]         = 0,

["wpn_pm"]         = 1,
["wpn_pb"]         = 1,
["wpn_fort"]         = 1,

["wpn_svd"]             = 2,
["wpn_gauss"]         = 2,

["wpn_val"]         = 3,
["wpn_ak74"]         = 3,
["wpn_lr300"]         = 3,

["wpn_toz34"]         = 4,
["wpn_spas12"]         = 4,

["wpn_pkm"]         = 5,

["wpn_knife"]         = 6,

["wpn_grenade_launcher"] = 7,
["wpn_rpg7"]         = 7,
["wpn_rg6"]         = 7,
["grenade_f1"]         = 7,

["wpn_flame"]         = 8
}

-здесь задаём тип метки в зависимости от типа оружия
local mark_types = {
            [0] = {mark = "NOT_USED"},
            [1] = {mark = "mark_1_pistol"},
            [2] = {mark = "mark_2_sniper"},
            [3] = {mark = "mark_3_assault"},
            [4] = {mark = "mark_4_shotgun"},
            [5] = {mark = "mark_5_heavy"},
            [6] = {mark = "mark_6_knife"},
            [7] = {mark = "mark_7_grenade"},
            [8] = {mark = "mark_8_flame"}
}


function get_weapon_type(obj)
--isweapon (проверка на то, что объект является оружием из _g.script)
    if(obj and isWeapon(obj)) then
            if weapons_id[id] then
                return weapons_id[id]
    else
            return weapons_id["base_id"]
    end
end

-собственно функция отображения меток
function mark_wpn(id)
    local obj = alife():object(self.id)
    local wp_type = get_weapon_type(obj)

        if wp_type = 1 then
                        level.map_add_object_spot(id, "mark_types[wp_type].mark", "Пистолет или ПП") -- Пистолеты и ПП

        elseif wp_type = 2 then
                        level.map_add_object_spot(id, "mark_types[wp_type].mark", "Винтовка") -- Снайперские винтовки

        elseif wp_type = 3 then
                        level.map_add_object_spot(id, "mark_types[wp_type].mark", "Автомат") -- Автоматы
               end
    end
end

function _mylog(message)
    get_console():execute("!!!ERROR!!!~~~"..message)
end
--ну и добавить функцию удаления меток...

 

P.S. Я знаю, что приведённый код имени д-ра Франкенштейна из кусков других кодов работать не будет, так как в силу недостатка знаний указал неверные аргументы и так далее, но надеюсь, более-менее внятно объяснил, чего хочу добиться в итоге с помощью более сведущих в программировании людей.

Изменено пользователем Капрал Хикс

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Откуда функцию вызывать, теперь ясно, спасибо! Саму функцию переделал, но нужна помощь, ибо застопорился под конец.

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

--Здесь задаём соответствие секции оружия определённому типу, чтобы не мучиться с классами оружия
local weapons_id = {
["base_id"]         = 0,

["wpn_pm"]         = 1,
["wpn_pb"]         = 1,
["wpn_fort"]         = 1,

["wpn_svd"]             = 2,
["wpn_gauss"]         = 2,

["wpn_val"]         = 3,
["wpn_ak74"]         = 3,
["wpn_lr300"]         = 3,

["wpn_toz34"]         = 4,
["wpn_spas12"]         = 4,

["wpn_pkm"]         = 5,

["wpn_knife"]         = 6,

["wpn_grenade_launcher"] = 7,
["wpn_rpg7"]         = 7,
["wpn_rg6"]         = 7,
["grenade_f1"]         = 7,

["wpn_flame"]         = 8
}

--расстояние, ближе которого отображаются метки оружия
local dist_to_wpn = 31

--здесь задаём тип метки в зависимости от типа оружия
local mark_types = {
            [0] = {mark = "NOT_USED"},
            [1] = {mark = "mark_1_pistol"},
            [2] = {mark = "mark_2_sniper"},
            [3] = {mark = "mark_3_assault"},
            [4] = {mark = "mark_4_shotgun"},
            [5] = {mark = "mark_5_heavy"},
            [6] = {mark = "mark_6_knife"},
            [7] = {mark = "mark_7_grenade"},
            [8] = {mark = "mark_8_flame"}
}

function get_weapon_type(weapon)
    if weapon then
        local id = news_main.get_weapon_name(weapon)
          if id == nil or id == "" then _mylog("id==nil") return end
            if weapons_id[id] then
                return weapons_id[id]
            else
            return weapons_id["base_id"]
            end
    else
            return weapons_id["base_id"]
    end
end

--собственно функция отображения меток
function mark()
    for a=1,65535,1 do --подобный перебор при переходе в онлайн это чересчур, но для теста сойдёт
    local obj = alife():object(a)
        if obj then
            local posobj = obj.position
            local actorpos = db.actor:position()
            local wp_type = get_weapon_type(weapon)
            if posobj:distance_to(actorpos) < dist_to_wpn then

--а вот дальше нужна помощь с корректным навешиванием меток и окончанием функции без ошибок
                    if wp_type = 1 then
                        level.map_add_object_spot(id, "mark_types[wp_type].mark", "Пистолет или ПП") -- Пистолеты и ПП
                   end
                        elseif wp_type = 2 then
                        level.map_add_object_spot(id, "mark_types[wp_type].mark", "Винтовка") -- Снайперские винтовки
                   end
                        elseif wp_type = 3 then
                        level.map_add_object_spot(id, "mark_types[wp_type].mark", "Автомат") -- Автоматы
               end
end

function _mylog(message)
    get_console():execute("!!!ERROR!!!~~~"..message)
end

 

Изменено пользователем Капрал Хикс

Поделиться этим сообщением


Ссылка на сообщение
В 21.06.2019 в 03:47, naxac сказал:

то можно написать такой небольшой биндер

Попробовал... Поймал вылет:

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

FATAL ERROR
[error]Expression    : error handler is invoked!
[error]Function      : invalid_parameter_handler
[error]File          : E:\stalker\sources\trunk\xrCore\xrDebugNew.cpp
[error]Line          : 804
[error]Description   : 
stack trace:

Справочник вылетов говорит о том, что... Данный вылет бывает когда у какого либо из объектов установлено некорректное значение (читал, сам не получал его) Или же если данный вылет происходит при вызове класса, то проблема в том что в методе __init() класса прописано super()

Оно так и есть в скрипте...

function mark_binder:__init(obj)
    super(obj)
end

Хм. Что теперь?

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Благодарствую! Скрипт работает и даже слишком хорошо. :rofl2: В общем, заспавненные мною на землю тестовые Абаканы исправно отображаются метками на карте. Однако при подборе в инвентарь метка вешается и на ГГ и, кроме того, одна метка остаётся висеть на пустом месте (но там, возможно, автомат провалился под землю, ещё проверю). Наверное, стоит прописать исключения для оружия в инвентаре ГГ и у неписей, однако надо ещё придумать, как сделать это.

Изменено пользователем Капрал Хикс

Поделиться этим сообщением


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

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

AMK-Team.ru

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