Перейти к контенту

Рекомендуемые сообщения

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

Upd: кстати, вот только в новой соли аналогичную проблему поймал. Правда там вылетает прямо при сохранении. Разбираюсь. Конкретно смотрю, что  у кого сохраняется, и где повиснет.

Ссылка на комментарий
function motivator_binder:save(packet)
--    printf("motivator_binder:save(): self.object:name()='%s'", self.object:name())
    object_binder.save(self, packet)

    packet:w_bool(self.treasure_processed)

    xr_logic.save_obj(self.object, packet)
    dialog_manager.save(self.object, packet)
    trade_manager.save(self.object, packet)
end

Собственно вот, больше там ничего нет.

Учитывая что у меня на руках есть сейв где при загрузке - виснет, но нету такого с которого я мог бы сохраниться и получить суть проблемы в методе save(), а сама проблема пока встретилась единственный раз - я не совсем представляю как мне это ловить...

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

local save_ok = 0

function motivator_binder:save(packet)

if save_ok ~= 0 then bind_stalker.error = true; abort( ... ) end

object_binder.save(self, packet)

save_ok = 1

и т.д. после каждой строчки,

save_ok = 0

end

 

В обновлении актора - проверка error и вылет с руганью.

 

 

Для xr_logic я где-то давал код сохранения/загрузки с контролем по осмысленности прямо по ходу действия. Там вылет более надежен, и не надо проверять конец пакета в биндерах.

Изменено пользователем Dennis_Chikin
  • Спасибо 1
Ссылка на комментарий

Это мне поможет узнать если опять в сохраняемую инфу полезет что-то не то - я поймаю вылет, в логе увижу результаты этого безобразия.

Но уже полученный убитый сейв получается никак не оживить и не выяснить почему он убился?

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

@Zander_driver, то, что там 6 строчек - это ничего не значит. Вот тот же trade_manager прекрасно может битый сейв сделать. Из свежих воспоминаний. Соляночный Седой на АТП. Из-за наличия легкого бреда в конфиге торговли, сейв с ним в онлайне получался битый.

Но уже полученный убитый сейв получается никак не оживить

Ну почему не оживить. По тому, что ты показывал, у тебя не записалась онлайновая часть для Сахарова. Ну и бог бы с ним. Убери в скрипте для него abort, загрузись и переспаунь инвалида.

Ссылка на комментарий

Да это то понятно) и одна строчка может бред сотворить.

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

Вопрос, наверно, глупый, но как вызывать функции из других скриптов без указания имени скрипта, в котором функция находится? Как это сделано, например, в _g.script. Там, полагаю, и нужно решать все это дело.

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

А как заставить Lua работать с Русскими буквами? Вот код и он не работает:

local say = "Гора" -- Текст на Русском языке

local say = say:match("(.)$")

function as()
if say == "а" then
print(say)
end
end

as()

print(say)

Выдает вот такой символ: "�". А сама функция не работает

  • Согласен 1
Ссылка на комментарий
@Dennis_Chikin, что не так? Повторю. Как можно вызывать функции из других скриптов, при это не указывая их имя(скриптов, разумеется). Вот есть _1.script, в нем функция 123, как её вызвать из других скриптов без указания имени скрипта? _1.123(), а я хочу 123(). Где надо свои скрипты регистрировать, чтобы это работало?

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

 

 

Где надо свои скрипты регистрировать, чтобы это работало?

 

Я не заморачиваюсь с принцпиальностью. Этот твой вызов местного значения, для конкретного документа. Трудно ниже создать функцию?

function 123()

end

 

Неужели твоя функция такая важная, что бы её можно было внедрять в других документах, по твоему желанию. Даже разрабы незаморачивались и делали _1.123()

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий
@Дизель, ну я же задал вопрос. Ответа в твоём посте что-то не вижу, по делу, пожалуйста. Какая разница, для каких мне целей оно надо? Для удобства.

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

Вот теперь понятно.

 

function _G.blabla()

...

end

 

Или function blabla()

...

end

 

_G.blabla = this.blabla

 

В обоих случах скрипт должен быть сначала хоть раз откуда-нибудь вызван с любой целью.

хоть дернуть за function init() end

 

 

или, для текущего скрипта this.blabla = 123.blabla

и далее везде можно писать просто blabla()

Изменено пользователем Dennis_Chikin
  • Спасибо 1
  • Полезно 1
Ссылка на комментарий

@Дизель, give_info, abort. Только они зареганы в _g.script, а я хочу в своём файле сделать подобное.

 

Денис, спасибо, сразу твой пост не заметил. С телефона просто...

Изменено пользователем BoBaH_671

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий
_g.script,

этот файл является родительским для некоторых функций. потому тебе там всё равно надо регистрировать.

Изменено пользователем Дизель

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий

Этот файл не является "родительским". Он является запускаемым по умолчанию.

http://www.lua.ru/doc/6.html

 

Практическое применение, из модифицированного amk.script:

 

this.parse_custom_data = parse_custom_data -- для идиотов, устраивающих "войны правок"

this.gen_custom_data = gen_custom_data

 

local force_offline = _G.force_offline

if not force_offline then

force_offline = {}

_G.force_offline = force_offline

end

convert_npc = force_offline

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

Добрый день. Где же я упустил ошибку?:

local number = 10
say_tbl_one_ru = {  -- Таблица с русскими ответами. 'Угадай число';
"Не верно. Чуть больше.",
"Не верно. Чуть меньше.",
"Вы угадали! Число равно:"
}
local complexity = 'esay' -- 'esay' - Легко; 'normal' - Срдне; 'hard' - Хардкор; 'random' - Рандомное число от 100, до 10000

function gl()
if complexity == 'esay' then
local cly = 25
elseif complexity == 'normal' then
local cly = 100
elseif complexity == 'hard' then
local cly = 1000
elseif complexity == 'random' then
local ran_data = math.randomseed(os.time())
local ran_data = math.random(100, 10000)
local cly = ran_data
local num = math.random(1, cly)
if number < num then
print(say_tbl_one_ru[1])
elseif number > num then
print(say_tbl_one_ru[2])
elseif number == num then
print(say_tbl_one_ru[3])
end
end
end

gl()
Изменено пользователем Kober(BRUC)
Ссылка на комментарий

@Kober(BRUC)

1. "local cly = 25" и т. п., если не ошибаюсь, видно только в пределах своей ветки if ... else. Следует объявить переменную до if, а внутри только задавать значение.

2. math.randomseed результат не возвращает, а только задаёт случайное смещение для последующего math.random. Присваивание переменной в данном случае лишнее.

3. Выбор фразы для печати ты делаешь в одной из веток внутри if, а не за пределами оного. Конкретно, печать у тебя происходит только в случае опции "random".

4. Судя по всему, навыки чтения кода у тебя не очень высокие. В этом случае, чтобы делать меньше ошибок, будет хорошей практикой использовать отступ для вложенных элементов.

local number = 10
say_tbl_one_ru = {  -- Таблица с русскими ответами. 'Угадай число';
  "Не верно. Чуть больше.",
  "Не верно. Чуть меньше.",
  "Вы угадали! Число равно:"
}
local complexity = 'esay' -- 'esay' - Легко; 'normal' - Срдне; 'hard' - Хардкор; 'random' - Рандомное число от 100, до 10000
 
function gl()
  if complexity == 'esay' then
    local cly = 25
  elseif complexity == 'normal' then
    local cly = 100
  elseif complexity == 'hard' then
    local cly = 1000
  elseif complexity == 'random' then
    local ran_data = math.randomseed(os.time())
    local ran_data = math.random(100, 10000)
    local cly = ran_data
    local num = math.random(1, cly)
    if number < num then
      print(say_tbl_one_ru[1])
    elseif number > num then
      print(say_tbl_one_ru[2])
    elseif number == num then
      print(say_tbl_one_ru[3])
    end
  end
end
 
gl()

local number = 10
say_tbl_one_ru = {  -- Таблица с русскими ответами. 'Угадай число';
  "Не верно. Чуть больше.",
  "Не верно. Чуть меньше.",
  "Вы угадали! Число равно:"
}
local complexity = 'esay' -- 'esay' - Легко; 'normal' - Срдне; 'hard' - Хардкор; 'random' - Рандомное число от 100, до 10000
 
function gl()
  local cly
  if complexity == 'esay' then
    cly = 25
  elseif complexity == 'normal' then
    cly = 100
  elseif complexity == 'hard' then
    cly = 1000
  elseif complexity == 'random' then
    math.randomseed(os.time())
    cly = math.random(100, 10000)
  end

  local num = math.random(1, cly)
  if number < num then
    print(say_tbl_one_ru[1])
  elseif number > num then
    print(say_tbl_one_ru[2])
  else
    print(say_tbl_one_ru[3])
  end
end
 
gl()

 

Изменено пользователем Kirgudu
  • Спасибо 1
  • Сомнительно 1
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...