0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Скрипты для S.T.A.L.K.E.R.: Shadow of Chernobyl

S.T.A.L.K.E.R.: Shadow of Chernobyl → Файлы

S.T.A.L.K.E.R.: Shadow of Chernobyl — постапокалиптический шутер с ролевыми элементами и видом от первого лица. События разворачиваются в. Подробнее

  • Открыть страницу игры в Steam
  • Об игре
  • Скриншоты
  • Арт
  • Купить 19 руб
  • Отзывы
  • Требования
  • Дополнения
  • Форум
  • Файлы
  • Читы
  • Новости
  • Похожие
  • Даты
  • Статьи

Сборка скриптов для ТЧ — финальная версия S.T.A.L.K.E.R.: Shadow of Chernobyl

Финальное обновление мода на скрипты

Новые

  • Заряд С4 и пульт к нему.
  • Новые гранаты: Заря-2 и ЭГШ-1
  • Теперь можно ставить мины
  • Возращены детекторы аномалий
  • Умений у мутантов стало ещё больше
  • Добавлен выброс, который случается периодически
  • Alife спавн Нпс и монстров(в том числе вырезанных).(ставить по желанию)
  • Нейтралитеты к любым группировкам у осведомителя, за дорого
  • Пси-выброс на янтаре
  • Эффект критического ранения
  • Не бесконечные болты
  • Фриплей после прохождения игры
  • Худ маски для скафандров, бронекостюмах и экзоскелетов
  • Вывод сообщения о маленьком кол-ве оставшегося ХП
  • Появились проводники
  • EAX mod (появилось эхо в некоторых местах)
  • На худе показывается сколько осталось медикаментов и т.д.

+ бонус там маленький есть (но я не скажу какой)

Старые

  • Высокий интелект у НПС
  • Real Bags 1.2 (Теперь появились рюкзаки, с помощью которых можно носить вещи в рюкзаке)
  • Пауза при загрузке сохранения как в ЗП
  • Подрыв оружия при износе
  • Снятие денег с трупов
  • Ремонт снаряжения у торговцев
  • Звуки использования медикаментов и еды
  • Сон через спальный мешок
  • Динамические новости
  • Рандомные тайники
  • Сообщение о смерти сталкера
  • Охранник сидоровича (заспавнен через скрипты)
  • Наказание за вороство (как из билда 2588)
  • Выпадение брони с трупов
  • Лечение раненых врагов
  • Работающая арена после получения звания чемпиона
  • Изменена погода (каждый погодный цикл сам генерируется как в реальной жизни)
  • Динамическая музыка (по желанию ставить, отдельная папка будет)
  • Война группировок (НПС умеют захватывать точки)
  • Гравипушка (лежит в Х-18 в трупе Калугина)
  • Активация артефактов
  • Рождение артефактов
  • Бартер у торговцев (сам сделал)
  • Улучшенное поведение у мутантов
  • Спавнер (тоже по желанию)

Меню видео у костра на ТЧ

Анимированное меню на ТЧ

Основа для сюжетных модов

Название: Основа для сюжетных модов

Плащ С Противогазом

Новая Броня — Плащ с Противогазом

B.A.O.N.I.M (ver.3.0)

Название: B.A.O.N.I.M (ver.3.0)

B.A.O.N.I.M (ver.3.0) — сборка состоящая из различных геймплейных нововведений и фич.

Обреченный Город — Remake (Билд)

Название: Обреченный Город — Remake (Билд)

Разработчик: Global Zone Mod Team

Обреченный Город — Remake — модификация в статусе Билд версии. Сделаны две локации: «Погост» и улица «Красивая». Адаптирован графический и оружейный пак. Разработка на данный момент приостановлена.

OGSM + Оружейный пак из NLC 7

Название: OGSM + Оружейный пак из NLC 7

Автор OGSM: DEXXX

Адаптация оружия: _professor_Sakharov_

OGSM + Оружейный пак из NLC 7 — собранная версия модификации OGSM v2.4.3 с адаптированной версией оружейного пака из NLC 7.

Old Good Stalker + Спавнер

Название: Old Good Stalker + Спавнер

Old Good Stalker — попытка возвращения к истокам игры, времен 2003-2004 года. Добавлены различные правки, включая текстуры, конфигурационные файлы, модели и прочие геймплейные фичи, направленные на восстановление атмосферы тех лет. Из основного: Cut-XRay, Shadows Of Oblivions, New-Weapons, New-Armor. Новые локации: Prom Zona, Swamps, Dark Valley, Dark Holley, Dead City, Generators.

Zombie-shooter mod (ver.1.5)

Название: Zombie-shooter mod (ver.1.5)

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

OGSM v2.4.3 Gold Edition + Спавнер

Название: OGSM v2.4.3 Gold Edition + Спавнер

Скрипты для S.T.A.L.K.E.R.: Shadow of Chernobyl

1. Все файлы скрипты находятся в папке gamedatascrips .
2. Файл скрипта — это текстовый файл имеющий расширение .script .
3. В С.Т.А.Л.К.Е.Р используется немного изменённый скриптовый язык Lua 5.1 .
4. Для редактирования скриптов я советую NotePad c++, данная программа имеет подсветку синтаксиса для многих языков, в том числе и для Lua. Чтобы активировать подсветку нажмите клините Стиль — Lua .
5. Чтобы закоментировать строку (код игры не будет ёё читать) , необходимо перед строкой поставить .
Если вы хотите закоментировать кусок (много строк) то —[[ . ]] , ваш текст будет закоментирован.

Начнём уроки.
1)Создадим свой my.scripts и поместим его в папку scrips . Откроем с помощью НотПада и настроим подсветку.
2) Внутри файла-скрипта должны содержаться только КОД скрипта и ваши ЗАКОМЕНТИРОВАННЫе пометки. Если будет лишний текст, т.е какие-то знаки и слова, то будет вылет на этот скрипт. Так как код игры полностью собирает весь скрипт в стек и выбирает только то, что вы задали, но если будет мусор, то игра не воспримет код.
3)Архитектур. Для создания функций нужны лишь знания синтаксиса и игровые методы и глобальные функции(которые записаны в движке) можете почитать lua_help.scrip , но я советую посетить тему на АМК . Там собраны все методы, классы и полное их описание.
4) Функция. Это то, что будет делать игра.

Любая функция начинается со слов

function my_function()
.
end

И заканчивается тегом end . Этот тег означает конец функции, сравнения, он закрывающий и обязателен. Я советую при составлении функций , чтобы не забыть чего-нибудь, писать скелет извне, т.е сначала функция, потом закрывающий тег, и по нарастающей во внутрь.
() -Обязательный элемент. Позже расскажу как передавать переменные через этот тег.Между окончание функции и этим тегом ПРОБЕЛА НЕТ.

Обращаю внимание, что все функции вызываются из других скриптов. Допустим нам из одного скрипта, нужно вызвать(запустить функцию в другом) для этого мы пишем
название скрипта . название функции в скрипте (парметр если есть)
my.my_function()

Чтобы объявить какой-либо элемент для функции локальным используется тег local
local helth = db.actor.helth
Т.е мы расшифровали helth , и показали , что это значение db.actor.helth.
Если вы хотите вставить слово или свой текст нужно заключить слово в кавычки.
local helth = «Уровень здоровья.»
Если вы хотите вставить слово с кавычками или свой текст нужно сделать так:
local helth = «»Уровень здоровья.»»
Чтобы объявить глобальну нужно всего лишь сделать так
helth = db.actor.helth

Глобальные можно объявлять вначале скрипта и она будет сохранятся в коде, в памяти процесса (если я правильно понял)
Переменная объявляется только перед функцией и логическими выражениями, где используется переменная и её использует только та функция, перед которой она объявляется (На пальцах перед строкой с вашей функцией). Т.е елси функция простая без логических решений(if, elseif, for и.т.д) То ставим перед функцией, если же есть переменная, которая находится в теле такого логического решения, то она ставится строго перед этим логическим решением!

local helth = db.actor.helth
function my_function()
.
end

Чтобы сосчитать значение переменной из другого скрипта достаточно в другом скрипте сделать так:
text=«Я иду гулять по бродвею»
Теперь в нашем скрипте вызываем этот параметр
local pisanina = название скрипта . text
() — При таком обращении этот тег НЕ СТАВИТСЯ !

if . then
.
end
Перевожу Если что-то то
конец тега .
Пример

if db.actor.psy==0.5 then
db.actor:kill(db.actor)
end
Если пси-здоровье ГГ — половина, то мы его убиваем.
Полная функция:

function my_function()
if db.actor.psy==0.5 then
db.actor:kill(db.actor)
end
end

[/color]
local acter = db.actor
function my_function()
local psy_zdorovie = acter.psy
if psy_zdorovie==0.5 then
acter:kill(acter)
end
end
Что я сделал?
Обозначил кусок db.actor локальной acter .
А acter.psy (db.actor)+.psy равносильно db.actor.psy

local psy_zdorovie = acter .psy
Нам нужна эта acter перменная, и мы ДОЛЖНЫ ОБЪЯВИТЬ её перед переменной
local psy_zdorovie = acter .psy .
Мы ее и объявили local acter = db.actor .
Думаю смысл понятен?

if . then
1 действие.
else
2 действие.
end

Перевод: Если подходит условие то
1 действие
иначе (т.е условие не выполняется)
2 действие
конец тега
Пример:

function my_function()
if db.actor.psy==0.5 then
db.actor:kill(db.actor)
else
db.actor.give_info_portion(«info»)
end
end

Если пси-здоровье актора равно половине, то мы его убиваем, если же значение другое(любое) , то даем ему инфопоршень.

Допустим нам нужно проверить несколько условий:
Чтобы они все выполнялись!

if (db.actor) and (db.actor.helth==1) and (db.actor.psy ==0.5) then
действие
end
Функция сработает если есть актор и здоровье актора полное и псиздоровье половина .

Тег and — означает И . Если один из элементов не выполняется, то функция не срабатывает. Кстати — это ленивый метод, как писал Kamikaze , если не выполняется первый элемент, то другие — уже не просчитывааются. Т.е. не загнружается процесс.

Если подходит хоть один элемент.
if (db.actor) or (db.actor.helth==1) or (db.actor.psy ==0.5) then
действие
end

Тег or обозначает ИЛИ . Или один, или другой. Функция сработает при условии соответствия хоть одного элемента. Так же ленивый метод. Проверяет до получения утвердительного решения, потом проверка не идет.

Данный метод заменяет перебор через таблицу. Отличается простотой и потерей производительности.

if . then
самое основное действие
elseif . then
действие 1
elseif . then
действие 2
elseif . then
действие 3
elseif . then
действие 4
elseif . then
действие 5
end
Здесь представлен перебор elseif иначе если , т.е не подходит первый вариант, мы проверяем второй и так по цепочке , до первого подходящего(где выполняется заданное условие), если же ни одно не подойдет, то ничего не произойдет. Если бы мы просто в йункции написали кучу

function perebor()
if . then
действие
end
if . then
действие
end
if . then
действие
end
if . then
действие
end
if . then
действие
end
if . then
действие
end
end

Тон ничего хорошего не вышло бы. Так как проверялись бы все функции. А в первом варианте до первого попавшегося.

Пременная нил указывает, что объекта , условия, да чего угодно НЕТ, его не существует.
ВСЕГДА проверяйте некоторые объекты на nil
Во первых это актор .
Можно написать

Но правильнее и эстетичнее, сразу писать так.

if (db.actor) then
.
end

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

if имя скрипта then
.
end

if my then
.
end

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

math.random (1,100)
Данная функция рандомно выберет число от 1 до 100.
Сначала ставится наименьшее, потом наибольшее.
Если ставить десятичные , допустим (0.0005, 1), то перебуеруться ВСЕ значения, т.е числа с несколькими знаками, ТАК ДЕЛАТЬ НЕ НУЖНО. вы перегрузите некоторые элементы кода.
Использование

if math.random(0,1) then
действие
end
Если выбранное число меньше 1, то срабатывает функция.

if math.random(0,1) then
действие
else
.
end
Добвавляется другое действие.
Советую брать целые числа от 1 до 10 для создания процентного срабатывания, но лучше 0 и 1.

Текстовый.
Допустим вы отправляете сообщение и хотите выбрать рандомный текст.
1) Создается таблица с вашими переменными (Это может быть и секция для спавна, и слово, и любая другая переменная)

