Чем открыть script сталкер
Начнём уроки.
1)Создадим свой my.scripts и поместим его в папку scrips . Откроем с помощью НотПада и настроим подсветку.
2) Внутри файла-скрипта должны содержаться только КОД скрипта и ваши ЗАКОМЕНТИРОВАННЫе пометки. Если будет лишний текст, т.е какие-то знаки и слова, то будет вылет на этот скрипт. Так как код игры полностью собирает весь скрипт в стек и выбирает только то, что вы задали, но если будет мусор, то игра не воспримет код.
3)Архитектур. Для создания функций нужны лишь знания синтаксиса и игровые методы и глобальные функции(которые записаны в движке) можете почитать lua_help.scrip , но я советую посетить тему на АМК . Там собраны все методы, классы и полное их описание.
4) Функция. Это то, что будет делать игра.
Любая функция начинается со слов
function my_function()
.
end
И заканчивается тегом end . Этот тег означает конец функции, сравнения, он закрывающий и обязателен. Я советую при составлении функций , чтобы не забыть чего-нибудь, писать скелет извне, т.е сначала функция, потом закрывающий тег, и по нарастающей во внутрь.
() -Обязательный элемент. Позже расскажу как передавать переменные через этот тег.Между окончание функции и этим тегом ПРОБЕЛА НЕТ.
Обращаю внимание, что все функции вызываются из других скриптов. Допустим нам из одного скрипта, нужно вызвать(запустить функцию в другом) для этого мы пишем
название скрипта . название функции в скрипте (парметр если есть)
my.my_function()
Глобальные можно объявлять вначале скрипта и она будет сохранятся в коде, в памяти процесса (если я правильно понял)
Переменная объявляется только перед функцией и логическими выражениями, где используется переменная и её использует только та функция, перед которой она объявляется (На пальцах перед строкой с вашей функцией). Т.е елси функция простая без логических решений(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) < 1 then
действие
end
Если выбранное число меньше 1, то срабатывает функция.
if math.random(0,1) < 1 then
действие
else
.
end
Добвавляется другое действие.
Советую брать целые числа от 1 до 10 для создания процентного срабатывания, но лучше 0 и 1.
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 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 Script Editor
Версия: 1.5
Автор: Danger_Ous (Stalk15)
Тестеры:
Главный тестер: FaLcon
Остальные: Tris, GreadFiasco
Краткое описание:
Программа для редактирования .script файлов игры Сталкер. В программу добавлено множество возможностей, которые ускорят и упростят написание скриптов.
Подробное описание:
v1.0
Подсказка функций и ключевых слов, вводимых пользователем. При выделении предлагаемой функции, показывается ее описание. К подсказываемым словам относятся:
- ключевые слова и функции LUA, используемые в сталкере
- функции, свойства, методы самой игры.
- Так же, пользователю предлагаются функции из сторонних скриптов(например, при написании *имя_скрипта*.[тут будут предлагаться функции из этого скрипта])
Подсветка синтаксиса. Все цвета можно настроить под себя.
Возможность поиска и замены текста.
Комментирование/раскомментирование выделенного текста по нажатию одной кнопки.
Возможность перетаскивания мышью выделенных скриптов в программу.
Добавлены инструменты:
1) Помощь по функциям. Здесь можно найти из списка всех функций нужную и почитать ее описание. На данный момент в программе присутствует лишь
130 функций, имеющих описание. Мне одному слишком муторно добавлять описание функций, которых в игре больше 1000. Поэтому добавлен редактор описаний функций. Пользователь может сам добавить описание к любой функции.
2) script Syntax Checker от Gun12. Программа проверяет синтаксис скриптов. Можно вызвать эту программу из редактора и проверить свой скрипт на правильность.
3) Script Dialog Creater. Данный инструмент позволяет быстро создать скриптовый диалог. Нужно лишь ввести количество фраз и имя диалога.
v1.5
Добавлена возможность маркировать строку.
Добавлена возможность перейти к строке или символу по номеру.
Исправлены ошибки версии 1.0.
Если вы нашли ошибку или есть какое-нибудь пожелание/замечания, то пишите: ICQ - 618517931.
Ссылка на скачивание:
Яндекс.Народ
Скриншоты:
Структуру папок и местонахождение основных файлов игры Сталкер смотрим здесь Структура файлов и папок
Короче, нашел у себя в загашнике решение (вроде как от самого Архары) и испытал, создав ситуацию с неотключившимся выбросом (не уходил с локации пока таймер не обнулился), вот описание (подправил немного):
затем, вызов функции в таком виде: <action>arhara_dialog.dell_duratskiy_timer</action>
вставить в любой ближайший диалог.
под строку: function actor_binder:update(delta)
добавить вызов: arhara_dialog.dell_duratskiy_timer()
Сохранить изменения, грузить сейв перед заходом на ЧАЭС-1 и потом переходить, или загружаться с автосейва перехода, тоже сработает.
После, как перешли на ЧАЭС-1 и выброс отключился - сохраняемся, выходим из игры и удаляем строку arhara_dialog.dell_duratskiy_timer() из файла bind_stalker.script
Ключи для быстрого запуска игры , также немного разгружает память .
На рабочем столе , правой кнопкой мышки кликаем на ярлык.S.T.A..L.K.E.R
Далее , выбираем Свойства
Далее , в Объект , после кавычек , делаем пробел и прописываем
. XR_3DA.exe" -nointro -noprefetch -noshadows
Подходит к любому Сталкеру , Н.И. не нужна , удачи .
Ряд дополнительных команд, которые можно запускать при старте STALKER'а называются Переключателями Командной Строки. Эти 'переключатели' - это команды посланные главному исполняемому файлу XR_3DA.exe, говорящие движку выполнить определённые действия при запуске игры. Для использования переключателей командной строки, кликните правой кнопкой мыши на ярлыке STALKER'a и выберите 'Свойства'. Далее в поле 'Объект', через пробел от последнего символа, вставьте переключатель(и) которые вы хотите использовать. Например:
Переключатели -nointro, -noprefetch и -noshadows добавлены для отключения вводных заставок с логотипами, предварительной загрузки информации (ускоряет запуск и загрузку сохранений) и отключения всех не солнечных теней в игре. По другому не возможно использовать предигровые настройки. Можно вернуть настройки в любой момент просто удалив переключатель с ненужной настройкой из ярлыка или создав другой с требуемыми переключателями и использовать его когда ты захочешь запустить игру с другими настройками. дополнение от --HikeR 14:17, 31 мая 2007 (MSD)][
Для различных ситуаций можно создать несколько копий ярлыков для запуска игры с различными параметрами. Например можно использовать ключ -nointro для всех вариантов, комбинацию -noprefetch -noshadows -nosound -r4xx для всяких экспериментов (отключен звук, префетч, тени, форсированно используется DX8, максимально быстрая загрузка), и просто ярлык для обычной игры
Полный список Переключателей Командной Строки для STALKER'а приведённый ниже сопровождается также кратким пояснение для каждого, где это было возможно. Я протестировал каждый и все переключатели, но некоторые переключатели не имеют видимого эффекта или просто подвешивают игру во время загрузки. Инструкции по предполагаемому использованию наиболее полезных переключателей приведены на протяжении этого гида:
Это, что бы проверять наличие НЕСКОЛЬКИХ и РАЗНЫХ предметов в рюкзаке ГГ
Это, что бы отдавать в НУЖНОМ количестве НУЖНЫЕ предметы.
Вставляется в скриптовый файл и оформляется по типу:
Есть ли ДВЕ ammo_gauss - проверка
= false
end
Проверка на количество разных предметов
Отдача "этих" предметов без появления их в "торговле" оппонента - тупое отбирание их у ГГ.
ЗЫ. Ещё раз НАСТОЯТЕЛЬНО - эти "универсалки" должны "лежать" в конкретном скриптовом файле и все ссылки на них должны ТАК-ЖЕ "обзываться" по соответствию.
Вынос какой либо информации в другой файл (в нашем случае, имеем например кучу текстов, которые занимают кучу места в файле, тормозят и мешают ориентироваться в нем):
Создаем новый файл, например all_txt.script и пишем в него таблицу со всеми нужными текстами:Ниже таблицы, пишем незатейливую ф-ию, которая будет возвращать нашу таблицу:
ВАЖНО! Имя функции и имя таблицы в файле, обязательно должны быть разными!
Затем в другом файле, где юзаем наши тексты объявляем нашу таблицу:
Не соглашусь, Саша. Удалять можно хоть стоя рядом, а вот то что я упустил, и что действительно важно: эту функцию нельзя вызывать из диалога с НПС которого пытаемся удалить.
Правильное уточнение, для этого тут и "собрались".
Я же отписал "свои впечатления" от конкретной ситуации с удалением НПС в ходе диалога с ним. Вот и "разобрали" некоторые тонкости. Ну. А про "остальное" как-то упустил, виноватьььь
"1.0" тута уровень громкости. Он не всегда эффективен, так что можно вызывать сразу двойную функцию - сразу будет слышно повышение громкости, хотя пока не известно, как это сказывается на "внутренних процессах", но иногда "спасает", если "общий фон" глушит всё и надо акцентировать некоторые звуки.
Не стоит воспринимать мои же "мысли и знания", как "что-то этакое". Пробуйте, это работает. Я сужу не, как спец и программер, а как "представитель группировки от сохи" А ОНО и в правду, "работает". Есть куча литературы по языку ЛУА, там много полезного, хотя и полно "дезинформации" - я только после года "возни" и отмахиваний от "первоисточников" всё же ОПЯТЬ прихожу к выводу, что УЧИТЬСЯ надо сначала "азбуке", а потом уже "терзать" внешние эффекты. Ну. У нас же всегда - "хочется быстрее и всего". А когда "влезешь", то захочется "ещё больше". А ТАМ, извините, ЗНАТЬ надо и НИкТО не подскажет - "сам плавай".
Ну если перевести НПС сначала в оффлайн, то с ним можно кучу всяких непотребностей сделать
В том числе и удаление. Однако я пока не видел нормальной вменяемой ф-ии на перевод.
ЗЫ: Либо можно поступить как например я делал с телепортами - т.е при спавне ТП пишем его на пстор актора, затем при удалении обращаемся туда же и удаляем. Т.е ТП удаляется в онлайне и ты можешь в это время на него даже смотреть.
ЗЗЫ: На НПС я этот способ не пробовал - не было пока нужды в удалении
Если я правильно помню, то возможность перевода НПС в оффлайн через отдельное поле логики появилась только в ЗП. В логике это выглядит так:
Т.е. здесь видно, что поддерживается кондлист и выполнение "эффектов".
Соответственно в xr_logic.script появилась и часть кода, обрабатывающая это поле:
В ТЧ или ЧН такой поддержки нет, но наверное можно и сделать, я не знаю…. А можно поступить проще, ну например перевести НПС в оффлайн по ранению:
И в конце логики секцию хита:
Чтобы он действительно туда пошел, открываем xr_effects.script и добавляем туда функцию:
Всё. Запускаем игру, получаем от Волка ПМ, стреляем в ногу (главное ранить, а не убить) и Волк исчез, только метка осталась. Таким образом можно переводить НПС в оффлайн с любой секции его логики.
Теперь понятна разгадка из ТТ 2. Когда ты стреляешь в НПС, а из него типа лезут жуки
Спасибо за пример!
Хм, а если по сиду? Без прописки логики?
Надо будет попробовать завтра.
Удаление любого онлайнового/оффлайнового объекта из игры. Во время удаления можно хоть плясать рядом с ним:
Само удаление, например нескольких сталкеров/монстров:
remove_obj - ф-ия в которую передаем данные для удаления.
Если же удаляем кого то одного - цикл и таблица не нужны.
Удаление любого онлайнового/оффлайнового объекта из игры. Во время удаления можно хоть плясать рядом с ним:
Ф-ия которая будет все делать:
Код
function remove_obj(name)
local obj
for a=1,65535 do
obj = alife():object(a)
if obj and string.find(obj:name(),name) then
alife():release(obj, true)
end
end
end
Само удаление, например нескольких сталкеров/монстров:
Код
function remove_freaks()
local tbl_remove = < "bloodsucker_1", "bloodsucker_2">
for _, v in pairs (tbl_remove) do
remove_obj(v)
end
end
Читайте также: