* Sb    * Магазин Текущее время: 24 апр 2024, 17:03

Часовой пояс: UTC + 2 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
{ VISITS } Просмотры: 5284  Добавили в закладки Добавили в закладки: 0  Подписчиков Подписчиков: 0 
Автор Сообщение
 Заголовок сообщения: Начальные сведения о скриптах
СообщениеДобавлено: 16 июн 2011, 16:22 
Не в сети
Сталкер
Сталкер
Продвижение:
21.5%
Аватара пользователя

Зарегистрирован: 22 сен 2010, 14:31
В кошельке:
51.00

Сообщения: 329

Откуда: Минск
Взято с - http://stalkerin.gameru.net/

Начальные сведения о скриптах
ПРЕДИСЛОВИЕ
Для чего нужны срипты и сведения и их использовании - Rez@niy aka Oxygenium
В скриптах содержаться данные для выполнения по условиям.


Итак начнём. Рассмотрим простой скрипт спавна предмета:
Код:
--*********************************************
--**TESTING**
--*********************************************
--
-- Создает в заданном месте калаш
function ak_create()
   local a = vector() -- db.actor:position()
   a.x = -220.21
   a.y = -19.93
   a.z = -158.98
   alife():create("wpn_ak47",a,33447,47,65535)
end

ИМЯ ФУНКЦИИ function - всегда обязательное поле, это что то вроде id, в языке LUA. После поля function отступаем и пишем текст произвольный. Дальше идёт функциия о позиции, она обязательна для спавна скриптом. Ниже кординаты. Для снятия кординат используем в консоли rs_stats on. После кординат идёт сама функция спавна. alife():create("СИСТЕМНОЕ ИМЯ ОБЬЕКТА",a,33447,47,65535) Цифры пусть остануться такие же. Для обьекта спавна возмём wpn_ak47. Кординаты какие то левые, лучше снимите кординаты сами. И ещё кое что важное. В папке scripts, создаём файл main.script и пишем туда готовый текст, только со своими кординатами.
Код:
--*********************************************
--**TESTING**
--*********************************************
--
-- Создает в заданном месте калаш
function ak_create()
   local a = vector() -- db.actor:position()
   a.x = -220.21
   a.y = -19.93
   a.z = -158.98
   alife():create("wpn_ak47",a,33447,47,65535)
end

Написали? Отлично!. Теперь осталось только подключить это к игре. Идём в файл dialogs_escape.xml и выбираем какое нить диалог. Там после поля text в диалоге приписываем <action>main.ak_create</action> ТОЛЬКО ДИАЛОГ ВЫБИРАЕМ ИСПОЛЬЗУЮЩИЙСЯ. С волком например. Всё сохраняем и тестим. В итоге, когда вы в игре нажмёте на фразу после которой находится action, заспауниться калаш на указанных кординатах.

Углублённое изучение - Rez@niy
Далее идём в более углублённое изучение. Изучаем построение
Прописываем функцию. Задаём условие: if = Для закрытия тэга end
ПОКА ВСЁ, МОЖЕТ НАПИШУ ЕЩЁ ЧЁ НИТЬ ПОЛЕЗНОЕ
Ну и я напишу.Меченый(Стрелок)
Мой монолог построен так: В - Вопрос,О - Ответ
Начнём: В - Что такое ЦИКЛ? И как он выглядит? О - Цикл это повторение одного и того же действие n-ое кол-во раз выглядит так
for i=1,n do

end
За место i может быть любая переменная ,за место n - число которое больше первоначального значения(i) В - А для чего можно использовать цикл? О - много для чего можно.см. ниже Пример 1.Перебор по id/Узнаем монстор ли объект,если да ,то функция возвращает истину(true)
Код:
for id=1,65535 do
local obj = level.object_by_id(id)
if obj~= nil then
if IsMonster(obj) then
return true
else
return false
end
end
end

Пример 2.Спавн/
for i=1,5 do --функция повторится 5 раз,следовательно будет заспавнено 5 АК
Код:
local a = vector()
   a.x = -220.21
   a.y = -19.93
   a.z = -158.98
   alife():create("wpn_ak47",a,33447,47,65535)
end

и т.п. существует ещё цикл с предусловием (while a,n do),но об этом позже В - Какие параметры ГГ можно корректировать скриптами?
О - Таких не много, запись будет такой :
db.actor.параметр
Параметры:
radiation
health
psy_health
power
В - а можно ли спавнить в рандомной точке предмет,если да,то как? О - можно Для этого нам понадобится таблица максимальных значений level_vertex_id и game_vertex_id выглядит она так:
Код:
local level_vertexes={
l01_escape = {lvid=595580, gvid=44},
l02_garbage = {lvid=384039, gvid=265},
l03_agroprom = {lvid=438379, gvid=693},
l04_darkvalley = {lvid=392517, gvid=813},
l06_rostok = {lvid=69283, gvid=1311},
l07_military = {lvid=915663, gvid=1546},
l10_radar = {lvid=796328, gvid=1868},
l11_pripyat = {lvid=295965, gvid=2269}
}

ЗЫ:Извините ,что не для всех уровней,исправлюсь Так,таблица у нас есть ,теперь нам нужно написать функцию спавна.Давайте покажу на Монстрах создадим таблицу с секциями спавна монстров: (Я буду использовать свои наработки ,поэтому таких секции у вас не будет ,эта таблица -пример)
Код:
local mutants = {
"zombie_ghost_hell",
"zombie_normal_hell",
"zombie_immortal_hell",
"bloodsucker_weak_hell",
"tushkano_normal_hell",
"snork_weak_hell",
"burer_weak_hell",
"cat_weak_hell",
"chimera_weak_hell",
"gigant_strong_hell"
}

Таблицу записали ,наконец приступим к оформлению главной функции
Код:
function random_spawn()
local count = math.random(5,20) --выбираем кол-во заспавненых мобов
local section = mutants[math.random(table.getn(mutants))] -- выбираем секцию моба
local lv = math.random(level_vertexes[level.name()]["lvid"]) --выбираем левел вертекс
local gv = level_vertexes[level.name()]["gvid"] --выбираем гэйм вертекс
for ind = 1, count do
alife():create(section, level.vertex_position(lv), lv, gv)--\\level.vertex_position(lv) - позиция левел вертекса
end
end
Далее помещаем вызов функции в bind_stalker.script в net_spawn() и при каждой загрузке будут спавнится мобы в рандомной точке
Вступление ГГ в группировку! 1.Создаем файл ваше_название_скприпта.script в папке gamedata/scripts 2. Открываем его и пишем: --меняем группировку ГГ
Код:
function new_group(actor, npc)
if npc:character_community() ~= "(dolg)" then
npc:set_character_community("dolg", 0, 0)
end
end

Выдаём функцию при разговоре с НПС
НПС вступает в группировку
function ваше_название_функции(npc, actor)
Вызываем также, из любого диалога

Нельзя взять оружие без брони Пишем функцию в любом скрипе:
Код:
function ваше_название_функции() local armor = db.actor:item_in_slot(6) --слот брони (НЕ ТРОГАТЬ!) local weapon = db.actor:item_in_slot(2) --слот оружия (для пистолетов в оригинале слот 1)
if db.actor:active_slot()==2 and weapon then -- за место 2 пишем слот оружия еще раз local tmp if armor then tmp = armor:section() else tmp = "none" end
if (not string.find(tmp, "пишем_название_брони" )) and (weapon:section()=="пишем_название_оружия1" or weapon:section()=="пишем_название_оружия2" or weapon:section()=="пишем_название_оружия3") then --если необходима проверка одного оружия то надо писать так: if (not string.find(tmp, "exo" )) and weapon:section()=="wpn_pkm" then
db.actor:drop_item(weapon)
local tmpw = amk.spawn_item_in_inv(weapon:section())
db.actor:transfer_item(weapon,db.actor)
alife():release(tmpw)
news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000)
end
end

Далее идем по этому пути
gamedata/script/bind_stalker.script
Функция
Код:
function actor_binder:update(delta)

Сразу ниже неё пиши вызов в формате : название_файла.название_функции. Можешь написать эту функцию в любом файле из папки scripts, а можешь создать свой файл и назвать скажем my_script и написать там. Должно быть так : Код
Код:
function actor_binder:update(delta)
my_script.check_armor()

Удаление предмета из инвентаря
Код:
function name_function()
local se_obj = alife():object("сюда_пишем_что_удалять_будем")
if se_obj then
alife():release(se_obj, true)
end
end

ПРИМЕР --' убираем финального Клыка
Код:
function dell_kluk_final()
local se_obj = alife():object("final_kluk")
if se_obj then
alife():release(se_obj, true)
end
end


Я добвлю может кому и пригодится.Болотный Доктор
ВЫДАЁМ ПРЕДМЕТ АКТОРУ
function название функции (first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "название предмета", "in") end
Размещается в файлах скрипт.
Выдача поршня вставляется под строку действия. <action>название скрипта.название функции</action>
Примечание, что бы выдать два одинаковых предмета пишем
function название функции (first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "название предмета", "in",2) end
Если надо больше меняем цифру 2 на нужную нам.
ОТБИРАЕМ ПРЕДМЕТ У АКТОРА.
function название функции(first_speaker, second_speaker)
dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета")
end
размещается в файлах скрипт
выдача поршня вставляется под строку действия <action>название скрипта.название функции</action>
Примечание, что бы отобрать два одинаковых предмета пишем
function название функции(first_speaker, second_speaker)
dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета",2)
end
Если надо больше меняем цифру 2 на нужную нам.
СПАВНИМ ВЕЩЬ В РЮКЗАК гг
Код:
function название функции() local obj = alife():create("ВЕЩЬ", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end

В диалог <action>название скрипта.название функции</action>

ПРОВЕРКА НАЛИЧИЯ У АКТОРА ПРЕДМЕТА Вариант первый
Код:
function Название функции()
   if db.actor:object("название предмета") then
       return true
   end
   return false
end

в диалог
<precondition>имя скрипта.название функции</precondition>
<---------Вариант второй)------------------>
Код:
function название функции(first_speaker, second_speaker)
   return first_speaker:object("название предмета") ~= nil
end

в диалог
<precondition>имя скрипта.название функции</precondition>
ПРОВЕРКА ВЕЩЕЙ У ГГ function Название функции(first_speaker, second_speaker)
return first_speaker:object("название предмета") ~= nil or
first_speaker:object("название предмета") ~= nil or
first_speaker:object("название предмета") ~= nil
end
в диалог
<precondition>имя скрипта.название функции</precondition>
описание... если есть хотя бы одна вещь, то мы получим фразу, если нет всех нет разговора
ПРОВЕРКА ДЕНЕГ У ГГ Вариант первый(используют ПЫС)
Код:
function название функции(first_speaker, second_speaker)
   return first_speaker:money() >= 2000
end

в диалог
<precondition>имя скрипта.название функции</precondition>
<-----------Вариант два--------------> Использовал на ТЧ, но и в ЗП работает
Код:
function название функции() return db.actor:money()>=10000 end в диалог
<precondition>имя скрипта.название функции</precondition>
СПАВН ПРЕДМЕТА function spawn_vintar() alife():create("Название предмета",vector():set(24.725412368774,-3.6072344779968,173.83030700684),993926,210) end

В диалог
<action>название скрипта.название функции</action>

МГНОВЕННАЯ СМЕРТЬ ГГ
Код:
function название функции(npc, actor)
   npc:kill(actor)
end

В диалог
<action>название скрипта.название функции</action>
ПРОВЕРКА КОЛ_ВА ОДИНАКОВЫХ ПРЕДМЕТОВ
Код:
function название функции(first_speaker, second_speaker)
       local item_sections = {"Предмет"}
       local needed = количество одинаковых предметов, ставится цифра без знаков
       local count = 0
       local item_section
   local function calc(temp, item)
       if item:section() == item_section then
       count = count + 1
end end
   for k,v in pairs(item_sections) do
   item_section = v
   get_story_object("actor"):iterate_inventory(calc, actor)
end
   return count >= needed
end


в диалог <precondition>имя скрипта.название функции</precondition>
ЛЕЧЕНИЕ ГГ Вставим этот актион в диалог
<action>dialogs.medic_magic_potion</action>
ВЫДАЧА ДЕНЕГ от НПС ГГ
Код:
function название функции(first_speaker, second_speaker)
   dialogs.relocate_money_to_actor(first_speaker, second_speaker, 2000)
end

В диалог
<action>название скрипта.название функции</action>

ВЫДАЧА ДЕНЕГ от ГГ НПС
Код:
function название функции(actor, npc)
  dialogs.relocate_money(npc,кол-во,"out")   
end

В диалог
<action>название скрипта.название функции</action>

НПС становится врагом после определенной ветки диалона или другом -5000 враг 5000 друг

Код:
function название скрипта(actor, npc)
   npc:force_set_goodwill(-5000, actor)
end

<action>название скрипта.название функции</action>

ПРОВЕРКА СМЕРТТИ NPS
Код:
function название функции проверки(actor,npc)
  return has_alife_info("инфо смерти")
end


в диалог
<precondition>имя скрипта.название функции</precondition>
Категория: Скрипты

Просьба не оставлять коментарии типа: "спасибо за инфу", "прикольно" ну и т.п.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Начальные сведения о скриптах
СообщениеДобавлено: 16 июн 2011, 16:28 
Не в сети
Новичок
Новичок
Продвижение:
36.5%

Зарегистрирован: 08 июн 2011, 16:50
В кошельке:
50.00

Сообщения: 73

Откуда: адЪ
Не, я лучше пойду PHP учить )))
Но статейка классная!)

_________________
Изображение
йа тут(: VK , VS
  ▲
▲ ▲

This is true triforce, newfags can't do it right :D
The Unguided - Green Eyed Demon (тот самый Соник Синдикейт) :


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Начальные сведения о скриптах
СообщениеДобавлено: 21 июн 2011, 18:43 
Не в сети
Новичок
Новичок
Продвижение:
44.5%

Зарегистрирован: 13 авг 2009, 15:46
В кошельке:
50.00

Сообщения: 89

Откуда: Красная Слобода
BLINKoman182oldDAEM писал(а):
Не, я лучше пойду PHP учить )))

Правильное решение

_________________
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Начальные сведения о скриптах
СообщениеДобавлено: 23 авг 2011, 20:43 
Не в сети
Сталкер
Сталкер
Продвижение:
2.5%
Аватара пользователя

Зарегистрирован: 22 июл 2011, 23:09
В кошельке:
50.00

Сообщения: 215

Откуда: г.Дрогичин
Согласен с вами

_________________
Изображение


Наш прикол


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 2 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
cron

[Мобильная версия]

Создано на основе phpBB® Forum Software © phpBB Group
[ Time : 0.254s | 31 Queries | GZIP : On ]

PlayStation style by HighDefGeek