Вверх
 

Автор
Сообщение
 Russian FederationVanoSanturi
Добавлено: 10.08.2010 19:04:50   Заголовок сообщения: Скриптование. Учимся писать скрипты.
#1
Статус: Offline
Алхимик
Алхимик

Коммент+БарыгаСталкерШутник
Все медали

«Новички»
Группа: «Новички»
Сообщения: 207
Плюсанули: 11 раз(а)
Дата регистрации: 26.08.2011
Скриптинг

Я не профессионал, я не программист, я не изучал официальную справку по Lua, я не считаю себя гением и еще кем-либо.
В данном топе вы найдете готовые, самые используемые скриптовые функции, начальные сведения по скриптованию, научитесь писать примитивные скрипты(хотя их такими не назовешь), но я не смогу передать вам мой образ мышления и способность находить ответы на многие вопросы самому методом общего анализа...


Урок первый. Что такое скрипт?


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

Переделал с переменными(Для чего нужны объявления?):

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

Цепочка elseif .


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

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

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

if (db.actor ~= nil) then
....
end

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

if (db.actor) then
....
end

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

При обращении к функция из сторонних скриптов(других скрипт-файлов) я советую проверять на наличие этих скриптов:


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

if my then
......
end

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

Рандом.

Числовой.

math.random( 1,10 )
Данная функция рандомно выберет число от 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.

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

local my frazi = {"ага","да","нет!","конечно","несомненно"}

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

Показать код [CODE]

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

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

Есть еще способы через логику, но они вам сейчас не нужны, а как понадобятся, вы сами их найдете.
В этом деле главное терпение , находчивость и желание. Коды за вас никто писать не будет. В лучшем случае дадут пару советов и пошлют http://www.lua.ru/ . А в обычном скажут, руки не оттуда растут....


Пожалуй это всё. Большему я вас научить не могу. Так как это самое ОСНОВНОЕ. И поверьте, зная такие основы можно понимать многое и писать тоже.Это не значит , что я ничего больше не знаю. Просто я не могу это написать. Вот вы зададите конкретный вопрос в ковырялке, тогда я смогу вам ответить. А так больше на ум ничего не идет. Так же есть сложные элементы, которые я могу применять, но достоверно и полно объяснить не смогу.
В дальнейшем в этой теме буду публиковать готовые функции с пояснениями.


ПлюсанулиDen

Последний раз редактировал(а) Admin: 17.11.2012 23:05:54
__________________
Что-то кончается, что-то начинается.
 Russian FederationVanoSanturi
Добавлено: 11.08.2010 09:11:45   Заголовок сообщения: Re: Скриптование. Учимся писать скрипты.
#2
Статус: Offline
Алхимик
Алхимик

Коммент+БарыгаСталкерШутник
Все медали

«Новички»
Группа: «Новички»
Сообщения: 207
Плюсанули: 11 раз(а)
Дата регистрации: 26.08.2011
Пошли функции.


Спавним объекты

Для спавна неписей смотрим config/creatures/spawn_sections.ltx - там написаны имена секций для разных типов неписей(И те, которых мы создали)

Показать код [CODE]

"sim_default_zombied_4" - секция объекта из конфига.
pos.x,pos.y,pos.z - координаты через запятую.
lv - левел-вертекс
gv - гейм-вертекс

Для определения координат:


Заходим, предварительно распаковав, в каталог gamedata/scripts/ И там в файле ui_main_menu.script в конце дописываем это:

Показать код [CODE]

Теперь в игре идём на то место (или ногами или деморекордом), где спавним обьект, выходим в меню игры, и жмём на клавишу СОЗДАТЕЛИ (CREDITS) - соответственно нашему взоры не предстаёт никакой список создателей, а мы услышим звуковой сигнал, после чего выходим в игру из меню, и в строке сообщений высветиться вся инфа. Всё - F12 или на бумажку.

By Pereiro, added by loxotron

Предлагаю более лёгкий способ: Создайте новый скрипт, в него запишите следующую функцию:

Показать код [CODE]

Далее открываем bind_stalker.script и находим функцию actor_binder:update(delta) Напишем в ней следующее
Показать код [CODE]

250 - это четверть секунды, т.е. четыре раза в секунду будет обновляться информация о координатах. Теперь нужно обозначить нашу новую переменную: просто где-нибудь вне всяких функций в этом же файле напишите:
t_coord=0
Всё! Теперь в игре перед вами всё время высвечиваются координаты.!

Спавним объект в инвентарь(если для ГГ, просто пишите spawn_item_in_inv(секция объекта)

Показать код [CODE]

Удаляем объект из игры

Показать код [CODE]


Выбрасываем объект из инвентаря, применимо к ГГ (если для ГГ, так же пишем только предмет)

Показать код [CODE]


Убиваем непися

Показать код [CODE]

Рандомный(рандмное место) спавн объекта на карте.

Показать код [CODE]

Цифра 0 - это геймвертекс Затона (можно посмотреть в АСДС)
Юпитер 317
Припять 666

Функция спавна аномалий с временем , написана для ЧН Шокером.


Показать код [CODE]


section -секция аномалии из конфига
rad_anom - радиус аномалии(3 -норма)
x - перваяя координата х
y - вторая координата у
z - третья координата z
lv - левел-вертекс
gv - гейм-вертекс
mode - если используете поля, то нужно писать "filed" , если обычные аномалии то nil
time1 - время работы в милисекундах (1 секунда -1000 мили)
time2 - время неработы (1 секунда -1000 мили)
если постоянно, то в обоих ставте nil

ЗЫ. С помощью этой штуки можно сделать самые стабильные динамические аномалии, только со временем пошаманить. накляпать табличку....



Рандомный спавн аномалий на Затоне, как места , так и секции, вдобавок 150 штук.

Показать код [CODE]

Последний раз редактировал(а) Admin: 17.11.2012 23:09:29
__________________
Что-то кончается, что-то начинается.
 Russian FederationVanoSanturi
Добавлено: 19.12.2010 12:05:48   Заголовок сообщения: Re: Скриптование. Учимся писать скрипты.
#3
Статус: Offline
Алхимик
Алхимик

Коммент+БарыгаСталкерШутник
Все медали

«Новички»
Группа: «Новички»
Сообщения: 207
Плюсанули: 11 раз(а)
Дата регистрации: 26.08.2011
CallBack System

Выкладываю систему калбэков. Кто знает, что это такое, сам поймет как подключать.
Цитата

-- Copyright: 2009-2010 ARS Team
-- Authors: Red75, sokol_jack & xStream
-- Last edit: Xmk, Skunk
-- End edit ^ VanoSanturi


Все рабочее, патч 1.6.02 .
Добавил апдейт для выброса, я просто интересные фишки творил, и чтоб не использовать таймеры, делал таймы на апдейте...
callbacksys.7z

Последний раз редактировал(а) Admin: 17.11.2012 23:07:38
__________________
Что-то кончается, что-то начинается.

Страница: 1 из 1
Вы можете просматривать темы
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать сообщения
Вы не можете удалять сообщения
Вы не можете модерировать этот форум
Вы не можете создавать опросы