Так создается примитивная таблица, каждый элмент записывается в кавычках и отделяется отдельно.
Далее, обозначаем за переменную которая нам нужна. Допустим в функции вам нужна пременная text.
Мы и пишем .
local text = my frazi [#( my frazi )]
И пр и срабатывании функции, обращении к переменной text, выберается рандомная переменная из таблицы
my frazi .

for i =1, 5000 do
действие
end

Это цикл, который прокрутнет ваше действие 5000 раз. Переменная i любая буква, число 5000 обозначает количество циклов(сколько раз пройдет ваше действие).

Допустим мы сделали такую функцию

— удаляем объект из игры(Взято из АМК )

function remove( remove_item )
if remove_item

=nil then
alife():release(alife():object(remove_item:id()), true)
return true
end
return false
end
remove_item — это наш параметр, в данном случае это секция объекта, которую нужно удалить.
(немного по секция , если это уникальный объект, то это то,ч то в его конфиге, если нет, то нужно искать другим методом)
Нам нужно удалить уникального НПС vasek
Если функция находится в скрипте, где мы хотим удалить объект, то пишем
remove ( vasek )
Если в другом скрипте, то
имя скрипта .remove( vasek )
Вот такой пример передачи параметра, передавать можно что угодно и как угодно. Было бы воображение.

Допустим, идет проверка и если она оканчивается удачно, то функция должна вернуть одну переменную, если нет, то другую.

function my()
if proverka () == true then
.
end
end

function proverka ()
if db.actor then
return true
else
return false
end

Т.е мы хотим проверить наличие актора(можно что угодно). Создаем функцию proverka , она работает так, если актор есть — возвращает( return ) одну переменную, в данном случае true (Может быть любая другая) , если проверка не проходит, то возвращается false , а нашей первой my() стоит условие на то, что проверка вернет true
if proverka () == true then
Вот так, если вернет, то сработает первая функция.

Функции вызваются из других скриптов, нужно лишь найти место. Если она вызывается постоянно. То нужно пихать в колбэк на апдет в bind_stalker.script

function actor_binder:update(delta)
object_binder.update(self, delta)

if string.find(command_line(), «-designer») then
return
end

if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
jump_level.try_to_jump()
self.already_jumped = true
return
end

— Вызов апдейта переноса игрока проводником
if travel_func

— DEBUG slowdown
—slowdown.update()
local time = time_global()
game_stats.update (delta, self.object)
— апдейт погоды
self.weather_manager:update()

— Обновление отключения ввода с клавиатуры.
if self.st.disable_input_time

= nil and
game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle
then
level.enable_input()
self.st.disable_input_time = nil
end

— Апдейт прятание оружия игрока во время диалога
if self.object:is_talking() then
if self.weapon_hide_in_dialog == false then
self.object:hide_weapon()
printf(«hiding weapon. «)
self.weapon_hide_in_dialog = true
end
else
if self.weapon_hide_in_dialog == true then
printf(«restoring weapon. «)
self.object:restore_weapon()
self.weapon_hide_in_dialog = false
end
end
— Апдейт прятание оружия игрока в зоне sr_no_weapon
if check_for_weapon_hide_by_zones() == true then
if self.weapon_hide == false then
printf(«hiding weapon. «)
self.object:hide_weapon()
self.weapon_hide = true
end
else
if self.weapon_hide == true then
printf(«restoring weapon. «)
self.object:restore_weapon()
self.weapon_hide = false
end
end

— обновление пси-антенны
if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:update(delta)
end
—[[
—‘ Вывод сообщения о большой радиации
if self.object.radiation >= 0.7 then
local hud = get_hud()
local custom_static = hud:GetCustomStatic(«cs_radiation_danger»)
if custom_static == nil then
hud:AddCustomStatic(«cs_radiation_danger», true)
hud:GetCustomStatic(«cs_radiation_danger»):wnd():TextControl():SetTextST(«st_radiation_danger»)
end
else
local hud = get_hud()
local custom_static = hud:GetCustomStatic(«cs_radiation_danger»)
if custom_static

if self.bCheckStart then
printf(«SET DEFAULT INFOS»)
if not has_alife_info(«global_dialogs») then
self.object:give_info_portion(«global_dialogs»)
end
if not has_alife_info(«level_changer_icons») then
self.object:give_info_portion(«level_changer_icons»)
end
self.bCheckStart = false

—if self.actor_weapon_on_start == true then
—db.actor:activate_slot(3)
—self.actor_weapon_on_start = false
—end
end
—device().precache_frame== 0 and
if not self.loaded_slot_applied then
self.object:activate_slot(self.loaded_active_slot)
self.loaded_slot_applied = true
end
xr_s.on_actor_update(delta)

= true) then
self.surge_manager:initialize()
self.f_surge_manager_loaded = true
end
if(self.surge_manager.levels_respawn[level.name()]) then
self.surge_manager:respawn_artefacts_and_replace_anomaly_zone()
end
self.surge_manager:update()
end
— Апдейт доступности для симуляции.
simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())

if not self.loaded then
get_console():execute(«dump_infos»)
self.loaded = true
end
treasure_manager.get_treasure_manager():update()

if not(primary_objects_filled) then
pda.fill_primary_objects()
primary_objects_filled = true
end
pda.fill_sleep_zones()
—СЮДА в САМЫЙ КОНЕЦ
end

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

В диалогах можно вызывать через тег (без () )

Stalker Cheat Item Menu SoC


Cheat Item Menu v2 представлен как мод которой дополняет оригинальную версию игры Сталкер Тени Чернобыля, дополнительным чит (спавн) меню. С помощью данного меню игроку представляется возможность прокачать своего героя с самого начала игры, вооружить его и при необходимости получить любые квестовые предметы имеющиеся в игре. Вторая версия мода Чит меню, имеет в своем составе новые возможности, которые упрощают использование мода, подробнее о них пойдет речь далее.

Одной из полезных и удобных возможностей Cheat Item Menu является функция поиска которая предполагает поддержку и переключение двух раскладок клавиатуры русскую и английскую. Не забывайте вводимые для поиска предметы должны быть написаны с соблюдением правил орфографии. Меню оснащено прокруткой списка предметов в каждой вкладке. Имеет систему сообщений о неправильных действиях игрока, это будет выглядеть в виде сообщений при совершении ошибки при вводе слов в строку поиска и т.д.
При нажатии на любой предмет из списка над списком будет представлен внешний вид предмета в виде иконки, а справа его описание.

Особенности мода и его функционал.
Спавн меню имеет в своем составе пять вкладок (раздела):

  • Оружие
  • Амуниция — в этом вкладке игроку будет предложено выбрать различные боеприпасы к различным видам вооружения.
  • Костюмы — здесь можно выбрать любой костюм начиная с куртки и заканчивая экзоскелетом.
  • Артефакты.
  • Предметы — этот раздел обладает возможностью заспавнить любой квестовый предмет и документы которые необходимо добыть Главному героя по сюжету.

Установка чит мода:
Разархивируйте скачанный архив.
Полученную папку gamedata, скопируйте в папку с установленной игрой Сталкер Тени Чернобыля версии 1.0004.

Как пользоваться чит меню на сталкер тени чернобыля.
Для того чтобы вызвать меню спавна предметов, необходимо во время игры нажать на клавиатуре клавишу «ESC», тем самым выйдя в главное меню игры. Далее нажимаем клавишу «F1», после нажатия на которую появиться спавн меню.

Есть возможность адаптации мода Cheat Item Menu с другими модификациями инструкции по адаптации есть в архиве.

Название: Cheat Item Menu / Чит меню
Автор: naxac’a
Категория: Читы, коды Сталкер Тени Чернобыля
Требуемая игра: Сталкер Тени Чернобыля v1.0004
Версия мода: V2
Раздел: Тренеры Сталкер
Размер: 741 Кб

Скачать Чит меню на Сталкер Тени Чернобыля

Скрипты для S.T.A.L.K.E.R.: Shadow of Chernobyl

1. Привязка сталкера к конкретной позиции ( к vertex_id)

xr_position.setPosition(obj, position)
obj – обжект сталкера, обычно это self.object
position – vertex_id ноды, к которой он будет привязан.
Если вам нужно, чтобы в каком то экшине он был в данной позиции, то нужно сделать:
action:add_precondition (world_property(properties[«position»], true))
где properties[«position»] = xr_evaluators_id.position

2. Смена положений тела

object – объект, которому нужно изменить положение тела
new – id нового положения тела
Чтобы во время смены положений избежать действий ваших экшнов, нужно сделать следующее
action:add_precondition (world_property(properties[«state_end»], true))
где properties[«state_end»] = xr_evaluators_id.state_change

— ОПИСАНИЕ ИДЕНТИФИКАТОРОВ ПОЗИЦИЙ:
Xr_state.stand
Xr_state.sit_wait
Xr_state.sleep

3. Рандомное проигрывание звуков

Xr_sound.set_sound(npc, sound, now)
— Пример конструктора, описывающего звуки

— self.sound = — begin = nil, — служебное поле
— maxidle = 10, — максимальное время между звуками
— sumidle = 10, — надбавочное время, добавляется к рандомно выбранному от 1 до максимального.
— rnd = 100, — вероятность, с которой будет проигран звук, если пришло время
— lastsound = nil, — служебное поле
— sounds = < >


— Проигрыш саундов (By Stohe)
— npc — object который будет играть звук
— sound — конструктр звуков, см выше
— now — если звук отыграть надо прямо сейчас

4. Проверка, находится ли объект в онлайне

is_object_online (object_id)
передавать ID объекта

5. Проверка, является ли данный итем оружием

isWeapon(id)
передавать cls_id объекта

6. Настройка реакций

Реакции можно настраивать через кастом дату и в рантайме.
В кастом дате:
[reactions]
rule_1 = rule
rule_2 = rule
и так далее

В рантайме можно добавлять и удалять правила
xr_reactions.add_rule(obj, rule)
xr_reactions.remove_rule(obj, rule)
где obj – объект, которому вы добавляете правило
rule – правило.

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

Список поддерживаемых правил:
«no_item” — игнорирует все вещи
«no_check” — никогда не ходить проверять источник, только смотрит на него
«ignore” – игнорирует все раздражители
«silence” – не издавать звук (не говорить реплики)

7. Время суток в мс
function day_time()

8. Время суток в часах
function local_hours()

9. Парсит строку вида «ааа, ббб, ввв. » в таблицу < "ааа", "ббб", "ввв", . >
function parse_names( s )

10. Взвешенная случайная выборка из таблицы вида < obj1 = weight1, obj2 = weight2, . >
Возвращает один из obj. Веса >= 0
function random_choice_weighted( a )

11. Звуковая система
Живет в xr_sound.script. Для инициализации нужно вызвать из мотиватора функцию load_sounds с параметром game_object:
xr_sounds.load_sounds (self.object).
Использование:
function play_sound (obj, delay, theme, sub_theme, phrase_set, sub_phrase)
где obj – NPC, delay – задержка перед воспроизведением (время в миллисекундах), theme – тема (строка), sub_theme – подтема (если несколько),
phrase_set – набор фраз в подтеме, sub_phrase – номер фразы в наборе.
Первые 3 параметра обязательны, остальные нет. Для необязательных параметров
Будут выбраны рандомные значения.

function create_sound_constructor (theme, sub_theme) – возвращает sound constructor. Параметры обязательны и соответствуют тому, что изложено выше.
Пример конструктора, описывающего звуки
self.sound = <
idle = 0, — служебное поле
begin = nil, — служебное поле
maxidle = 10, — максимальное время между звуками
sumidle = 10, — надбавочное время, добавляется к рандомно выбранному от 1 до максимального.
— rnd = 100, — вероятность, с которой будет проигран звук, если пришло время
— lastsound = nil, — служебное поле
— sounds = < >

Добавление своих тем.
Тема – ассоциативный массив (таблица) в которой хранятся таблицы подтем. Подтема – таблица, в которой хранится идентификатор загруженных звуков и их количество. Пример:
themes[«commander_radio»] =
<
—speech1
<
sounds_base,
obj:add_sound («script_replics\radio\message\radio_turn_on_», 30,
snd_type.talk, 2, 1, sounds_base + 0),
obj:add_sound («script_replics\radio\commander\radio_start_», 30,
snd_type.talk, 2, 1, sounds_base + 1),
obj:add_sound («script_replics\radio\message\radio_voice_», 30,
snd_type.talk, 2, 1, sounds_base + 2),
obj:add_sound («script_replics\radio\commander\radio_reply_», 30,
snd_type.talk, 2, 1, sounds_base + 3),
obj:add_sound («script_replics\radio\message\radio_voice_», 30,
snd_type.talk, 2, 1, sounds_base + 4),
obj:add_sound («script_replics\radio\commander\radio_finish_», 30,
snd_type.talk, 2, 1, sounds_base + 5),
obj:add_sound («script_replics\radio\message\radio_turn_off_», 30,
snd_type.talk, 2, 1, sounds_base + 6)
>
>
Здесь объявлена тема commander_radio с одной подтемой. Для добавления еще одной подтемы нужно добавить еще одну таблицу к теме и прописать по аналогии с существующей (соответственно с нужными параметрами).
Необходимо, чтобы поле sound_base четко соответствовало своему значению, иначе может произойти вылет движка.
11. Прекращение проигрывания звука
stop_play_sound(obj)

12. Определения типа обьекта
object_type(obj)

obj — объект из памяти

возращает тип обькта:

13. Выбор точки пути с заданным битом
point_with_bit(patrol_path, bit, old_point)

patrol_path — патрульный путь
bit — заданный бит
old_point — индекс точки, которую не надо выбирать( параметр не обязательный)

Если точек несколько, то произвольно выберет одну из них

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

Рекурсивная распечатка таблицы
Print_table(table)

Система проигрывания анимаций
Xr_state.anim_update(type, npc)
Где type:
Nil – прекратить проигрывание
«idle” – стоячий айдл
«prisluh” — прислушивание
«poisk” – поиск чего либо
«hide” – ожидание в засаде (mental.state Должен быть danger)

«hello” – приветствие
Примеры использования смотрите в коде или спрашивате в справочной.
Xr_state. anim_safe_to_break(npc) – указывает можно ли прервать анимации, чтобы не было сильно заметных рывков.

Контекстно-зависимая озвучка
Эта схема нужна для случаев, когда нужно проиграть случайный звук из набора, соответствующего текущим условиям (погода, здоровье, класс объекта, класс объекта, в чей адрес должна прозвучать реплика и т.п.).
Состоит из двух этапов:
Формирование таблицы-конструктора озвучки. Это обычно можно делать в initialize. Пример:
self.sound = <
maxidle = 10, — максимальное время (сек) между звуками (умолчание = 10)
sumidle = 10, — надбавочное время, добавляется к рандомно выбранному от 1 до максимального. (умолчание = 10)
rnd = 75, — вероятность, с которой будет проигран звук, если пришло время (умолчание = 100)
themes = < "weather", "state" >— список тем для разговора
>

Проигрывание этого набора с помощью xr_sound.sound_update. Это нужно делать в execute, разумеется.
function sound_update(npc, sound, now)
npc – npc
sound – таблица-конструктор
now – если true, то проиграть звук немедленно без задержки. Если число, то с этой задержкой.

перечень возможных тем:
— фразы о погоде
«weather»
— состояния тела, а также всяческие «покашливания»
«state»
— просьба о помощи
«help»
— окрик
«hail»
— ожидание
«wait»
— угрозы
«threat_weap» – оружие
«threat_back» – свали отседа
«threat_stop» — стоять, не сместа
— реакции
«reac_hear»
«reac_see»
«reac_search»
«reac_find_monstr»
«reac_find_enemy»
«reac_crps_monstr»
«reac_crps_enemy»
«reac_crps_neutral»
«reac_crps_friend»
«reac_nothing»
— болтовня
«talk_hello»
«talk_bye»
«talk_accept»
«talk_reject»
«talk_abuse»
— торговля
«trade_yes»
«trade_no»

Использование xr_sound для проигрывания сюжетных/одноразовых звуков.
Нужно создать свои темы, а потом просто вызывать sound_update. Пример создания темы:
В функции load_sound() внизу в соответствии с уровнем дописать тему:
— бандиты на заводе
theme[«escape_factory_bandits_novice»] = load_theme(«esc_f_band_novice»)

То, что выделено жирным – ключ в таблице наборов звуков. Набор звуков для темы нужно прописать вверху файла в табличке snd_files. Например:
— бандиты на заводе
esc_f_band_novice = «l_escape\factory_bandits\bandit_about_novice_»,

Использование:
Эти темы можно использовать вместе с темами контекстно-зависимой озвучки. А можно и для одноразового проигрывания какой-то реплики.
Создадим таблички (. причём лучше один раз при загрузке скрипта. ):
local rnd_phrases = <
maxidle = 8,
sumidle = 2,
themes = <
«weather»,
«state»,
«escape_factory_bandits_novice»,
«escape_factory_bandits_zone»,
«escape_factory_bandits_place»
>
>

Скриптование Сталкера №1 урок

Вот что я сейчас помню из своего опыта:
——————————

IF THEN ELSE
Обыкновенное условие:
if db.actor then
end

Запомните:
Сколько условий столько должно быть и end . Переизбыток или не достаток приведёт к вылетам.

Обыкновенное отрицательное условия
if not db.actor then
end

Условия с использованием else

if db.actor then
— Действие
else —Иначе или противодействие
— Действие
end

if db.actor then
— Действие
elseif условие then — Иначе если
— Действие
end — в данном случае нужен только один end т.к. это считается одним условием

Есть ли у гг объект и другой объект
if db.actor:object(obj) and db.actor:object(obj1) then
end

Если ли у гг объект или другой объект
if db.actor:object(obj) or db.actor:object(obj1) then
end

Если у гг один объект и другой или третий
if db.actor:object(obj) and db.actor:object(obj1) or db.actor:object(obj2) then
end
, но тут уже надо опиратся на логику, чтобы не ошибится в условии

—————————————
Комментирование
Чтобы отключитьзакомментировать строку используют два символа —
Также есть и блок коменнтариев
Начинается с
—[[
заканчивается
]]

—————————————
Return
Я часто видел в модах проверки на наличие предметов у гг вида
if db.actor:object(obj)

= nil then
return true
else
return false
end

Но можно воспользоватся и такой вещью как return и это будет выглядить так:
return db.actor:object(obj)

Значительно меньше не правда-ли? return может служить и заменой if
следовательно в нём возможны и такие виды:
return not
return условие and условие
return условие or условие
без end !

Недостаток:
в функци return может вызыватся лишь один раз в отличии от банальных if then

Все кто знаком со скриптами сталкера знает такую вещь как db.actor
Как много букв, а можно ли это как-то укаратить? Ответ: утвердительный!
До
db.actor :character_community()
После
gg :character_community()
db.actor и gg , где же меньше букв? Но какая разница где больше букв?!
А разница в том, что чем больше символом тем больше вес скрипта и чтобы хоть как-то укоротить скрипт применяют вот такие выходки.
Что такое gg ясно, но где содержится значение переменно?
Ответ: в local
local — это такая хрень которая объявляет переменные.
выходит так
local gg = db.actor

Запомните:
никогда не делайте переменные такого вида:
db.actor = gg
Т.к. следуя логике выходит что такая глобальная вещь как db.actor будет равна gg . Казалось-бы что такого? А в том что я незнаю))) Но когда я так сделал появился вылет.

Объявленные переменные можно и изменять, но уже не через local :
gg = db.storage

Можно из также и уничтожать благодоря функции nil
Запомните:
Чтобы уничтожить функцию можно применять и nil
Никогда nil функции и ещё использующиеся переменные.
nil — это просто как бы сказать. ну как бы как чёрная дыра. уничтожает без выделения информации что эффективнее обнуления, т.к. 0 — это хоть какая-то информация, а nil — это полное её отсутствие.

—————————-
Функции
Виды функций:
Пример простой функции
function test()
— скрипт
end

Источники:

http://vgtimes.ru/games/stalker-shadow-of-chernobyl/files/gameplay/27122-sborka-skriptov-dlya-tch-finalnaya-versiya.html

http://stalker-mods.clan.su/load/s_t_a_l_k_e_r_ten_chernobylja/mody_pravki_configs_scripts_anims/48-4

http://modroom.at.ua/publ/teni_chernobylja/rabota_so_skriptami/kak_vstavit_oruzhie_v_igru_podrobno/2-1-0-45

http://stalkermod.ru/Treneryi-STALKER/chity-na-stalker-teni-chernobylya.html

http://ferr-um.ucoz.ru/publ/rasskazy_po_tematike_stalker/skripty_v_igre_stalker_chast_1/2-1-0-58

http://chernobyl-soul.com/publ/skriptovanie_stalkera_1_urok/1-1-0-571

Читать еще:  S.T.A.L.K.E.R.: Clear Sky «Different Neutrals Mod_v 1.0.»
Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector