как писать скрипты для сталкера

Как писать скрипты для сталкера

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

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

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

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

function my_function()
if db.actor.psy==0.5 then
db.actor:kill(db.actor)
end
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) or (db.actor.helth==1) or (db.actor.psy ==0.5) then
действие
end

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

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

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

if (db.actor) then
.
end

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

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

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

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

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

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

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

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

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

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

function remove( remove_item )
if remove_item

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

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

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

Функции вызваются из других скриптов, нужно лишь найти место. Если она вызывается постоянно. То нужно пихать в колбэк на апдет в 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 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

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

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

Источник

Как писать скрипты, не приводящие к вылетам и бою сейвов

Материал из S.T.A.L.K.E.R. Inside Wiki

Содержание

Предисловие

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

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

Для начала маленький экскурс в историю. Итак, скрипты в сталкере написаны на языке Lua — разработали его бразильцы, он очень гибок, легко встраивается в игры и поэтому очень часто используется для написания скриптов любой степени сложности. Так вот, у этого языка и его реализации в игре есть несколько исключительно важных особенностей, которые, при их несоблюдении, будут приводить к вылетам вашего скрипта. Итак:

Типы данных и проблемы с nil.

Сначала сделаю маленькое отступление для не знакомых с основами скриптеров, чтобы понятнее было. Итак, в Lua используются следующие логические операторы:

Всё. Теперь поехали дальше… Язык Lua Изначально создавался для работы с большими строчными базами данных, поэтому ВСЕ виды конструкций в языке — это типы данных, то есть по сути либо переменные, либо константы. Это касается так же и функций! Поэтому даже с функциями в Lua можно и нужно обращатся как с переменными. Далее. Касательно, собственно «привычных» переменных. Обычные переменные в Lua получают свой тип данных только в момент присвоения им значения (запомните, это важно). При этом, в Lua есть такой важный и полезный тип данных как nil. nil — Это «пустота», то есть отсутствие какого-либо значения. При этом этот тип используется компилятором скриптов для «сбора мусора», то есть для освобождения занимаемой памяти. Смотрите пример, я объясню подробнее, что это значит:

Тут у нас 2 локальные переменные, одна из которых просто создана, а вторая — создана и инициализарована. Если сейчас обратиться к переменной reminder_count, считав её значение, то мы получим в качестве значения — nil, то есть пустоту. Если же мы обратимся к переменной exposure_count — то получим, как и ожидали, 0 — так как мы это значение проинициализировали ЗАРАНЕЕ. При этом не надо путать nil и 0 — так как 0 — это всё-таки какая-то информация, а вот nil — это её полное отсутствие. Так вот, собственно, чем это чревато. Я уже сказал, что nil используется для сбора мусора. Вручную это работает так — когда вам переменная уже не нужна, вы просто пишете:

И ваша переменная test_variable сотрётся из памяти, и любые ссылки на неё будут выдавать на выходе nil (типа нет такой переменной, «абонент вне зоны действия сети»). Ну так собственно вот, зачем я это всё рассказываю… если не определить значение переменной сразу, как это было сделано с переменной reminder_count, то любые попытки обратиться к ней внутри скрипта приведут к вылетам. Происходит это следующим образом: допустим, reminder_count — это у нас счётчик напоминаний. То есть мы о чём-то напоминаем игроку текстовыми сообщениями, и помечаем, сколько раз мы это сделали. Определили мы переменную именно так, как в примере выше, то есть не задав ей никакого значения. Значение же её должно присваиваться ниже по коду, после первого оповещения юзера. При этом у нас есть в коде обращение к этой переменной, по которому решается что делать дальше. Выглядит это примерно так:

Во время игры всё это скорее всего отработает хорошо, но вот при загрузке… тут могут быть проблемы, так как скрипт при запуске может пролететь ту часть, где переменной reminder_count присваивается значение! В итоге при запуске вышеприведённой функции check_antirad_supplies() нас получится что reminder_count не существует — он равен nil, и в итоге проверка

выдаст ошибку и приведёт к вылету! Почему? Да потому что НЕЛЬЗЯ сравнивать НИЧТО с вещественным значением. Именно поэтому, когда вы создаёте новую переменную, вы ОБЯЗАНЫ задать ей значение по умолчанию, даже если вы полностью уверены, что она нигде не будет использована до инициализации. Поверьте — в программировании бывает всё, и запросто может так случиться, что ваша переменная будет использована и спровоцирует вылет.

Простой способ обойти такую кучу проверок и лишних инициализаций — использование or-оператора. пример

если переменная равна nil, то выражение вычисляется дальше и получается равным 0, а это уже число и сравнение происходит безболезненно.

Кроме вышеприведённой ситуации, возможен ещё один неприятный момент, связанный с определением переменных и значением nil. Суть его заключается в том, что при присваивании значений или операциями с переменными мы можем получить кучу проблем… покажу конкретнее каких:

«Смерть» переменных

Положим, у нас с reminder_count происходят ещё какие-нибудь занимательные вещи, например мы его значение зачем-нибудь присваиваем другой переменной вот так:

Ну и вот, если у нас reminder_count в момент присвоения ещё не имеет никакого значения, то мы получим занимательную штуку — у нас это выражение сработает как

В результате чего переменная antirad_check_delay «сдохнет» и будет деловито убрана «сборщиком мусора» из памяти, что моментально приведёт к вылету, когда в дальнейшем какая-то часть кода обратится к значению antirad_check_delay.

Ошибки деления на 0

Теперь положим что у нас reminder_count используется в каком-нибудь расчёте вот так:

Как мы помним, у нас reminder_count не инициализирована, и как следствие равна nil. В итоге мы получим попытку поделить exposure_count на ноль (в нашем случае на nil, что суть одно и то же в нашем случае) и получим «классический» программистский вылет из-за ошибки деления на ноль.

Ошибки присвоения

В помеченном выражении self.weapon_id = wpn:id(), и всё вроде бы отлично, так как стоит проверка if wpn then, однако иногда движок умудряется передать объект функциям некорректно, либо сам скриптер может перепутать при вызове игровой объект с объектом а-лайфа, и присвовение self.weapon_id = wpn:id() либо приравняет self.weapon_id к nil либо сразу приведёт к вылету из-за того что соответствующее свойство объекта не было обнаружено в его классе.

Как с этим бороться

Бороться с такими ситуациями очень просто на самом деле. Во-первых: ВСЕГДА ИНИЦИАЛИЗИРУЙТЕ ПЕРЕМЕННЫЕ. То есть вот такое описание переменной:

НЕДОПУСТИМО! ВЫ ОБЯЗАТЕЛЬНО ДОЛЖНЫ ЗАДАТЬ ПЕРЕМЕННОЙ ЗНАЧЕНИЕ! Если переменная числовая, сделайте это так:

Если строчная — то сделайте это так:

(получится вместо nil пустая строка)

Если логическая, то так:

В общем, делайте так, как вам удобнее, но ДЕЛАЙТЕ ОБЯЗАТЕЛЬНО!

И во-вторых: ВСЕГДА ПРОВЕРЯЙТЕ ПЕРЕМЕННУЮ ПЕРЕД ИСПОЛЬЗОВАНИЕМ!

То есть в кусках кода, чреватых вылетами (к ним относятся АБСОЛЮТНО ВСЕ части, где идёт работа с вещами или оружием) обязательно вставляйте проверки переменных на nil следующим образом:

Тогда сначала выполнится проверка, и если обе переменные имеют значение, то операция отработает, а если один из параметров пуст — то функция просто пропустит этот код. Тут не помешает ещё и проверку вставить на существование self.weapon_id, хотя это наверное уже моя параноя 🙂

Кстати, что самое дурацкое — ошибки, приведённые выше, часто в лог попадают совершенно непохожим на ошибки скриптов образом. Например, ошибка присвоения из примера 3 приводила к вылету с сообщением «Assertion failed», и поймать её я смог только изучив внимательно предыдущие строки лога, где зафиксировались операции с вещами…

Точно так же, если вы используете ЛЮБЫЕ математические операции например деление (но не только деление, всего остального тоже касается), тоже ОБЯЗАТЕЛЬНО поверяйте переменную. Вот так:

Таким образом потенциальные вылеты будут аккуратно изолированы, и больше не будут создавать проблем. И ещё одно небольшое дополнение к этой же теме. Итак, вы вставили обходные проверки вот таким образом:

И у вас в случае некорректного значения компилятор спокойно пропустил этот код, ничего не сделав ни с self.weapon_id (из первого примера), ни с antirad_check_delay (из второго). Однако вам всё-таки нужно, чтобы с ними что-то происходило, даже если проверяемые переменные неверны. Тогда я бы советовал вам дополнить этот обход отработкой нештатной ситуации. Делается это банально просто:

И для второго случая аналогично:

Более конкретная реализация зависит от того, что именно вы пытаетесь сделать — тут уже вам виднее…

Типичные ошибки при именовании функций, присвоении и инициализации переменных.

Типичная ошибка, приводящая к вылету:

В этом коде агрумент функции совпадает с её именем, и в итоге функция пытается передать функции alife():release вместо указателя на вещь — указатель на саму себя. А так как у функции remove_item нет никакого id, код выпадает с ошибкой:

Следует помнить, что Lua — это язык прямого (JIT) компилирования, и он, как любой такой язык не проверяет ошибки при компиляции. Поэтому нужно очень аккуратно раздавать имена переменным и функциям, чтобы избежать подобных ошибок. Данную функцию нужно переписать следующим образом:

Однажды, отлаживая скрипт, натолкнулся на вот такой код:

Казалось бы, всё верно, и значение проверяется перед использованием. Ан нет, скрипт вызывал вылет, причём именно на проверке. Методом тыка было выясено, что nil вызвавший вылет, был не в результате обработки, а был передан фукнции. Это был параметр npc_id.

Пришлось сделать вот так:

Введя предварительно проверку аргумента npc_id. Вывод — если ставите проверку, старайтесь проверять не только саму функцию, но и вначале — аргумент, который ей передаётся. Мало ли в каком виде он до вас доедет… 🙂

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

И ещё один совет — для самых начинающих:

Когда пишете скрипты, не забывайте о соблюдении синтаксиса! То есть внимательно и вдумчиво ставьте в концах функций и оснований ключевые слова end — помните, что как отсутствие нужных end’ов, так и наличие лишних приводят к тому, что границы фукций сбиваются, скрипт не парсится обработчиком и вызывает при попытке своего вызова вылет, примерно вот такой:

Для того, чтобы вам проще было следить за синтаксисом и не допускать лишних end’ов, выстраивайте текст скриптов каскадными лесенками:

..и пользуйтесь редакторами с подсветкой синтаксиса, такими как Notepad++ например. В результате каждый уровень вложенности находится на своём отступе. Вы всегда увидите, какую конструкцию нужно закрыть, а какую — нет. Я же например, делаю ещё проще — я, открывая новую функцию, сразу ставлю сразу в её конце, парой строк ниже, end, и потом уже пишу наполняющий её текст с отступами как в примере выше.

И ещё — касательно жизни переменных: не забывайте, что определённые внутри проверок переменные живут только до выхода из проверки. То есть, например:

В данном случае переменная test создастся, но просуществует только до выхода из проверки, и дальше обращение к ней выдаст nil. Для того чтобы этого избежать, определение переменных надо выносить «за скобки» вот так:

Смертельные циклы по таблицам

Если вы строите цикл по таблице следующим образом:

То никогда, ни при каких обстоятельствах не используйте внутри этого цикла удаление/добавление строк, т.е:

применительно к таблице по которой гоняете цикл. При использовании это приводит к тому, что количество строк в таблице уменьшается, а цикл пытается получить из таблицы строки сверх существующего количества, что в итоге приводит к выходу цикла за отведённый ему диапазон памяти. Результатом будет веер самых разнообразных последствий, самое безобидное из которых это безлоговый вылет на рабочий стол, а серьёзное — сбой в работе а-лайфа с последующим боем сейвов! Тяжесть последствий зависит от того, какие действия вы выполняете внутри цикла кроме удаления строки.

Чтобы избежать подобных ситуаций, стройте циклы по таблице лучше следующим образом:

А удаление строк внутри них делайте вот так:

Источник

Начальные сведения о скриптах

Материал из S.T.A.L.K.E.R. Inside Wiki

Содержание

ПРЕДИСЛОВИЕ

Итак, начнём. Создадим в папке gamedata/scripts файл с любым названием и расширением .script. Пускай, my_test.script. В нем будем прописывать функции.

Рассмотрим простой скрипт спавна предмета в рюкзак ГГ. Пропишем:

Многострочный комментарий выглядит так

Это обязательный элемент. В нем указываются аргументы функции, с которыми идет работа. В нашем случае таковых нету, но элемент обязателен. Дальше идёт сам спавн объекта:

В конце функции обязательно наличие end. Он означает конец функции. Логично, правда? 🙂

Напоминаю, при таком раскладе АК-74 заспавнится в рюкзак ГГ. Если же мы пожелаем заспавнить калаш где-нибудь на локации, вызов спавна приобретет следующий вид:

АК заспавнится в вагончике, недалеко от Деревни новичков.

Но без детального разбора мы дальше, пожалуй,не пойдем. В целом, скелет функции спавна таким методом выглядит так:

Написали? Отлично!
Теперь осталось только подключить это к игре, то есть вызвать функцию спавна.
Идём в файл dialogs_escape.xml и выбираем какой-нибудь диалог.
Там, после поля text, одной из фраз диалога приписываем:

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

Углублённое изучение

Прописываем функцию. Задаём условие:

В противном случае, выполняется код, следующий за ключевым словом else

Но, когда нужно проверить несколько значений (допустим) переменной, можно воспользоваться ключевым словом elseif

Для отрицания условия можно воспользоваться ключевым словом not Т.е.

Будет равен else в данном условии

И так, что же такое цикл. Цикл это повторение одного и того же действия n-ое кол-во раз, которое выглядит так:

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

Таблицу записали, наконец приступим к оформлению главной функции

Далее помещаем вызов функции в bind_stalker.script в net_spawn() и при каждой загрузке будут спавнится мобы в рандомной точке

Помощь новичкам

Различные полезные функции и методы перенесены в эту статью [1]

Авторы

Оригинальный вид статьи:

Переоформление, перестройка, дополнение статьи:

Источник

S.T.A.L.K.E.R|Модостроение

Меню навигации

Пользовательские ссылки

Объявление

Информация о пользователе

По мелочам [Скрипты [Scripts]]

Сообщений 1 страница 10 из 57

Поделиться12011-11-23 13:43:25

открываем файл: scripts\surge_manager.ltx
и меням параметры:

Формат: ЧЧ*ММ*СС игрового времени

Поделиться22011-11-23 13:43:49

Выводим координаты на худ

В файл: \scripts\bind_stalker.script
После:

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

Добавить вот эту строчку:

if db.actor then news_manager.send_tip(db.actor,db.actor:game_vertex_id()..» «..db.actor:position().x..» «..db.actor:position().y..» «..db.actor:position().z,0,mutant_hunter,10000,nil,»Gvertex X Y Z») end

Поделиться32011-11-23 13:44:24

Скриптеры никогда не делайте так!

Хочу поделиться советом, как избежать ошибки, приводящей к вылету (на которую сам часто напарывался).
Надо проверить наличие предмета, и что-то сделать.
Допустим, надо выяснить какой броник надет на ГГ и изменить какие-то параметры.
честно пишем:

local outfit_in_slot=db.actor:item_in_slot(7)
if outfit_in_slot

=nil and outfit_in_slot:section_name()==»чегототам» then

Первое условие nil

local outfit_in_slot=db.actor:item_in_slot(7)
if outfit_in_slot

Поделиться42011-11-23 13:44:57

Где настроить уборку трупов?

Поделиться52011-11-23 13:45:51

Проверяем кол-во денег у ГГ

Функция проверки денег ГГ:
Добавляем в скрипт такую функцию, либо создаем новый скрипт в папке gamedata\scripts\
В скобках после math.floor указываем нужное кол-во денег
Также операторы для предпоследней строки:
==
равно
>=
больше или равно

больше

function Имя_Функции()
local money = math.floor(Кол-во денег)
return db.actor:money()ОПЕРАТОРmoney
end

Поделиться62011-11-23 13:46:12

Какая функция отвечает за цены проводников по локации?

Функция:
function get_price_by_distance(distance)
return math.ceil(distance/50)*50
end

Поделиться72011-11-23 13:47:01

Добавляем отметку перехода между локациями

Создаем скрипт в папке gamedata\scripts, например: map_targets.script
В него вставляем следующие функции:

local zaton_spot = get_story_object_id(«уникальный_ид_перехода»)

if (not has_alife_info(«give_info_level_changer_spot»)) then
level.map_add_object_spot_ser(zaton_spot, «имя_секции_иконки», «Путь к заводу Юпитер»)
db.actor:give_info_portion(«give_info_level_changer_spot»)
end

А в gamedata\scripts\bind_stalker.script в функцию actor_binder:update(delta) добавляем:

Теперь, что касается регистрации иконки. Топаем сюда: gamedata\configs\ui
И работаем с двумя файлами: map_spots.xml и map_spots_16.xml
Либо оттуда берём зарегистрированную иконку, либо создаём по аналогии (в двух файлах секции будут идентичны: для обычного монитора и широкоформатного).

Поделиться82011-11-23 13:47:38

function del_nik()
local id, obj, kto
for 65535 do
obj = alife():object(id)—вот здесь
if obj then
if IsStalker(obj) then
kto = obj:section_name()
if (kto == «nikitka») then
alife():release(alife():object(id), true)
end
end
end
end
news_manager.send_tip(db.actor,»Персонаж удален»,0,mutant_hunter,10000,nil,»Тест инфо»)
end

local npc_id = get_story_object_id(«nikitka»)
if npc_id

= nil then
alife():release(alife():object(npc_id), true)
end

Поделиться92011-11-23 16:51:42

Как сделать чтобы бандиты водили тебя по локации?

В файле scripts\travel_manager.script
Ищем:

function uni_traveler_precond(actor, npc)
local squad = get_object_squad(npc)
if squad

= nil and squad:commander_id()

= npc:id() then
return false
end
if npc:character_community() == «bandit» then
return false
end
if level.name() == «jupiter_underground» then
return false
end

Закомментируем проверку, что бандиты не могут водить, вот так:

function uni_traveler_precond(actor, npc)
local squad = get_object_squad(npc)
if squad

= nil and squad:commander_id()

= npc:id() then
return false
end

—теперь бандиты тоже водят по маршруту

—if npc:character_community() == «bandit» then
—return false
—end
if level.name() == «jupiter_underground» then
return false
end

Поделиться102011-11-23 16:52:20

Какой файл отвечает за статистику?

как писать скрипты для сталкера. 50276. как писать скрипты для сталкера фото. как писать скрипты для сталкера-50276. картинка как писать скрипты для сталкера. картинка 50276. Любая функция начинается со словкак писать скрипты для сталкера. LHtDQ. как писать скрипты для сталкера фото. как писать скрипты для сталкера-LHtDQ. картинка как писать скрипты для сталкера. картинка LHtDQ. Любая функция начинается со словкак писать скрипты для сталкера. XfFm8. как писать скрипты для сталкера фото. как писать скрипты для сталкера-XfFm8. картинка как писать скрипты для сталкера. картинка XfFm8. Любая функция начинается со слов

О сайте

Шутки из Зоны

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *