Zander_driver 10345 Опубликовано 8 Марта 2011 Вобщем, напоролся на непонятку при решении одной, кхм, задачи. Задача была такая: Если гг передает определенный итем в инвентарь трупа или ящика, то - уже в инвентаре трупа\ящика удалить этот предмет и заспавнить другой. Как я себе представляю метод решения: в дроп-колбэке отслеживаем скидывание предмета (а он срабатывает и на собственно дроп, и на передачу трупу\ящику, и на передачу в диалоге), затем проверяем наличие системного инфопоршня 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 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 5 Апреля 2011 Вобщем, ситуация такая. У физических объектов (имеются в виду разбиваемые ящики и т.п. объекты) хит-колбэк биндится не в реините, а в апдейте, по довольно занятным условиям: 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 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 5 Апреля 2011 Прошу прощения увлекся. Просто, я обычно именно на таком языке и изъясняюсь - привык. А по самой ситуации - мне просто нужно отследить хит всех тех предметов, которые можно сломать с помощью какого либо оружия. И ловить их непосредственно в игровом процессе, как мне представляется, неудобно. О том чтобы решать "нужен ли этому объекту колбэк" уже в момент когда в него стреляют - я и вовсе молчу, т.к. не представляю как это сделать. death мне не подходит, т.к. какой-нибудь ящик может и несколько выстрелов выдержать, и надо обрабатывать каждый. А поступить как с прожектором... блин, тоже не очень удобно. прожектор это один clsid.projector, а те объекты что нужны мне - это и деревянные ящики, и железные - те что поменьше, и (если я правильно понимаю) доски в заколоченных окнах и дверях некоторых домов. Я почему то думаю что это clsid."разные объекты" Я даже не знаю как их по clsid узнать, как они называются? А логика drop_box... разве не подразумевает что из сломанного объекта должно что то выпасть? В случае с ломающейся доской будет нелогично. Я честно говоря эту сторону мало изучал. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 5 Апреля 2011 Можно конечно и не увлекаться. Но, если уж основная часть урона, наносимого оружием, высчитывается скриптом а не движком - а у меня именно так - то приходится А то получается, ящик в котором что-то есть, разваливается с 2 пуль ПМ, а ящик в котором ничего нет - не разломать и за 10, При том что внешне они выглядят абсолютно одинаково и игрок может изначально и не знать, в каком из них что-то есть. Спасибо за ответы буду размышлять над разными вариантами. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 5 Апреля 2011 Теперь еще один вопрос, уже не от меня, а.. от нашего квестовика. У менє проблема. 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 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 9 Апреля 2011 (изменено) 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("все что полагается") можно ли спавнить объекты за пределами онлайн-радиуса? Изменено 9 Апреля 2011 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 13 Апреля 2011 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 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 15 Апреля 2011 Вопрос такой. В bind_stalker-е, у актора по умолчанию нет хит-колбэка. Я пробовал его ставить по образу и подобию как у мобов, в методе reinit. Вылетов не последовало, но и работать новый колбэк отказался. А у кого-нибудь получалось его поставить? и как? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 20 Апреля 2011 В общем, такая непонятка. В 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 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 9 Мая 2011 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 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 23 Мая 2011 Приветствую. У меня вопрос по логике мобов, неуверен что не ошибся темой... Допустим, я заспавнил в точке А стаю собак, как заставить их всех бежать в точку Б и там уже поступать по своему разумению - кусать все что встретится. Нужно что-то наподобие гона кабанов на блокпосту долга на свалке. Проблема в том что в логике я пока нуб( подскажите где посмотреть, как это реализовано, и каков принцип работы этой штуки. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 27 Сентября 2011 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 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 6 Октября 2011 7.9 А вариант удалить в инвентаре прежнего владельца и заспавнить в инвентаре нового, не подойдет? Реализация попроще, и результат тот же. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 8 Октября 2011 (изменено) Всем доброго времени суток. Столкнулся с непоняткой. Имеем функцию: (вызывается в диалоге) 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 были поставлены для того чтоб числа точности/скорострельности и прочего привести из неудобоваримых дробей к благопристойному виду. Вот, как видите, они почему-то не всегда работают, и сбоят в разных местах каждый раз. Почему так и как бы это округление правильно сделать. Изменено 8 Октября 2011 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 8 Октября 2011 (изменено) Чтобы один знак после запятой оставался. Мне казалось так проще будет. Да, я не знаю всех существующих в луа функций преобразования типов. Затем и пишу Edit: Ну да, когда сделал просто tostring(round(rpm)) То сразу во всех строках числа целые стали. Но почему начинается такая чепуха когда я всего лишь разделяю результат на 10... Изменено 8 Октября 2011 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 18 Октября 2011 Desertir верно сказал, колбек на юзание объекта самый удобный способ. А вот сделать колбек на потерю предмета или по старинке проверять, существует ли предмет, который потерян. - это было очень популярно в древних модах года три - четыре назад, хотел бы я знать почему Способ чреват тем что при скриптовых заменах одного предмета на другой будет срабатывать ваш скрипт, хотя никто этот хлеб не ел. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 2 Ноября 2011 (изменено) хзхзхзхз А что еще должно падать? Может я не знаю чего, но помоему падают обычно те предметы которые у нпс были в наличии при жизни. Изменено 2 Ноября 2011 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 3 Ноября 2011 (изменено) Darkscape, а зачем у тебя проверки разных предметов через elseif идут? Этак получается, колбаса начнет становиться радиоактивной только тогда, когда нерадиоактивный хлеб в инвентаре закончится. А если его много? понадобится немало апдейтов чтобы до колбасы дошла очередь... Кстати еще один минус такой реализации - за один апдейт из обычного в радиоактивный превратится не более одного предмета... Способ получше - сделать у себя в скрипте список секций продуктов, которые надо проверять, и если радиация поднялась выше 0,3, а перед тем была ниже - перебором предметов в инвентаре сразу обнаруживаем все подходящие предметы (продукты). заносим найденные итемы в таблицу. И при следующем апдейте заменяем их все разом, секцию нового предмета определяя по принципу секция_старогo..rad. Изменено 3 Ноября 2011 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 6 Ноября 2011 MIDERY, Может быть, кроме анимации стоит еще здоровье этого НПСа убавить, чтоб он не сомневался в своей ранености? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10345 Опубликовано 6 Ноября 2011 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 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Поделиться этим сообщением Ссылка на сообщение