Shredder 49 Опубликовано 13 Декабря 2009 У меня такая проблема. Не бейте сильно, если она уже была где-то описана - полистал, не нашёл... Дело вот в чём. Добавил на Затоне рандомом аномалии. Как оказалось - они не срабатывают на НПС. На монстров вроде срабатывает, но без ущерба для них. Как решить проблему? Заранее большое спасибо. Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 14 Декабря 2009 (изменено) Опять возник вопрос. Мне раньше никогда не приходилось спавнить что-то в инвентарь NPC. Так что возникли некоторые проблемы. Конечно, можно было просто добавить предмет неписю через его профиль, но тогда надо начинать новую игру. Вот я решил сделать для этого скрипт. Вот такой Тут ошибка в том, что ты пытаешься получить кооринаты не с объекта, а из строки. Попробуй исправить вот так: function spawn_killers_pda() local id, npc id = "zat_b103_lost_merc_leader" ------Строка, а не объект!-------- npc = get_story_object_id(id) npc = alife():object(npc) ---- А вот тут уже объект alife():create("killers_pda", npc:position(), npc:level_vertex_id(), npc:game_vertex_id(), npc:id()) end Должно сработать. Изменено 14 Декабря 2009 пользователем Shredder Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 14 Декабря 2009 psevdoгринго Сразу не обратил внимание, но в строчке: alife():create("killers_pda", npc:position(), npc:level_vertex_id(), npc:game_vertex_id(), npc:id()) зачем там npc:id()? Оставь без него: alife():create("killers_pda", npc:position(), npc:level_vertex_id(), npc:game_vertex_id()) Теперь о моей проблеме. При рандомном спавне любых аномалий происходит вылет вот такой: FATAL ERROR [error]Expression : assertion failed [error]Function : CCustomZone::CalcDistanceTo [error]File : D:\prog_repository\sources\trunk\xrGame\CustomZone.cpp [error]Line : 1469 [error]Description : nearest_s Причём, происходит он, если спавню больше 120-130 аномалий. Кто-нибудь сталкивался с такой проблемой? Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 15 Декабря 2009 Maks_K Я это тоже находил. Даже пришлось Shoker Mod 1.2 (ЧН) скачать. В скриптах глянул - "field" нужно для аномалий, типа зоны радиации, для аномалий, которые "бьют больно и сразу" оно не нужно. На всякий случай попробовал добавить ко всем аномалиям, которые спавню. Классно. Сталкер загрузился, но нет ни одной аномалии (Специально спавнил только "Холодец", т.к. его далеко видно). Так что проблема не решена Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 16 Декабря 2009 У меня вот так сработало: function spawn_killers_pda() local id, npc if xr_conditions.is_alive(nil,nil,{"zat_b103_lost_merc_leader"}) then id = "zat_b103_lost_merc_leader" npc = get_story_object_id(id) npc = alife():object(npc) alife():create("wpn_rpg7", npc.position, npc.level_vertex_id, npc.game_vertex_id, npc.id) end end Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 21 Апреля 2012 Доброго времени суток. Аномалии в CoP не "жалятся", потому что разаботчики отключили взаимодействие сталкеров (да и монстров) с ними. Обрати внимание в секции [stalker] на параметр SpaceRestrictionSection (да и на killer_clsids тоже) и сравни с аналогичным в SHoC и CS. Думаю этой подсказки достаточно, чтобы самому восстановить опасность аномалий для неписей. Прочитав эту подсказку, сразу же бросился сравнивать эти параметры для ЗП и ТЧ. Однако оба этих параметра оказались одиннаковыми: SpaceRestrictionSection = space_restrictor,zone_mine_field killer_clsids = Z_MINCER,Z_GALANT,ZS_BFUZZ,ZS_MBALD,ZS_GALAN,ZS_MINCE Поэтому, уважаемый Artos, не мог бы ты дать ещё одну подсказку? Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 4 Июня 2012 (изменено) Доброго времени суток. Кто нибудь юзал функцию set_visual_name? Вообщем, дело тут вот в чём. Мне нужно заменить visual у npc, когда он появляется. Вызываю её в конце функции motivator_binder:net_spawn. Там даже в начале функции есть фрагмент кода, в котором используется set_visual_name. В этом случае visual у npc меняется, но он при этом становится бессмертным. Если вешаю set_visual_name на таймер, тогда вообще мало того, что он не убиваемый, так они ещё и выглядят как комок с тряпками, который волочится по полу. При этом успешно атакует ГГ ))) Так вот, можно ли как то заставить эту функцию работать нормально? Изменено 4 Июня 2012 пользователем Shredder Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 5 Июня 2012 (изменено) Для проверки сделал элементарную вешь: убрал старую gamedata, создал новую, в ней - папку scripts, в неё скопировал из расспакованого сталкера всего один файл xr_motivator.script. В нём в конце функции motivator_binder:net_spawn(sobject) после строки self.object:group_throw_time_interval(2000) добавил вот такое: self.object:set_visual_name([[actors\stalker_neutral\stalker_neutral_nauchniy]]) Создаю новую игру. Иду встречаю двух типов, они всё как положено в научном прикиде, но только не убиваемые. Ну по крайней мере, с укороченного калаша нивкакую, правда я с гаусса не пробовал, но думаю, врятли бы помогло. )) Так вот, что я сделал не так? function motivator_binder:net_spawn(sobject) ... self.object:group_throw_time_interval(2000) self.object:set_visual_name([[actors\stalker_neutral\stalker_neutral_nauchniy]]) return true end Изменено 5 Июня 2012 пользователем Artos Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 5 Июня 2012 А зачем тебе вообще через скрипт визуал менять? Не проще создать сколько угодно нужных профилей с нужными визуалами и вводить (убирать) в игру? Муторно это. Вот, допустим понравилась, мне моделька из-какого-нибудь мода, и я хочу чтобы некоторые npc её использовали. Так это сколько xml'а надо перелопатить? А я тут придумал попроще. В лтх файле в соостветствии с названием портрета npc хранить допустимые для него визуалы и когда npc первый раз спавнится - выбирать случайный. И чтобы добавить новый визуал в игру, достаточно прописать его в нескольких файлах (число локаций). Не хочется с net-пакетами связываться, я в них ничего не понимаю, но видимо придётся ((( Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 5 Июня 2012 (изменено) В character_desc_* куча профилей, в которых уже прописан визуал. Допустим я в них хочу заменить, но не во всех, тогда что делать?. А в моём способе что муторно? Визуал в одном месте прописать? Ну а с иконками вообще не заморачиваюсь, какие есть, такие есть, всё равно, когда играю, на них уже не смотрю. Да и потом, вдруг нужно какой-нибудь визуал из игры убрать - удаляю его из одного файла и всего делов. Мне кажется, способ оч. хороший. Добавлено через 30 мин.: Artos, про защиту я знаю, только сейчас про неё речи нет. В общем, попытался я сделать через net-paketы (своровал кусок кода из imm мода). Принцип работы: через нет-пакет записываю новый визуал, потом отправляю npc в оффлайн, потом отправляю обрано в онлайн. И всё в принципе работает, но есть проблемка: у трупов появляются вещи, которых быть не должно: гармошка, пда, гитара и т.д. Может кто-нибудь подскажет из-за чего? Функция, которая отправляет npc онлайн/оффлайн: function convert_npc(npc_id, state) local npc=level.object_by_id(npc_id) local serv_obj=alife():object(npc_id) if not serv_obj then need_change[npc_id]=nil return end if npc == nil and state == "turn_on" then serv_obj.sim_forced_online = true if serv_obj.online ~= true then serv_obj:switch_online() end need_change[npc_id]=nil elseif npc and state == "turn_off" then if _m.is_stalker(serv_obj) then npc:clear_animations() if serv_obj:alive() then npc:stop_talk() end end serv_obj:switch_offline() need_change[npc_id]="turn_on" end end Изменено 5 Июня 2012 пользователем Artos Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 6 Июня 2012 Artos, возможно ты не внимательно посмотрел мой пример использования функции set_visual_name, т.к. там я совершенно не меняю параметры защиты у visual'а, более того там вообще всего один файл изменён по сравнению с оригиналом. Так о какой защите может идти речь? Проблема - npc после переодевания их функцией set_visual_name становятся бессмертными, независимо от того, какой визуал ты им указываешь. Да и к тому же, при переодевании npc нет-пакетом такой проблемы нет. Вообщем, либо после (до) использования функции set_visual_name c npc нужно что-то ещё сделать, либо эта функциия вообще предназначена только для ГГ, т.к. приминетельно к нему никаких проблем не возникает. Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 6 Июня 2012 (изменено) На счёт попугаев. Специально для тебя добавил ещё один файлик, в котором в начале игры добавил себе гаусс. Встречаю двух типов в научных комбензонах (переодетых функцией set_visual_name), подхожу в упор и стреляю в голову из гаусса!!!. Он только: "Ах ты ж епт..." и по мне стрелять. Я думаю, мне не стоит тебе рассказывать, на сколько мощный гаусс в оригинале ЗП? И о том, что параметры защиты прошиты в визуале указанием на определённый файл я оч. хорошо знаю. Поэтому, уважаемый Artos, вместо того, чтобы принимать меня за дурачка, который совсем не шарит в кодах Сталкера, попробовал бы воспроизвести ситуацию и убить этих двух типов даже используя вот такую строку:self.object:set_visual_name([[actors\stalker_neutral\stalker_neutral_1]]) Изменено 6 Июня 2012 пользователем Shredder Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 6 Июня 2012 Я знаю, что ещё со времён Теней Чернобыля успешно используют нет-пакеты для этого дела. Но вот захотелось в ЗП использовать новую функцию, а она упрямится ((( Прочитал свой первый пост, в конце которого: как можно заставить эту функцию (set_visual_name) работать правильно? Если тебе не сложно, то покажи пожалуйста код, как её используешь ты. Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 6 Июня 2012 Ты натолкнул меня на одну мысль и я ещё немного поэкспериментировал. Что выяснилось: 1) set_visual_name отрабатывает норм, если ей передаётся такой же visual, как и был. Делал так: visual = npc:get_visual_name() npc:set_visual_name(visual) походу, где-то в движке проверка стоит, и функция просто не выполняется. 2) Теперь я знаю зачем разрбам понадобилась функция set_visual_name - для отыгрывания сценок с гг, когда спавнится сталкер и ему устанавливается визуал, как у ГГ. И понятно, что в этой сценке того двойника не должны убить, вот функция и делает его бессмертным. 3) А комок то всё равно получается. Вот как я его получал: local stalker_ids = {} function update() local npc local visual for id,t in pairs(stalker_ids) do if t then npc = level.object_by_id(id) if npc and (t + 20000 < time_global()) then npc:set_visual_name([[actors\stalker_neutral\stalker_neutral_nauchniy]]) stalker_ids[id] = nil end end end end function on_npc_spawn(npc) if npc and npc:alive() then stalker_ids[npc:id()] = time_global() end end Как говорится, в споре рождается истина! И хоть я так и не узнал, как правильно использовать функцию set_visual_name, зато теперь мне совершенно ясно, что её не нужно использовать для моих целей, т.к. она для этого не предназначена. Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 7 Июня 2012 Хочу добавить, что при "комках" случались вылеты, в логе было что-то типа error stalker in visual. Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 8 Июня 2012 Возвращаюсь к теме визуала, хотя здесь скорее всего вопрос по нет-пакетам (туго у меня с ними). Сначала объясню на словах, что делаю, потом код. Мне нужно в первый спавн сталкера сменить ему визуал и установить флаг, что визуал сменён, чтобы при следующем спавне уже не менять визуал. Для этого я в файле se_stalker.script добавляю этот флаг self.not_first_spawn = false в функцию se_stalker:__init . В функции сохранения/записи в этом же файле добавляю соответственно в se_stalker:STATE_Write(packet) строку packet:w_bool(self.not_first_spawn), а в функцию se_stalker:STATE_Read(packet, size) строку self.not_first_spawn = packet:r_bool() в самом конце функций. В функцию se_stalker:switch_offline() в начале ставлю self.not_first_spawn = true. Для работы с нет-пакетами использую функции из SGM-мода. В первый спавн сталкера я нет-пакетом заменяю визуал. Чтобы изменения коснулись клиентского объекта - отправляю его в оффлайн, а потом обратно в онлайн. Но почему то иногда флаг спавна лута death_droped получается установлен в true ещё до смерти сталкера, из-за этого при убийстве у него появляются гармошка, гитара, кпк и т.д. Я подозреваю, что как раз в функциях _p.read_stalker_params, _p.write_stalker_params, которые как раз работают с нет-пакетом, тоже нужно внести изменения, чтобы они правильно записывали/читали новый параметр not_first_spawn, но не могу сообразить, что нужно добавить. Помогите пожалуйста. Может есть более лёгкий способ запомнить, что сталкер уже появлялся на свет? function se_stalker:__init (section) super (section) self.ini = nil self.ini_initialized = false self.smart_terrain_conditions = nil self.smart_terrain_conditions_initialized = false -- этот флаг берётся из работы смарта -- true = всегда в онлайне -- false = всегда в офлайне -- condlist = условие, которое отпределяет true или false -- nil = смарту всё равно self.job_online = nil self.job_online_condlist = nil self.death_droped = false --'Генерил ли персонаж выпадаемые предметы или нет. self.not_first_spawn = false --'Указывает, что сталкер заспавнился первый раз self.m_registred = false self.sim_forced_online = false if db.offline_objects[self.id] == nil then db.offline_objects[self.id] = {} end self.board = sim_board.get_sim_board() end function se_stalker:switch_offline() self.not_first_spawn = true _callbacks.on_npc_switch_offline(self) cse_alife_human_stalker.switch_offline(self) end -------------------- function se_stalker:STATE_Write(packet) cse_alife_human_stalker.STATE_Write (self, packet) if self.online then packet:w_stringZ(tostring(level and level.object_by_id(self.id) and level.object_by_id(self.id):level_vertex_id())) else packet:w_stringZ(tostring(db.offline_objects[self.id] and db.offline_objects[self.id].level_vertex_id)) end packet:w_stringZ(tostring(db.offline_objects[self.id] and db.offline_objects[self.id].active_section)) packet:w_bool(self.death_droped ) packet:w_bool(self.not_first_spawn) end -------------------- function se_stalker:STATE_Read(packet, size) cse_alife_human_stalker.STATE_Read (self, packet, size) if self.script_version > 10 then local old_lvid = packet:r_stringZ() if db.offline_objects[self.id] == nil then db.offline_objects[self.id] = {} end db.offline_objects[self.id].active_section = packet:r_stringZ() if db.offline_objects[self.id].active_section == "nil" then db.offline_objects[self.id].active_section = nil end if old_lvid ~= "nil" then db.offline_objects[self.id].level_vertex_id = tonumber(old_lvid) end end self.death_droped = packet:r_bool() self.not_first_spawn = packet:r_bool() end function read_stalker_params(id) local sobj if type(id) == "number" then sobj = alife():object(id) else sobj = id id = sobj.id end if sobj then stpk:w_begin(0) uppk:w_begin(0) sobj:STATE_Write(stpk) sobj:UPDATE_Write(uppk) local size=stpk:w_tell() local size1=uppk:w_tell() stpk:r_seek(2) uppk:r_seek(2) local ret = {} -- cse_alife_trader_abstract properties ret.money = stpk:r_s32() ret.specific_character = stpk:r_stringZ() ret.trader_flags = stpk:r_s32() ret.character_profile = stpk:r_stringZ() ret.community_index = stpk:r_s32() ret.rank = stpk:r_s32() ret.reputation = stpk:r_s32() ret.character_name = stpk:r_stringZ() -- cse_alife_object properties ret.game_vertex_id = stpk:r_u16() ret.distance = stpk:r_float() ret.direct_control = stpk:r_s32() ret.level_vertex_id = stpk:r_s32() ret.object_flags = stpk:r_s32() ret.custom_data = stpk:r_stringZ() ret.story_id = stpk:r_s32() ret.spawn_story_id = stpk:r_s32() -- cse_visual ret.visual_name = stpk:r_stringZ() ret.upd_extra_data=read_extra(uppk,size) ret.extra_data=read_extra(stpk,size) return ret end return nil end -- таблица параметров и id на входе function write_stalker_params(ret,id) local sobj if type(id) == "number" then sobj = alife():object(id) else sobj = id id = sobj.id end if sobj then stpk:w_begin(0) uppk:w_begin(0) -- cse_alife_trader_abstract properties stpk:w_s32(ret.money) stpk:w_stringZ(ret.specific_character) stpk:w_s32(ret.trader_flags) stpk:w_stringZ(ret.character_profile) stpk:w_s32(ret.community_index) stpk:w_s32(ret.rank) stpk:w_s32(ret.reputation) stpk:w_stringZ(ret.character_name) -- cse_alife_object properties stpk:w_u16(ret.game_vertex_id) stpk:w_float(ret.distance) stpk:w_s32(ret.direct_control) stpk:w_s32(ret.level_vertex_id) stpk:w_s32(ret.object_flags) stpk:w_stringZ(ret.custom_data) stpk:w_s32(ret.story_id) stpk:w_s32(ret.spawn_story_id) -- cse_visual stpk:w_stringZ(ret.visual_name) write_extra(uppk,ret.upd_extra_data) write_extra(stpk,ret.extra_data) local size=stpk:w_tell() stpk:r_seek(2) uppk:r_seek(2) sobj:STATE_Read(stpk,size) sobj:UPDATE_Read(uppk) end end local new_visual = visuals[math.random(1,#visuals)] local npc_data = _p.read_stalker_params(server_obj) if not npc_data then return end npc_data.visual_name = new_visual _p.write_stalker_params(npc_data, server_obj) need_change[npc:id()] = 'turn_off' function vch_update() for id, state in pairs(need_change) do if state then convert_npc(id, state) end end end function convert_npc(npc_id, state) local npc=level.object_by_id(npc_id) local serv_obj=alife():object(npc_id) if not serv_obj then need_change[npc_id]=nil return end if npc == nil and state == "turn_on" then serv_obj.sim_forced_online = true if serv_obj.online ~= true then serv_obj:switch_online() end need_change[npc_id]=nil elseif npc and state == "turn_off" then if _m.is_stalker(serv_obj) then npc:clear_animations() if serv_obj:alive() then npc:stop_talk() end end serv_obj:switch_offline() need_change[npc_id]="turn_on" end end Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 12 Июня 2012 Уважаемый Artos, не мог бы ты поделиться со мной библиотечкой для работы с нет-пакетами для чистой версии COP 1.6.02, если таковая имеется в твоём запасе? Просто оказалось, что взятые мной функции из различных модов искажают нет-пакет, даже если я совершенно не трогаю файл se_stalker, т.е. не добавляю какие-либо параметры. По поводу флага смены визуала. Сразу хочу сказать Спасибо! Т.к. твои слова просто писать переменную в pstor твоему об'екту меня просто осинили. Я почему то всегда думал, что pstor - этот только для actora, но сейчас глянул эти функции и убедился, что это не так. Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 14 Июня 2012 Возвращаюсь к вопросу визуалов и нет-пакетов. У меня походу скоро крыша поедет. Использование m_netpk не к чему не привело, т.к. грёбаные гитары, гармошки и прочая хрень всё также появляется у трупов. Собрал отдельную сборочку: В папке gamedata две папки configs и scripts. В папке configs всего один файл m_netpk.ltx. в Папке scripts 3 файла: m_netpk.script, mod.script и xr_motivator.script. function logf(str,...) if not str then str = "((string is nil))" end get_console():execute("load ~#I#:"..string.format(str,...)) end function npc_first_update(npc) logf('npc update [%s]', npc:name()) if npc and npc:alive() then local pk = m_netpk.get(alife():object(npc:id())) if pk and pk:isOk() then mod.logf("pk is OK") local npc_data = pk:get() npc_data.visual_name = [[actors\stalker_neutral\stalker_neutral_nauchniy]] pk:set(npc_data) end end end function motivator_binder:update(delta) ... if self.first_update == false then if object_alive == false then death_manager.drop_manager(object):create_release_item() end mod.npc_first_update(object) self.first_update = true end ... end m_netpk.script не изменял. В результате, при убийстве npc у него появляются (а точнее не исчезают) вышеупомянутые предметы... Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 14 Июня 2012 (изменено) Artos я это прекрасно понимаю! Как раз флаг выдачи лута устанавливается в true после записи нет-пакета. Если в приведённом выше примере я не записываю нет-пакет, то с флагом всё в порядке. Ни файл death_manager.script, ни его конфиги (death_items_by_communities.ltx, death_items_by_levels.ltx, death_items_count.ltx) я вообще не трогаю. Я отдельно собрал минимальный набор файлов, который привёл выше. Там всё просто, как три копейки, но флаг death_droped становиться true после записи нет-пакета. Вот ссылка на архивчик с этой минисборкой. Уважаемый Artos, если найдёшь время - посмотри пожалуйста. Я уже 4-ый день не могу спокойно спать и работа над модом стоит... (вообще вот это уже лучше в ЛС, дабы не засорять частностями) Уточни версию патча твоей игры (SHoC 1.0004/5/6 ru/ww) ? Заодно проверь, нет ли в папке игры лишних *.dbN## иль в подпапке 'mods' *.xdb##. И что будешь делать, если посмотрю и скажу, что у меня трупы почти пусты и никаких излишков? В таком случае хотя бы прикладывают сэйвы с логом (до и после события) --/Artos Изменено 15 Июня 2012 пользователем Artos Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 30 Июня 2012 karonbaron, если он не будет его съедать - то это получится какой-то читерский ремкомплект. Предполагается, что этот ремкомплект содержит расходный материал (типа бронепластины и т.д.) и естественно, что после ремонта он должен исчезать. Ну если тебе нужен такой, то переделай вот так: -- Ремонт комплект для костюмов function repair_outfit() alife():create("repair_kit_outfit", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id()) local item_s6 = db.actor:item_in_slot(6) --объявляем переменную (item_s6) if item_s6 ~= nil and item_s6:condition() >=0.30 and item_s6:condition() ~=1 then --когда костюм можно чинить (состояние больше или равно 30%) item_s6:set_condition(1) local snd_obj = xr_sound.get_safe_sound_object([[interface\inv_detach_addon]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,0,255,0]Ремонт костюма завершен." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) elseif item_s6 == nil then --когда костюма нет local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: нужно одеть коcтюм." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) elseif item_s6:condition() <0.30 then --когда костюм нельзя чинить (состояние меньше 30%) local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: костюм слишком сильно повреждён." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) elseif item_s6:condition() ==1 then --когда костюм в отличном состояние local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: %c[255,0,255,0]костюм в отличном состояние." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) end end И будет тебе счастье Поделиться этим сообщением Ссылка на сообщение