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

Уроки по модостроению


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

Наткнулся на такую вот обучалочку по восстановлению вырезанных мутантов в зове припяти:

 

Новые монстры


Введение
Многие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Попробую рассказать, как это дело можно исправить.
Для примера возьму кошек (уж очень они мне нравятся)
Добавить их можно отредактировать файл all.spawn, либо динамически создать в игре через функцию alife:create().
Вылет при появлении
Обычно сопровождается сообщением в логе:
Arguments : Can't open section 'cat_weak'
Это значит, что монстр у нас не до конца описан. В файле конфигурации идет секция
[m_cat_e]:monster_base
Но для создания разных по силе конфигураций монстров обычно используется такая штука. Создается секция вида
[cat_weak]:m_cat_e
то есть ссылка на основную конфигурацию, а потом указываются параметры, которые отличаются от нее. Например сила, здоровье, угол обзора и тд. Мы пока ограничимся просто добавлением этой секции. В файле config\creatures\m_cat.ltx в конце допишем [cat_weak]:m_cat_e. Запускаем, добавляем кошку, вылетаем с ошибкой:
Arguments : Can't find variable smart_terrain_choose_interval in [cat_weak]
Что ж, добавим и этот параметр. Посмотрим, какой он у собак, и сделаем также:
smart_terrain_choose_interval = 00:15:00
Запускаем, вылетаем с ошибкой:
Arguments : Can't find variable satiety_threshold in [cat_weak]
Вобщем, добавляем параметры, по кошка не станет нормально появлятся. Такие ошибки легко локализуются и исправляются.
Ну, на всякий случай, нужно добавить еще две строчки:
critical_wound_threshold = 0.4
critical_wound_decrease_quant = 0.
После этого кошка появляется, бегает, с 30 метров бежит нас кушать. Мы этого не хотим, стреляем в нее, и у нас происходит
Вылет при убийстве
Это знаменитая ошибка:
Arguments : LUA error: e:\stalker\gamedata\scripts\_g.script:20 ........
Самое просто и неправильное решение - закоментировать 20-ю строку скрипта _g.script, вылет исчезнет, но ошибка никуда не денется. Я не могу сказать с уверенностью, к чему игнорирование этого факта может привести, так как исправлял причину, а не следствие.
Путем нехитрых логических размышлений решение было найдено. Вернее тупым перебором всего, что относилось к делу, криками на форумах, битьем головой о стенку... Потом пришло озарение, вместе с сакраментальным вопросом "что происходит после смерти?" А происходит добавление в статистику убитого объекта (монстра, нпс-а). Поэтому лезем в скрипт xr_statistic.script. В самом начале видим объявление переменной
local killCountProps = {...}
в которой кошек нет. Поэтому добавляем их туда (например, в конец), для начисления очков опыта:
cat_weak = 1, cat_normal = 2, cat_strong = 3,
Хотя мы сделали только cat_weak, но на будущее добавим и остальных. Затем идет перечисление используемых классов монстров:
monster_classes = {
кошек нет и здесь, добавляем:
[clsid.cat_s] = "cat",
Смотрим дальше, видим функцию addKillCount(npc), которая определяет сообщество (community) убитого. Функция вызывает getNpcType(npc), которая находится в этом же скрипте. А там идет обращение к функции IsStalker(npc), и возвращает сообщество и ранг убиенного.
Но тут про мостров ни слова, а значит идем дальше. Функция IsStalker(npc) обнаруживается в скрипте _g.script. Просматривая его обнаруживаем следующие интересующие нас функции:
· is_object_monster(obj)
кошек нет, добавляем рядом с собаками:
otype == clsid.cat or
· IsMonster (object, class_id)
кошки есть, ничего не трогаем.
Для страховки проверим еще одни файл, class_registrator.script. Находим в нем строку
cs_register (object_factory, "CCat", "se_monster.se_monster", "SM_CAT_S", "cat_s")
и успокаиваемся на этом. Запускаем, убиваем, подходим, пытаемся обыскать - вылетаем. Потому что случился
Вылет при обыске
Ну тут уже проще. Вспоминаем, что у нас показывается в инвентаре убитого? Иконка растерзанного трупа. Проверяем m_cat.ltx - действительно, параметр icon отсутствует. Тут появляется два пути.
Первый - нарисовать новую иконку, вставить ее в файл ui_npc_monster.dds, определить координаты и добавить их в xml-описатель ui_npc_monster.xml. И так для каждого нового монстра.
Второй - использовать общую иконку для всех монстров, у которых отсутствует этот параметр. Мы им и воспользуемся, так как для тестовых целей сойдет, а для серьезного применения все равно необходимо иметь хоть какие-то художественные навыки (если кто видел мой тестовый мод "15 кошек", то помнят тот ужас вместо иконки кошки )
Для этого отредактируем файл defines.ltx , так как именно в нём содержится секция monster_base, общая для всех монстров. Открываем, ищем секцию, и вставляем
icon = ui_frame_error_sign_red
Это будет такой красный крест в круге. Запускаем, убиваем, обыскиваем и не вылетаем.
Итак, свежедобавленный монстр бегает, живет, нападает. Однако та же кошка по умолчанию невероятно сильна, убивает с одного удара, поэтому для нормальной жизни необходимо подредактировать секцию атаки.
Внимание!!!
Огромный минус в том, что убитое животное не попадает в статистику, хотя мы вроде все для этого сделали. С этим предлагаю разобраться самим. Подсказка: в энциклопедии кошек тоже нет

 

Изменено пользователем HellRatz
Ссылка на комментарий

Два подобных урока по распаковке ресурсов Крайэнгине.

Смотреть на облаке.

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

 

Ну, и пара уроков для Сталкера.

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

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий

СОЗДАНИЕ РАДИО ДЛЯ ЗОВ ПРИПЯТИ .

Этот метод работает на всех версиях ЗП а также и в модификациях ЗП .

Работа в Level Editore( sdk-07)
1.Открываем локацию и камерой ищем место для приёмника(радио)
2.В Level Editore жмём вкладку spawn element , ищем пункт elektrotexnika и в этом пункте ищем priemnik_gorizont.
Жмём мышкой на priemnik_gorizont, потом мышкой на чайник который находится в верхнем левом углу Level Editor, когда нажали чайник потом мышкой жмём на то место где должен стоять приёмник , нажали и он появился и нажимаем клавишу enter , откроются опции приёмника.
В опциях приёмника в разделе Custom data , пишем ссылку на логику радио.
[logic]
cfg=scripts\mar_baz_mafon.ltx

А также в опциях приёмника в разделе Fixed bones , выбрать (link) это означает что приёмник не движим.

И так приёмник поставили и прописали в Level Editore работа оканчена , жмём save потом жмём MakeGame и соберётся спавн и на этом LevelEditor закрываем.
Потом батник компиляции спавна запускаем и когда он отработал надо скопировать спавн локации и вставить в игру и переименовать в all.spawn.

Создаём файл логики для нашего приёмника (радио).
1.Открываем папки (или создаём) gamedata\configs\scripts:
Вот в папке scripts и создаём файл логики:
mar_baz_mafon.ltx. Создали и открываем и пишем ему логику , день \ночь тоесть днём играют дневные мелодии а ночью ночьные, это
Сделано для того что днём играет весёлая и.т.д
А ночью спокойная ведь спят сталкера.

Открыли файл (mar_baz_mafon.ltx)
И пишем.
[logic]
active=sr_idle@day

[sr_idle@day]
on_info = ℅=play_sound(day_muzic_baz)%
on_info = sound_end| {!is_day}sr_idle@night

active = sr_idle@night

[sr_idle@night]
on_info = %=play_sound(night_music_baz)%
on_signal = sound_end| {=is_day}sr_idle@day

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

Регистрируем мелодии.
Открываем папки (или создаём)
gamedata\configs\misc:
Открываем папку misc и ищем файл script_sound.ltx (если нет его, то можно его взять из оригинала игры ,gamedataUE)
Открываем файл script_sound.ltx и вверху допишем ссылку на файл
#include"script_sound_имя вашей локации.ltx"
Потом после строчки wait пишем имя наших файлов
wait

day_muzic_baz
night_music_baz

Потом ниже пишем вот это
[day_music_baz]
type = 3d
path = music\day_music_baz_
shuffle = rnd
idle = 0,0,100

[night_music_baz]
type = 3d
path = music\night_music_baz_
shuffle = rnd
idle = 0,0,100

В папке misc:
Открываем файл script_sound_имя вашей локации.ltx (или создаём и открываем)
И пропишем количество ваших милодий
Вот так и пишем:
[list_script_sound_имя вашей локации]
day_music_baz_1
day_music_baz_2
day_music_baz_3
night_music_baz_1
night_music_baz_2
night_music_baz_3

Открываем папки gamedata\sounds\music: (или создаём)
Вот в папку music и надо вставить ваши музыкальные файлы в формате (ogg)

Открыли папку music и вставили файлы
day_music_baz_1.ogg
day_music_baz_2.ogg
day_music_baz_3.ogg
Это и есть дневные файлы мелодий
night_music_baz_1.ogg
night_music_baz_2.ogg
night_music_baz_3.ogg
Это и есть ночьные файлы мелодий
Добавить можно сколько захотите , главное соблюдать номерацию 1,2,3,4,5,6 и.т.д
Всё заходим в игру и слушаем радио

.

post-43423-0-06431400-1485849907_thumb.jpg

Изменено пользователем BFG
Добавлено BFG,

Под спойлер такие посты !!!

Ссылка на комментарий

Оффтоп переехал в эту тему. В шапке красным по белому написано для чего эта тема и куда обращаться с вопросами.

  • Согласен 1
Ссылка на комментарий

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

 

Чтобы заспавнить нашу дверь, надо зайти в spawn_element\physics\door

 

После спавна, нажимаем на наш объект и жмем Enter в Custom Date пишем:

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

 

[collide]
ignore_static
ignore_ragdoll

[logic]
cfg = configs\scripts\chast_voinay\cha_door_kpp.ltx    - здесь указан путь до нашей логики, меняем ее на нашу. ОБЯЗАТЕЛЬНО С  LTX !!

 

 

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

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

 

[logic]
active = ph_door@closed - Активная секция

[ph_door@closed] - название секции
closed = true - подтверждает что дверь будет закрыта
locked = false  - отвергает что дверь будет открыта
on_use = ph_door@open - после конца этой секции активирует секцию под именем ph_door@open
snd_open_start = trader_door_open_start - это знать не обязательно
snd_close_start = trader_door_close_start - это знать не обязательно
snd_close_stop = trader_door_close_stop - это знать не обязательно

[ph_door@open]
closed = false - все тоже самое
locked = false - все тоже самое
on_game_timer = 50 | ph_door@closed - через 5 секунд логика перейдет на секцию ph_door@closed
snd_open_start = trader_door_open_start - это знать не обязательно
snd_close_start = trader_door_close_start - это знать не обязательно
snd_close_stop = trader_door_close_stop - это знать не обязательно

 

 

Сохраняем, компилируем спавн и идем проверять в игре.

 

 

Изменено пользователем HellRatz
  • Сочувствую 1
Ссылка на комментарий

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

 

https://pastebin.com/HZmycLBW

 

Изменено пользователем HellRatz
Убрал ахтунг
Добавлено  HellRatz,

Не знаю что это за чудо-юдо было на пол страницы, перетащил это все на пастебин. Остальные посты не понятно к чему - снес.

Ссылка на комментарий

Внесу свою толику. Карты локаций из СГМ 2.2

Смарты на картах пронумерованы, описание и координаты записаны в текстовиках. Может пригодиться для модов на основе СГМ или чистой ЗП (смарты на локациях из ЗП точно не изменялись) для настройки телепортов и заселения локаций. 

Скачать

  • Полезно 1
Ссылка на комментарий
В 23.07.2013 в 11:12, Сталкер Лом сказал:

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

Скажите пожалуйста, ув. Сталкер Лом, появилось ли какое-либо решение данной проблемы (добавление gui поверх предыдущего в пда) до сегодняшнего дня? Если да, был бы очень признателен узнать об этом подробнее. А также хотелось бы узнать, что именно было изменено проектом xray extentions в исходном коде игры. Заранее спасибо.

Ссылка на комментарий
17 часов назад, Den “Angry Wolf” Koslov сказал:

...хотелось бы узнать, что именно было изменено проектом xray extentions в исходном коде игры

В дополнении к тому, что я вам черканул в ЛС :)
Сам я правку не смотрел, но, предполагаю, что в движке подправились данные о количестве правок и, по большому счёту, всё. Эти правки очень старые. Может быть, сегодня уже есть что-то посерьёзнее увеличения количества (а не функционала) вкладок, но я не знаю - давно уже этой темой не интересовался.

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

Ссылка на комментарий

Внесу свою скромную лепту в пользу новисам и не только:)

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

Наверное многие из вас знают, что в ваниле На свалке и Арм. складах сталкеры часто помирали в кострах, в связи с чем такие песы как бес, волк и юрик покидали нас:(

Так вот, чтобы этого не было, надо сделать следующее:

1. Распаковать all.spawm или открыть уровень в level editor-e

2. Найти среди спавн объектов space_restrictor-ы с именем camp_fire_номер.

3. Смотрим и видим (restrictor_type = 3)!!! В чём суть спрсите вы?. А вот в чём - в игре есть несколько типов рестрикторов и всё они имеют разную функцию

(инфа взята с сайта http://stalkerin.gameru.net.

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

Чтобы не потерялось пишу сюда типы рестрикторов. Тип рекстриктора можно указать при спавне в переменной restrictor_type



restrictor_type = 0      ;eDefaultRestrictorTypeOut
restrictor_type = 3      :eRestrictorTypeNone

Эти два типа - простые рестрикторы. В чем их отличие - непонятно. "restrictor_type = 0" - в зоне этого рестриктора нпс не подчиняются логике просто будут стоять на месте, лучше этот тип вообще не использовать



restrictor_type = 1      ;eDefaultRestrictorTypeOut
restrictor_type = 5      ;eRestrictorTypeOut

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



restrictor_type = 2      ;eDefaultRestrictorTypeIn
restrictor_type = 4      ;eRestrictorTypeIn

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

И помните IN и OUT рестрикторы (типы 1,2,4,5) имеют смысл только для НПС

Как вы уже прочли, костер накрыт не тем рестриктором. 

4.Меняем restrictor_type с  3 на 2 (или в редакторе ставим IN defoult resrtictor). 

5. Пакуем спавн и вуаля! - стакеры в костре не мрут!!!!:D

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

Всем удачи в создании лагерей и посиделок у костра;)

 

Добавлено  HellRatz,

А почему бы просто не убрать урон от костра в конфиге в одной строке (ну или паре) ? :)

  • Нравится 1
  • Полезно 2

Лучше сделать мод с 0, чем пытаться залатать багованный.

DarkSnowder.gif

Ссылка на комментарий
Скрытый текст

Всем привет!

В этой теме есть замечательный скрипт на пост-эффект при критическом попадании за авторством АМК Team.

 

У этого скрипта есть один недостаток: проблема в том, что скрипт порой срабатывает с запозданием где-то в полсекунды (или около того) после получения хита, смотрится ужасно. Я думаю (поправьте если ошибаюсь), это из-за того, что скрипт повешен на апдейт и скорость срабатывания зависит от частоты апдейта. Чтобы решить эту проблему без какой-нибудь скриптовой чёрной магии, придётся править движок. Спокойно, никаких тут разборов языка C++ не будет, обойдёмся без взрыва мозга и воспользуемся самым доступным вариантом - X-Ray extensions. Скачать последнюю сборку от @НаноБот можно отсюда. Конкретно нам нужен коллбэк на хит актора, в чистом движке ТЧ его нет, зато он есть в XRay ext и в большинстве сборок седьмого патча. С помощью xray ext пропатчиваем (мудрить с коррекшен листом не обязательно, достаточно пропатчить на дефолтных настройках) файл xrGame.dll (он уже есть в 230й сборке), кидаем dllку в папку bin в корне игры и подтверждаем замену (внимание! Сохраните резервную копию чистой dllки где-нибудь во избежание возможных проблем).

Итак, мы имеем пропатченный двигло, но этого мало. Прежде чем использовать коллбэк, его ещё нужно активировать. Для этого нам понадобится файл bind_stalker.script из распакованных ресурсов игры. Открываем его тестовым редактором и среди всего безобразия ищим вот такую строчку:

function actor_binder:reinit()

Ниже видим такие строки:

self.object:set_callback(callback.inventory_info, self.info_callback, self)
self.object:set_callback(callback.article_info, self.article_callback, self)
self.object:set_callback(callback.on_item_take, self.on_item_take, self)
self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
--self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
self.object:set_callback(callback.task_state, self.task_callback, self)
--self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)

Это доступные коллбэки.

В самом низу этого списка пишем

self.object:set_callback(callback.hit, self.actor_hit_callback, self)           -- хит актору

это новоиспечённый коллбэк.

 

Далее ищем:

function actor_binder:net_destroy()

И ниже:

self.object:set_callback(callback.inventory_info, nil)
    self.object:set_callback(callback.article_info, nil)
    self.object:set_callback(callback.on_item_take, nil)
    self.object:set_callback(callback.on_item_drop, nil)
    --self.object:set_callback(callback.actor_sleep, nil)
    self.object:set_callback(callback.task_state, nil)
    self.object:set_callback(callback.level_border_enter, nil)
    self.object:set_callback(callback.level_border_exit, nil)
    self.object:set_callback(callback.take_item_from_box, nil)

И в самом низу этого списка дописываем:

self.object:set_callback(callback.hit, nil)

Сие есть отрегистрация коллбэка.

 

Далее где-нибудь среди функций, например под:

function actor_binder:take_item_from_box(box, item)
    local story_id = box:story_id()
    if story_id == nil then
        return
    end
  ...
end

Пишем как-то так:

function actor_binder:actor_hit_callback(obj)
    effect_blood.wounded_pp_update() -- это файл скрипта пост- эффекта и функция пост-эффекта в нём
end

 

Ииии всё!

Теперь, когда мы повесили скрипт на коллбэк хита автору, он:

А. Не будет постоянно висеть на апдейте а срабатывать только когда ГГ получает по щам.

Б. Будет срабатывать мгновенно при крит.хите.

Приятной игры.

(Принцип активации коллбэка подсмотрен в ОГСЕ)

 

  • Полезно 3

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

Ссылка на комментарий

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

Вот: https://yadi.sk/d/OzLu-NeoeAFaY

Добавлено  Murarius,

Готово.

  • Спасибо 1
  • Полезно 1

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

Ссылка на комментарий

Товарищи - скриптеры, помогите разобраться со скриптом.

В проблема с одним из примеров от @amik,

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

local obj = alife():story_object( 6 ) -- 6 - сид Волка

local obj_id = obj.id

function add_spot_on_map(obj_id,type,text)

    if obj_id then        

       if not text then text = "no_text" end

        level.map_add_object_spot_ser(obj_id, type, text)

    end

end

Вызываем:

function add_spot_on_map2(obj_id,type,text)    

 имя_файла.add_spot_on_map(obj.id,"green_location","Текст")

end

Метку можно убрать вот так:

local obj = alife():story_object( 6 )

local obj_id = obj.id

function remove_spot_from_map(obj_id,type)

    if obj_id and level.map_has_object_spot(obj_id, type) ~= 0 then        

       level.map_remove_object_spot(obj_id, type)

    end

end

эту вызывать:

function remove_spot()    

 this.remove_spot_from_map(obj.id,"green_location")

end

Во первых в функциях вызова допущена ошибочка - аргумент obj.id точку нужно заменить на видимый пробел, иначе будет вылет с руганью на index global 'obj'.

Во вторых, скрипт работает но метку вешает по чему-то на гг, а не на того на кого хочу повесить - на Толика, в чём причина?

Рассматриваю код уже пол часа и не понимаю в чём причина, функции простые как автомат Калашникова, всё вроде правильно...:unknw::kez_12:

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

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

Ссылка на комментарий

@UriZzz, вот так попробуй

 

function add_spot()
  local sid = 6
  local obj = alife():story_object(sid)
  if obj then
    level.map_add_object_spot_ser(obj.id, "blue_location", obj:name())
  else
    get_console():execute("load ~~~ object with story_id "..tostring(sid).."not found")
  end
end
--------------------
function remove_spot()
  local sid = 6
  local obj = alife():story_object(sid)
  if obj then
    level.map_remove_object_spot(obj.id, "blue_location")
  else
    get_console():execute("load ~~~ object with story_id "..tostring(sid).."not found")
  end
 end

Вместо sid пишешь нужный story_id.

Изменено пользователем naxac
  • Спасибо 1
  • Нравится 1
  • Полезно 1

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

naxac.gif

Ссылка на комментарий
Spoiler

Этот код:

-- проверяндус есть ли у нас жертва обстоятельств
	if victim ~= nil then

		local whocls = get_clsid(who)

		monster_classes = {
			[clsid.bloodsucker_s] 			= "неудачно подошёл к кровососу",
			[clsid.boar_s] 					= "неудачная охота на кабана",
			[clsid.dog_s] 					= "загрызён собакой",
			[clsid.flesh_s] 				= "неудачная охота на плоть",
			[clsid.pseudodog_s] 			= "загрызён псевдособакой",
			[clsid.burer_s] 				= "нарвался на бюрера",
			[clsid.cat_s] 					= "кошка перебежала дорогу",
			[clsid.chimera_s] 				= "нарвался на химеру",
			[clsid.controller_s] 			= "стал зомби и умер",
			[clsid.poltergeist_s] 			= "полтергейст",
			[clsid.gigant_s] 				= "растоптал псевдогигант",
			[clsid.zombie_s] 				= "попрощался с мозгами",
			[clsid.snork_s] 				= "неудачно нашёл снорка",
			[clsid.tushkano_s] 				= "умер от стаи тушканов",
			[clsid.psy_dog_s] 				= "загрызён пси собакой",
			[clsid.psy_dog_phantom_s] 		= "загрызён пси собакой"
		}

		local death_komment = {
	        "Ещё один...",
	        "Мдя, ни дня без этого.",
	        "Одним больше, одним меньше...",
	        "Все там будем",
	        "Помянуть надо бы...",
	        "Зона тебе пухом.",
			"Был пацан, не стало пацана"
	    }

	    --
	    --
		-- victim_name - имя жертвы
		-- killer_name - имя убивайца
		-- killer_comm - групировка убивайца
		-- victim_comm - групировка жертвы
		--
		--

	 	local m_game_vertex = who:game_vertex_id()
		local lvert = game_graph():vertex(m_game_vertex)
		local lid = lvert:level_id()
		local mlevel = alife():level_name(lid)
		local m_s_level = mlevel
		local victim_name  = victim:character_name()
		local killer_name  = who:character_name()
		local victim_comm = victim:character_community()
		local killer_comm = nil
		if IsStalker(who) then
			if killer_name == victim_name then
				killer_name = "аномалия"
				killer_comm = "monster"
			else
				killer_comm = who:character_community()
				-- Чтобы показывать имя, кто убил удали строку ниже
				killer_name = "пулевое ранение"
			end
		else
			killer_comm = "monster"
			if whocls ~= nil then
				killer_name = monster_classes[whocls]
			end
		end
		 
		if killer_comm ~= nil then
			if killer_name == nil then
				-- это если имя убийцы неизвестно или мутантик какой неизвестен
				killer_name = "%c[230,255,0,0][DATA DELETED]"
			end
		    local m_text_kill_string="Умер сталкер "..victim_name.."\\nЛокация: "..game.translate_string(m_s_level).."\\nПричина смерти: "..killer_name
			local news_text = "%c[230,255,128,64]"..m_text_kill_string
			local news_caption = game.translate_string("DeadMans")
		    local texture = "ui_iconsTotal_weapons"
		 	local shans = math.random(1,100)
		    db.actor:give_game_news(news_caption, news_text, texture, 2*1000, 2*1000)
			if shans > 70 then
				local dead_news = death_komment[math.random(table.getn(death_komment))]
	 	    	db.actor:give_game_news(game.translate_string("Анонимное сообщение"), dead_news, "ui_iconsTotal_grouping", 5*1000, 5*1000)
	 		end
		end
	end

вставляем в файл gamedata\scripts\xr_motivator.script после строки function motivator_binder:death_callback(victim, who)

 

Примечание: в данном виде функция предназначена для старших платформ: ЧН, ЗП. Для работы на платформе ТЧ участок кода, в котором производится выдача новостных сообщений, следует привести к следующему виду:

    if killer_comm ~= nil then
...
        local task_texture, task_rect = get_texture_info("ui_iconsTotal_weapons")
        local news_text = news_caption .. "%c[230,255,128,64]" .. m_text_kill_string
        db.actor:give_game_news(news_text, task_texture, task_rect, 5*1000, 5*1000)
        if shans > 70 then
                local task_texture, task_rect = get_texture_info("ui_iconsTotal_grouping")
                local dead_news = dead_caption .. death_komment[math.random(table.getn(death_komment))]
                db.actor:give_game_news(dead_news, task_texture, task_rect, 5*1000, 5*1000)
        end
    end

Где: news_caption = '...', dead_caption = '...' - соответствующие строковые заголовки для типов сообщений (кто погиб и комментарии).

 

  • Полезно 2
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   1 пользователь

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