IPB

Помощь по разделу

Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов

>

Скрипты

 
 Орион
сообщение 13.07.2009, 11:34
Сообщение #201


Навий черны у ношьти
***************

Группа: Забанен
Сообщений: 2210
Регистрация: 11.03.2009
Из: Лиманск
Пользователь №: 10251




FAQ

Lua в X-Ray

Список всех функций, переменных, классов и т.п. что используются в Сталкере находится по адресу:
Код
gamedata/scripts/lua_help.script

Для получения файла надо распаковать игру. Можно скачать, в принципе (IMG:style_emoticons/default/smile.gif) Тут =>>Ссылко<<=
Уроки

Пример создания непися скриптами ЛУА. Автор: меченый(стрелок)
Скриптинг на инсайде



Сообщение отредактировал RayTwitty - 09.06.2018, 20:23
Перейти в начало страницы
 
 
 
Ответов
 aka_sektor
сообщение 05.12.2017, 20:48
Сообщение #202


Грандмастер
**************

Группа: Участник
Сообщений: 1770
Регистрация: 04.04.2013
Из: Беларусь
Пользователь №: 16432



Цитата(RayTwitty @ 05.12.2017, 20:15) *
ставить колбек

Да, там ниже это и предложили: http://www.amk-team.ru/forum/topic/8806-co...;comment=350365

Вот только с колбеком on_item_take есть косяк, описанный в этом посте: http://www.amk-team.ru/forum/topic/6185-sk...comment=1122162

Цитата(RayTwitty @ 05.12.2017, 20:15) *
надо делать на net_spawn

Можешь показать?

Вообще, предложили дописать проверку актера на nil, вот так:
Код
function sad_predateli_pda()
if db.actor ~= nil and db.actor:object("sad_mudak_pda") ~= nil and not db.actor:has_info("sad_predateli_info") then
db.actor:give_info_portion("sad_predateli_info")
end
end


UPD:
Проверил - больше не вылетает.

Сообщение отредактировал aka_sektor - 05.12.2017, 21:05
Перейти в начало страницы
 
 
 RayTwitty
сообщение 27.05.2018, 17:00
Сообщение #203


Босс
********************

Группа: Участник
Сообщений: 4257
Регистрация: 24.09.2010
Пользователь №: 14086



Запамятовал, ключом таблицы в Lua может быть только строка или целое число?))

upd:
Цитата
Тип table (таблица) реализует ассоциативные массивы, это значит, что массив может быть проиндексирован не только числами, но и любым Lua значением, кроме nil и NaN. (Not a Number специальное значение для представления неопределенных и непредставимых числовых результатов, таких как 0/0.) Таблицы могут быть гетерогенными (разнородными); т.е. могут содержать значения всех типов (кроме nil). Любой ключ со значением nil не считается частью таблицы. И наоборот, любой ключ, не являющийся частью таблицы, имеет ассоциированное значение nil.

Действительно работает))
Код
local t1 = { [1] = "one" }

local t2 = { [t1] = "two" }

print(t2[t1]) --> "two"

Хотя на практике я не встречал, чтобы в качестве ключей использовалось что-то отличное от числа или строки.

Сообщение отредактировал RayTwitty - 27.05.2018, 17:30
Перейти в начало страницы
 
 
 TIGER_VLAD
сообщение 27.05.2018, 17:59
Сообщение #204


Опытный Игрок
****

Группа: Участник
Сообщений: 54
Регистрация: 26.07.2015
Пользователь №: 22186



Цитата(RayTwitty @ 27.05.2018, 17:00) *
Запамятовал, ключом таблицы в Lua может быть только строка или целое число?))

upd:
Цитата
Тип table (таблица) реализует ассоциативные массивы, это значит, что массив может быть проиндексирован не только числами, но и любым Lua значением, кроме nil и NaN. (Not a Number специальное значение для представления неопределенных и непредставимых числовых результатов, таких как 0/0.) Таблицы могут быть гетерогенными (разнородными); т.е. могут содержать значения всех типов (кроме nil). Любой ключ со значением nil не считается частью таблицы. И наоборот, любой ключ, не являющийся частью таблицы, имеет ассоциированное значение nil.

Действительно работает))
Код
local t1 = { [1] = "one" }

local t2 = { [t1] = "two" }

print(t2[t1]) --> "two"

Хотя на практике я не встречал, чтобы в качестве ключей использовалось что-то отличное от числа или строки.


А еще для строковых ключей квадратные скобки можно не указывать:
local my_t = {green="зеленый", yellow="желтый", red="красный"}
Перейти в начало страницы
 
 
 kiperenok
сообщение 09.06.2018, 19:56
Сообщение #205


Игровой Эксперт
***************

Группа: Участник
Сообщений: 2451
Регистрация: 14.02.2009
Из: Украина, Луганск
Пользователь №: 9848



Объясните пожалуйста синтаксис второй строчки кода, что делает двоеточие ? Вообще интересует синтаксис двоеточия в Lua.

local visualMonitor = require( "com.ponywolf.visualMonitor" ) -- к локальной переменной visualMonitor подключить файл visualMonitor
local visMon = visualMonitor:new()
Перейти в начало страницы
 
 
 RayTwitty
сообщение 09.06.2018, 20:14
Сообщение #206


Босс
********************

Группа: Участник
Сообщений: 4257
Регистрация: 24.09.2010
Пользователь №: 14086



Цитата(kiperenok @ 09.06.2018, 19:56) *
Объясните пожалуйста синтаксис второй строчки кода, что делает двоеточие ?

Обращение к полю. Погугли операторы и метатаблицы Lua.

Вот неплохое руководство по Lua: https://yadi.sk/d/4EUvTWhzdnAve
Перейти в начало страницы
 
 
 kiperenok
сообщение 09.06.2018, 20:22
Сообщение #207


Игровой Эксперт
***************

Группа: Участник
Сообщений: 2451
Регистрация: 14.02.2009
Из: Украина, Луганск
Пользователь №: 9848



Цитата(RayTwitty @ 09.06.2018, 20:14) *
Цитата(kiperenok @ 09.06.2018, 19:56) *
Объясните пожалуйста синтаксис второй строчки кода, что делает двоеточие ?

Обращение к полю. Погугли операторы и метатаблицы Lua.

Вот неплохое руководство по Lua: https://yadi.sk/d/4EUvTWhzdnAve

А так это просто книга Роберта Иерусалимски - просто интерактиваная. Спасибо что скинул ссылку. Че то бегло пробежался по метатаблицам и такого не увидел (IMG:style_emoticons/default/sad.gif)
Перейти в начало страницы
 
 
 abramcumner
сообщение 09.06.2018, 20:27
Сообщение #208


Босс
********************

Группа: Участник
Сообщений: 4348
Регистрация: 27.04.2011
Из: Россия
Пользователь №: 14366



Цитата(kiperenok @ 09.06.2018, 20:22) *
Че то бегло пробежался по метатаблицам и такого не увидел (IMG:style_emoticons/default/sad.gif)

А в операторах нет оператора двоеточие и в метатаблицах нет (IMG:style_emoticons/default/smile.gif)
Двоеточие это синтаксический сахар для сокращения записи.
Запись
local visMon = visualMonitor:new()
эквивалентна
local visMon = visualMonitor.new(visualMonitor)

То есть объект перед двоеточием передается первым параметром в функцию.
А при объявлении функции через двоеточие в функцию добавляется первый аргумент self.

https://www.lua.org/manual/5.3/manual.html#3.4.11
Цитата
The colon syntax is used for defining methods, that is, functions that have an implicit extra parameter self. Thus, the statement
function t.a.b.c:f (params) body end
is syntactic sugar for
t.a.b.c.f = function (self, params) body end


Сообщение отредактировал abramcumner - 09.06.2018, 20:27
Перейти в начало страницы
 
 
 kiperenok
сообщение 19.06.2018, 14:07
Сообщение #209


Игровой Эксперт
***************

Группа: Участник
Сообщений: 2451
Регистрация: 14.02.2009
Из: Украина, Луганск
Пользователь №: 9848



abramcumner помоги со следующим: (IMG:style_emoticons/default/rolleyes.gif)

function instance:touch(event)
self.xScale, self.yScale = 0.95, 0.95
end


Как я это понял - self это первый скрытый параметр у функции, тогда получается у функции touch первым аргументом идет instance, а вторым event.
Тогда self.xScale равносильно instance.xScale ?
Перейти в начало страницы
 
 
 Neo][
сообщение 19.06.2018, 14:33
Сообщение #210


The One
****************

Группа: Участник
Сообщений: 2715
Регистрация: 05.12.2005
Из: Наша Раша
Пользователь №: 2566



kiperenok, по вопросу - в зависимости от того, как вызываешь touch и да, и нет (IMG:style_emoticons/default/smile.gif)
Если вызываешь, как instance:touch(ev) или instance.touch(instance, ev) то да, если же как instance.touch(other_table, ev) то нет.

Я думаю эта ссыль отвечает на все вопросы )

Сообщение отредактировал Neo][ - 19.06.2018, 14:36
Перейти в начало страницы
 
 
 kiperenok
сообщение 19.06.2018, 15:36
Сообщение #211


Игровой Эксперт
***************

Группа: Участник
Сообщений: 2451
Регистрация: 14.02.2009
Из: Украина, Луганск
Пользователь №: 9848



Цитата(Neo][ @ 19.06.2018, 14:33) *
Я думаю эта ссыль отвечает на все вопросы )

Не в моем случае (IMG:style_emoticons/default/laugh.gif) Там все на английском.
Перейти в начало страницы
 
 
 abramcumner
сообщение 19.06.2018, 16:12
Сообщение #212


Босс
********************

Группа: Участник
Сообщений: 4348
Регистрация: 27.04.2011
Из: Россия
Пользователь №: 14366



Цитата(kiperenok @ 19.06.2018, 14:07) *
Как я это понял - self это первый скрытый параметр у функции, тогда получается у функции touch первым аргументом идет instance, а вторым event.
Тогда self.xScale равносильно instance.xScale ?

Да, все правильно. Но это странный подход - разбирать код таким образом (IMG:style_emoticons/default/smile.gif)
Тебе абревиатура ООП о чем-нибудь говорит? Объекты там, классы.

Цитата
Не в моем случае laugh.gif Там все на английском.

RayTwitty давал ссылку на эту же книгу на русском (IMG:style_emoticons/default/smile.gif)
Перейти в начало страницы
 
 
 kiperenok
сообщение 19.06.2018, 19:23
Сообщение #213


Игровой Эксперт
***************

Группа: Участник
Сообщений: 2451
Регистрация: 14.02.2009
Из: Украина, Луганск
Пользователь №: 9848



Цитата(abramcumner @ 19.06.2018, 16:12) *
RayTwitty давал ссылку на эту же книгу на русском (IMG:style_emoticons/default/smile.gif)

Нашел в книге на русском эту главу, прочитал - вот теперь все понятно. Всем кто помог БОЛЬШОЕ спасибо ! (IMG:style_emoticons/default/wink.gif)
Перейти в начало страницы
 
 
 atanda
сообщение 12.12.2018, 16:19
Сообщение #214


Почти Игроман
*********

Группа: Участник
Сообщений: 534
Регистрация: 05.11.2017
Из: Далеко в Сибири
Пользователь №: 28310



Последняя luabind на текущий момент 0.7.1(2014 год) судя соурсфоржу и гиту. Проект в каком либо виде поддерживается на данный момент?

Сообщение отредактировал buffy - 12.12.2018, 16:19
Перейти в начало страницы
 
 
 Marafonec
сообщение 27.09.2019, 18:39
Сообщение #215


Ветеран
*****

Группа: Участник
Сообщений: 82
Регистрация: 13.09.2011
Из: Новозыбков
Пользователь №: 14450



Парни, может кто подсказать в чем кроется проблема?
Вот такой код
Код
for cf, sec in string.gmatch(str, "%s*([%\%.-_%w]+)%s*%|%s*([-_%w]+)%s*") do
валит игру с логом:
Код
SCRIPT SYNTAX ERROR:
c:\ogsr\gamedata\scripts\_utils.script:225: invalid escape sequence near '"%s*([%'

Использую недавно вышедший движок OGSR x64. На оригинальном движке ТЧ этот код работает безо вских проблем.
Перейти в начало страницы
 
 
 Trollz0r
сообщение 28.09.2019, 01:37
Сообщение #216


Почти Игроман
*********

Группа: Участник
Сообщений: 568
Регистрация: 28.05.2010
Из: Кайфовая республика, Атдушинский район
Пользователь №: 13942



Небось старый луа просто тихо удалял бекслеш, а новый уже не переваривает кривые ескейп-последовательности и хочет, чтобы ты экранировал \. Попробуй добавить ещё один бекслеш перед существующим. Хз как в огср, но в обычном луа5.3 оно вывелось без ошибок: https://rextester.com/live/XSSP38105


А что вообще должна делать эта регулярка?
Перейти в начало страницы
 
 
 abramcumner
сообщение 28.09.2019, 11:06
Сообщение #217


Босс
********************

Группа: Участник
Сообщений: 4348
Регистрация: 27.04.2011
Из: Россия
Пользователь №: 14366



Цитата(Люпус Эст @ 28.09.2019, 01:37) *
А что вообще должна делать эта регулярка?

Ищет пары слов, разделенные вертикальной чертой.
Перейти в начало страницы
 
 
 Marafonec
сообщение 28.09.2019, 13:07
Сообщение #218


Ветеран
*****

Группа: Участник
Сообщений: 82
Регистрация: 13.09.2011
Из: Новозыбков
Пользователь №: 14450



Цитата(Люпус Эст @ 28.09.2019, 01:37) *
Попробуй добавить ещё один бекслеш перед существующим.
Спасибо, помогло.

Цитата(Люпус Эст @ 28.09.2019, 01:37) *
Хз как в огср, но в обычном луа5.3 оно вывелось без ошибок
Судя по логу: "--LUA version: [LuaJIT 2.1.0-beta3]"

Цитата(Люпус Эст @ 28.09.2019, 01:37) *
А что вообще должна делать эта регулярка?
+++
--/summary/>> функция парсинга параметров файла "overrides_by_schemes.ltx"
function getTableValuesParam(str)
local all_els = {}
--'парсим скриптовые таблицы
for ft in string.gmatch(str, '%"%s*([-_%.%w]+)%s*%"') do
local base_tbl, file_name
local tbl_name = ft
for f, t in string.gmatch(ft, "([-_%w]+)%.([-_%w]+)") do
file_name = f
tbl_name = t
end
if file_name and tbl_name then
base_tbl = _G[file_name] and _G[file_name][tbl_name]
else
base_tbl = _G[ft]
end
if type(base_tbl) == "table" then
for k in pairs(base_tbl) do
table.insert(all_els, k)
end
end
end
--'парсим конфиговые списки параметров
for cf, sec in string.gmatch(str, "%s*([%\\%.-_%w]+)%s*%|%s*([-_%w]+)%s*") do
--'"%s*([%'
local ini = ini_file(cf)
if ini and ini:section_exist(sec) then
do
local ind = 0
repeat
local valid, id, value = ini:r_line(sec, ind, "", "")
if valid then
table.insert(all_els, id.." >> "..value)
end
ind = ind + 1
until (not valid)
end
end
end
--'парсим дополнительные параметры
for pm, list in string.gmatch(str, "%s*([%+%-])%s*%{%s*([-_%s%,%w]+)%s*%}") do
for el in string.gmatch(list, "%s*([^%,%s][-_%w]+)%s*") do
if pm == "+" then
table.insert(all_els, el)
end
if pm == "-" then
local ind = 0
for i, v in ipairs(all_els) do
if v == el then
ind = i
break
end
end
if ind > 0 and all_els[ind] then
table.remove(all_els, ind)
end
end
end
end
return all_els
end

Перейти в начало страницы
 
 
 Pavel_Blend
сообщение 14.11.2019, 17:11
Сообщение #219


Продвинутый геймер
********

Группа: Участник
Сообщений: 314
Регистрация: 12.11.2012
Пользователь №: 15200



Я сегодня ещё раз начал вникать в луа. Частично прочитал несколько небольших учебников. Появились вопросы:

1) что это за слово class? Понятно, что создаёт класс, но в Notepad++ это ключевое слово даже не подсвечивается цветом. Такое ощущение, что эта вещь есть только в сталкеровских скриптах. Это слово class ведь не стандартная для языка часть?

2) как в луа работает система модулей и пакетов? В книжках пишут, что нужно использовать require. Но в сталкерских скриптах нету ни одного require. Я заметил, что модули используются без импорта. Например, если в папке gamedata\scripts есть файл my_module.script, то чтобы использовать функции из этого модуля, нужно сразу (без импорта) к ним обращаться: my_module.my_funct()
В питоне с модулями всё по-другому. Их всегда нужно импортировать так: import my_module, а потом использовать так: my_module.my_funct(). Но в луа я не совсем понимаю, как обращаться к коду из вне. Всё как волшебство какое-то. Пишем my_module.my_funct() и он сам импортируется что ли?

3) откуда растут ноги у скриптов сталкера? Какой скрипт вызывается самым первым? Что является началом работы скриптов?

4) как скриптом вывести в игровую консоль сообщение? printf вроде не работает.
Перейти в начало страницы
 
 
 abramcumner
сообщение 14.11.2019, 17:33
Сообщение #220


Босс
********************

Группа: Участник
Сообщений: 4348
Регистрация: 27.04.2011
Из: Россия
Пользователь №: 14366



Цитата(Pavel_Blend @ 14.11.2019, 17:07) *
1) что это за слово class? Понятно, что создаёт класс, но в Notepad++ это ключевое слово даже не подсвечивается цветом. Такое ощущение, что эта вещь есть только в сталкеровских скриптах. Это слово class ведь не стандартная для языка часть?

Это магия луа+луабинд.
Луа: при вызове функции с одним строковым(таблицей) параметром можно опускать скобки. Записи class("se_stalker") и class "se_stalker" эквивалентны.
Луабинд: добавляет функцию class и прочую обвязку. См. luabind open.cpp

Цитата
2) как в луа работает система модулей и пакетов? В книжках пишут, что нужно использовать require. Но в сталкерских скриптах нету ни одного require. Я заметил, что модули используются без импорта. Например, если в папке gamedata\scripts есть файл my_module.script, то чтобы использовать функции из этого модуля, нужно сразу (без импорта) к ним обращаться: my_module.my_funct()
В питоне с модулями всё по-другому. Их всегда нужно импортировать так: import my_module, а потом использовать так: my_module.my_funct(). Но в луа я не совсем понимаю, как обращаться к коду из вне. Всё как волшебство какое-то. Пишем my_module.my_funct() и он сам импортируется что ли?

Это магия движка. Если не находится таблица my_module, пытается подгрузить из одноименного файла .script.

Цитата
3) откуда растут ноги у скриптов сталкера? Какой скрипт вызывается самым первым? Что является началом работы скриптов?

Формально наверное _G.script. Но скрипты, привязанные к серверным и клиентским объектам, диалогам и прочему, вызываются "сами по себе".

Цитата
4) как скриптом вывести в игровую консоль сообщение? printf вроде не работает.

Если собрать движок без дефайна MASTER_GOLD работает и printf и log. Если на оригинальном движке, то только через console():execute("load ~~~"..escape(msg)). Типа загружаешь несуществующий сейв, движок ругается на его отсутствие и выводит твою строку (IMG:style_emoticons/default/smile.gif) В принципе во всех модах есть уже готовая функция log/dbglog.
Перейти в начало страницы
 
 
 Modera
сообщение 14.11.2019, 17:40
Сообщение #221


ням-ням❤️
**********************

Группа: Участник
Сообщений: 6141
Регистрация: 30.07.2010
Пользователь №: 13969



Цитата(abramcumner @ 14.11.2019, 17:29) *
Это магия луа+луабинд.
Луа: при вызове функции с одним строковым(таблицей) параметром можно опускать скобки. Записи class("se_stalker") и class "se_stalker" эквивалентны.
Луабинд: добавляет функцию class и прочую обвязку. См. luabind open.cpp

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

 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 01.10.2020, 22:47