Скриптование - Страница 382 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

Тема для обсуждения скриптов всего и всех в серии игр 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
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

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(), а сама проблема пока встретилась единственный раз - я не совсем представляю как мне это ловить...

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

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

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

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

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

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

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

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

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

А как заставить 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(). Где надо свои скрипты регистрировать, чтобы это работало?

 

 

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

 

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

function 123()

end

 

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

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

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

 

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
_g.script,

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

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

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

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
@Kober(BRUC), в Луа 5.3 завезли юникод, сохраняй файл в UTF-8. Если ты про сталкеровскую Луа, попробуй сохранить в cp1251.
  • Спасибо 1

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

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

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

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

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

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

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

Войти

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

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

×
×
  • Создать...