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

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


Svoboда

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

Вобщем, напоролся на непонятку при решении одной, кхм, задачи.

 

Задача была такая: Если гг передает определенный итем в инвентарь трупа или ящика, то - уже в инвентаре трупа\ящика удалить этот предмет и заспавнить другой.

Как я себе представляю метод решения: в дроп-колбэке отслеживаем скидывание предмета (а он срабатывает и на собственно дроп, и на передачу трупу\ящику, и на передачу в диалоге), затем проверяем наличие системного инфопоршня ui_car_body, сохраняем объект в переменную, и из метода actor:update(delta) смотрим парент этого объекта, если получаем не 0 и не -1 - значит спавним в инвентарь (нпс? а у нас труп\ящик...) по полученному ид нового владельца, а старый объект удаляем по его опять же ид.

Собственно как я это делал:

В actor_binder:on_item_drop (obj)
twoteam.drop_medics(obj)

* * *
function drop_medics(obj)
--- запускает систему замены предмета, если произошла передача ящику или трупу
if obj then
local section = obj:section()
if section == "medkit" then
    if db.actor:has_info("ui_car_body") then --- передача ящику/трупу
        twoteam.start_parent_respawn(obj, "wpn_pm")
    end
end
end
end

local respawn_parent_need = false --- ключ, надо или нет заменять предмет
local respawn_parent_object --- переданный объект, который потом удаляем
local respawn_parent_section = "" --- секция нового предмета --- эти объявлены просто в файле, вне всяких функций

function get_parent()
--- проверяет парент сохраненного объекта
if respawn_parent_object then
return respawn_parent_object:parent()
end
end

function start_parent_respawn(item, section)
--- сохраняет данные переданного объекта, и секцию того что нужно заспавнить вместо него
if item and section then
respawn_parent_need = true
respawn_parent_object = item
respawn_parent_section = section
return true
else return false
end
end

function wait_respawn() --- update замены в чужих инвентарях
--- вызывается из update актора, проверяет парент переданного объекта, если не 0 и не -1 запускает замену.
--- после замены обнуляет сохраненные данные, предотвращая повторные срабатывания
if respawn_parent_need and respawn_parent_object then
    local parent = twoteam.get_parent()
    if parent == 0 or parent == -1 then return nil 
    else
        twoteam.reitem_parent(respawn_parent_object, respawn_parent_section, parent)
        respawn_parent_need = false
        respawn_parent_object = nil
        respawn_parent_section = ""
    end
end
end

function reitem_parent(item, section, parentid)
--- заменяет предмет item (game_object*) на section. (string). замена происходит в инвентаре нпс/трупа/ящика с id = parentid. точнее, замена должна быть поидее...
    local sim = alife()
    if not (sim and item and section and parentid) then return end --- need msg to log
    local seid = item:id()
    if seid then
        local seobj = sim:object(seid)
        if seobj then
        sim:release(seobj, true) --- удаляем старый объект
        spawn.inv(section, parentid) --- спавним новый
        end
    end
end

function inv(item,npc_id) --- spawn.inv
    if npc_id == nil then
        npc_id = db.actor:id()
    end
    local obj = alife():create(item,vector():set(0,0,0),1,1,npc_id)
    return obj
end

 

Ну вот, комментариями снабдил для упрощения разбирательств :)

Что происходит в итоге: Когда передаю аптечку в инвентарь ящика, она оттуда просто исчезает, ПМ не спавнится. А когда передаю трупу, почему то виснет биндер актора. (определил по исчезновению матраса после даблклика).

Что я делаю не так? и можно ли через спавн по нпс_ид спавнить в инвентарь трупа/ящика, или это только для живых?

 

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

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

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

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


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

Вобщем, ситуация такая.

У физических объектов (имеются в виду разбиваемые ящики и т.п. объекты) хит-колбэк биндится не в реините, а в апдейте, по довольно занятным условиям:

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) then
        xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "update", delta)
--    if not self.callbackset then
          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)
--      self.callbackset=true
--    end
    -- для бтра hit_callback не вызывается. заткнём эту дырку.
    if self.health and (not self.nofixonhit) then
      local health=self.object:get_car() and self.object:get_car():GetfHealth()
      if health then
        if self.health-health>0.00001 then
          -- amk.mylog("health decrease for "..self.object:name())
          self.health=health
          self:hit_callback(self.object, self.health-health, vector():set(1,0,0), db.actor, 0)
          self.nofixonhit=nil
        end
      end
    end
  else
--    self.callbackset=false
    end
end

 

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

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

 

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

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

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

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

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


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

Прошу прощения :) увлекся. Просто, я обычно именно на таком языке и изъясняюсь - привык.

А по самой ситуации - мне просто нужно отследить хит всех тех предметов, которые можно сломать с помощью какого либо оружия. И ловить их непосредственно в игровом процессе, как мне представляется, неудобно. О том чтобы решать "нужен ли этому объекту колбэк" уже в момент когда в него стреляют - я и вовсе молчу, т.к. не представляю как это сделать.

 

death мне не подходит, т.к. какой-нибудь ящик может и несколько выстрелов выдержать, и надо обрабатывать каждый.

А поступить как с прожектором... блин, тоже не очень удобно. прожектор это один clsid.projector, а те объекты что нужны мне - это и деревянные ящики, и железные - те что поменьше, и (если я правильно понимаю) доски в заколоченных окнах и дверях некоторых домов. Я почему то думаю что это clsid."разные объекты"

Я даже не знаю как их по clsid узнать, как они называются?

А логика drop_box... разве не подразумевает что из сломанного объекта должно что то выпасть? В случае с ломающейся доской будет нелогично.

Я честно говоря эту сторону мало изучал.

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

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

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

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


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

Можно конечно и не увлекаться. Но, если уж основная часть урона, наносимого оружием, высчитывается скриптом а не движком - а у меня именно так - то приходится :)

А то получается, ящик в котором что-то есть, разваливается с 2 пуль ПМ, а ящик в котором ничего нет - не разломать и за 10, При том что внешне они выглядят абсолютно одинаково и игрок может изначально и не знать, в каком из них что-то есть.

Спасибо за ответы :) буду размышлять над разными вариантами.

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

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

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

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


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

Теперь еще один вопрос, уже не от меня, а.. от нашего квестовика.

У менє проблема. Facepalm.gif . создал гулаг..но не могу его проверить тк игра зависает после нескольких минут игры dry.gif (максимум 1,5)..

Зависает с таким логом:

FATAL ERROR

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...r. - shadow of chernobyl\gamedata\scripts\amk.script:1795: attempt to index local 'respawner' (a function value)


stack trace:

 

Не могу раздуплить.. этот скрипт я даже не трогал. unsure.gif . но когда попытался изменить данные о респауне сталкеров то ничего не изменилось..

 

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

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

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

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

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

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


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

ZeeK

Функция такая может быть, но выглядеть будет сложно.

1. Проверка-обьект ли пси пес - я так понял, имеется в виду является ли объект определенной разновидностью моба.

Если у него нет разных профилей, то просто по его секции можно опознать. Если профили разные, то наподобие этого:

  if string.find(self.object:section(),"chimera") then

2. Если да то есть у него в радиусе собаки - перебор всех объектов на уровне, с аналогичной проверкой - является ли объект собакой (а у них профили разные). Если является, узнаем дистанцию

local chimera_dist = nte:position():distance_to(self.object:bone_position("bip01_spine"))

тут вместо nte надо будет подставлять объект пси пса.

Дальше начинается более муторная часть... вышеуказанными способами получится отобрать набор объектов, являющихся собаками и расположенных на нужной дистанции от пси-собаки. запихиваем их в список (лучше записывать их id).

список лучше объявить вне функций, чтобы к нему могли обращаться другие функции, а не только та что его создала.

3. Если есть + им к урону и скорости? насчет скорости не могу ничего придумать, а насчет урона можно.

В хит-коллбэк всех объектов, которых могут кусать собаки (актор, нпс, мобы) - вводим проверку, кто нанес хит - не обнаружится ли его ид в списке "усиленных собак". Если да, то наносим пострадавшему от собаки дополнительный хит скриптом.

                     local ch_h = hit() 
                        ch_h.impulse = 50 
                        ch_h.draftsman = self.object
                        ch_h.direction = vector():set(1,0,0) 
                        --ch_h:bone("bip01_spine") -- хитовать будет и без указания костей
                        ch_h.power = 0.85
                        ch_h.type = hit.wound
                        nte:hit(ch_h)

При желании величину хита можно высчитывать в зависимости от "родной" атаки собаки, которую можно прочитать в ее конфиге по ее же секции ltx.

Вот как то таким образом.

 

Вопросик у меня созрел. пустяковый, но терзающий.

методом alife():create("все что полагается") можно ли спавнить объекты за пределами онлайн-радиуса?

Изменено пользователем Zander_driver

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

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

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

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


Ссылка на сообщение
Zander_driver, ну фантом ли объект определяется гораздо проще:

local obj_clsid == self.object:clsid()
if obj_clsid == clsid.psy_dog_phantom_s then

 

Являются ли окружающие неписи собаками также очень просто проверяются по clsid.

А как этим же методом обнаружить аномалии?

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

Суть вопроса заключается в том - что писать после "clsid." чтобы найти аномалию.

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

Я почему то не могу найти такой информации.

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

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

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

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


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

Вопрос такой.

В bind_stalker-е, у актора по умолчанию нет хит-колбэка. Я пробовал его ставить по образу и подобию как у мобов, в методе reinit. Вылетов не последовало, но и работать новый колбэк отказался.

А у кого-нибудь получалось его поставить? и как?

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

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

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

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


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

В общем, такая непонятка. В bind_monster-е, добавил в самый конец death-колбэка такой код:

    if victim then
    news_manager.send_tip(db.actor, "Death. victim: "..victim:section(), nil, nil, 10000)
    end
    if who then
    news_manager.send_tip(db.actor, "Death. who: "..who:section(), nil, nil, 10000)
    end

Убиваю кабанов - и никаких сообщений не появляется, как будто колбэк не работает или не получает заявленных в заголовке данных victim и who. Почему так?

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

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

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

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


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

Disord

Вот так:

local item_count = 0
local target = ""

function get_item_count(target_section)
item_count = 0
target = target_section
if db.actor then db.actor:iterate_inventory(iterate_inventory_action, actor) end

return item_count
end

function iterate_inventory_action(actor, item)
if actor and item then
local section = item:section()
if section == target_section then item_count = item_count + 1 end
end
end

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

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

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

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


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

Приветствую. У меня вопрос по логике мобов, неуверен что не ошибся темой...

Допустим, я заспавнил в точке А стаю собак, как заставить их всех бежать в точку Б и там уже поступать по своему разумению - кусать все что встретится. Нужно что-то наподобие гона кабанов на блокпосту долга на свалке. Проблема в том что в логике я пока нуб( подскажите где посмотреть, как это реализовано, и каков принцип работы этой штуки.

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

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

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

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


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

Ulman

Из того что приходит в голову

1) В случае лечения нпс через диалог, вызывать функцию которая принудительно восстановит здоровье непися до нормы

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

У меня в своей реализации постепенно действующих аптечек сделано по второму методу

function relocate_item_section(victim, section, type)

    if db.actor and victim then
        if type == "in" then

            --' Трансферить нужно только квестовые предметы.
            if quest_section[section] == true and
               victim:object(section) ~= nil 
            then
                victim:transfer_item(victim:object(section), db.actor)
            else
                alife():create(section,    
                        db.actor:position(),
                        db.actor:level_vertex_id(),    
                        db.actor:game_vertex_id(),
                        db.actor:id())
            end
        elseif type == "out" then
            if section == "two_medkit" then
            twoteam_usetime.relocate_medkit("two_medkit", "medkit", victim)
            elseif section == "two_medkit_army" then 
            twoteam_usetime.relocate_medkit(section, "medkit_army", victim)
            elseif section == "two_medkit_scientic" then
            twoteam_usetime.relocate_medkit(section, "medkit_scientic", victim)
            else
            db.actor:transfer_item(db.actor:object(section), victim)
            end
        end
        news_manager.relocate_item(db.actor, type, section)
    end
end

 

function relocate_medkit(section, target_section, target)
twoteam.set_rundrop_data(true)
local medobj = db.actor:object(section)
if medobj == nil then return end
if alife() then
local seobj = alife():object(medobj:id())
if seobj then alife():release(seobj, true) end
spawn.inv(target_section, target:id())
end
end

Вместо set_rundrop_data у Варгаса, полагаю, что-то свое, если его способ реализации похож на мой (до сих пор в глаза не видел, так что понятия не имею), в любом случае трогать это ненадо, к делу не относится.

 

 

Вопрос такой, при удалении методом alife():release некоторые объекты надо переводить в оффлайн, некоторые можно прямо из онлайна удалять. Кто-нибудь занимался сбором информации, какие надо а какие-нет? Понимаю, вопрос лениво выглядит, но нехватка свободного времени заставляет искать готовый ответ в виде по-возможности полного "справочника" какие надо переводить а какие нет. Заранее спасибо за ответ.

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

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

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

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


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

7.9

А вариант удалить в инвентаре прежнего владельца и заспавнить в инвентаре нового, не подойдет?

Реализация попроще, и результат тот же.

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

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

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

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


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

Всем доброго времени суток. Столкнулся с непоняткой.

Имеем функцию: (вызывается в диалоге)

function info_endtrade()
    local tsection = item_memory.section
    local tcount = item_memory.count
    local asection = af_memory.section
    local acount = af_memory.count
    local icon_tip = "ui_iconsTotal_esc_blockpost_case_to_trader"
    local task_texture, task_rect = get_texture_info(icon_tip)    
    local ltx = system_ini()
    local tname = ltx:r_string(tsection, "inv_name")
    local tdesc = ltx:r_string(tsection, "description")
    local mainlabel = "Покупаешь: "..game.translate_string(tname)
    if tcount > 1 then mainlabel = mainlabel.." x "..tostring(tcount) end
        db.actor:give_talk_message(mainlabel, task_texture, task_rect,"iconed_trade_info")
        db.actor:give_talk_message(game.translate_string(tdesc), task_texture, task_rect,"simple_answer_item")
    
    if string.find(tsection, "wpn_", 1) then --- is weapon
    local rpm = ui_wpn_params.GetRPM(tsection)
    local damage = ui_wpn_params.GetDamage(tsection)
    local handling = ui_wpn_params.GetHandling(tsection)
    local accuracy = ui_wpn_params.GetAccuracy(tsection)
    if db.actor:is_talking() then
            db.actor:give_talk_message("Скорострельность: "..tostring(round(rpm * 10) / 10), task_texture, task_rect,"simple_answer_item")
            db.actor:give_talk_message("Повреждение: "..tostring(round(damage * 10) / 10), task_texture, task_rect,"simple_answer_item")
            db.actor:give_talk_message("Надежность: "..tostring(round(handling * 10) / 10), task_texture, task_rect,"simple_answer_item")
            db.actor:give_talk_message("Точность: "..tostring(round(accuracy * 10) / 10), task_texture, task_rect,"simple_answer_item")
    end
    elseif string.find(tsection, "outfit", 1) then --- is outfit
    local radiation = ltx:r_float(tsection, "radiation_protection")
    local chemical = ltx:r_float(tsection, "chemical_burn_protection")
    local wound = ltx:r_float(tsection, "wound_protection")
    local fire_wound = ltx:r_float(tsection, "fire_wound_protection")
            db.actor:give_talk_message("Защита от радиации: "..tostring(round(radiation * 100)), task_texture, task_rect,"simple_answer_item")
            db.actor:give_talk_message("Защита от хим. ожогов: "..tostring(round(chemical * 100)), task_texture, task_rect,"simple_answer_item")
            db.actor:give_talk_message("Защита от порезов: "..tostring(round(wound * 100)), task_texture, task_rect,"simple_answer_item")
            db.actor:give_talk_message("Защита от пуль: "..tostring(round(fire_wound * 100)), task_texture, task_rect,"simple_answer_item")    
    end
    local aname = ltx:r_string(asection, "inv_name")
    local main2label = "Продаешь: "..game.translate_string(aname).." x "..tostring(acount)
    db.actor:give_talk_message(main2label, task_texture, task_rect,"iconed_trade_info")
end

И вот парочка скринов - результат ее работы:

http://i006.radikal.ru/1110/f9/83724f14e831.jpg

http://i073.radikal.ru/1110/37/e57c417d18d8.jpg

 

Проблема собственно вот в чем. Вызовы глобальной функции round были поставлены для того чтоб числа точности/скорострельности и прочего привести из неудобоваримых дробей к благопристойному виду. Вот, как видите, они почему-то не всегда работают, и сбоят в разных местах каждый раз.

Почему так и как бы это округление правильно сделать.

Изменено пользователем Zander_driver

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

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

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

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


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

Чтобы один знак после запятой оставался. Мне казалось так проще будет.

Да, я не знаю всех существующих в луа функций преобразования типов. Затем и пишу :)

 

Edit: Ну да, когда сделал просто

tostring(round(rpm))

То сразу во всех строках числа целые стали. Но почему начинается такая чепуха когда я всего лишь разделяю результат на 10...

Изменено пользователем Zander_driver

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

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

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

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


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

Desertir верно сказал, колбек на юзание объекта самый удобный способ.

 

А вот

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

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

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

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

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


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

хзхзхзхз

А что еще должно падать? Может я не знаю чего, но помоему падают обычно те предметы которые у нпс были в наличии при жизни.

Изменено пользователем Zander_driver

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

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

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

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


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

Darkscape, а зачем у тебя проверки разных предметов через elseif идут? Этак получается, колбаса начнет становиться радиоактивной только тогда, когда нерадиоактивный хлеб в инвентаре закончится. А если его много? понадобится немало апдейтов чтобы до колбасы дошла очередь...

Кстати еще один минус такой реализации - за один апдейт из обычного в радиоактивный превратится не более одного предмета...

 

Способ получше - сделать у себя в скрипте список секций продуктов, которые надо проверять, и если радиация поднялась выше 0,3, а перед тем была ниже - перебором предметов в инвентаре сразу обнаруживаем все подходящие предметы (продукты). заносим найденные итемы в таблицу. И при следующем апдейте заменяем их все разом, секцию нового предмета определяя по принципу секция_старогo..rad.

Изменено пользователем Zander_driver

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

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

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

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


Ссылка на сообщение
MIDERY, Может быть, кроме анимации стоит еще здоровье этого НПСа убавить, чтоб он не сомневался в своей ранености?

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

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

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

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


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

MIDERY, Полезно почитать

Можно примерно так:

local h = object.health
object.health = 0.05 - h

Где object - это собственно нужный вам нпс. Как получить его объект, существует масса способов, начиная с того что проще всего его выцепить и запомнить по ид при спавне.

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

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

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

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

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


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

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

AMK-Team.ru

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