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

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

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


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

  Информация (Показать)

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

 

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

  Читать рекомендуется. (Показать)

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


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

Снова для тех, кто пользуется модулями от Artos.

На этот раз под прицел попали:

  • скрипт «Общие функции» (m_helper) от 28.09.2013 из этого поста;
  • модуль «Универсальные таймеры» (m_timers) от 23.09.2013 из этого поста.

В обоих модулях (в m_timers постольку, поскольку этот модуль содержит в себе m_helper) обнаружена и исправлена ошибка, приводившая к вылету при попытке определения типа патронов в стволе и режима стрельбы из подствольника. Какие-либо другие изменения авторского кода не производились.

 

Ссылки на скачивание архивов с исправленной ошибкой:

https://yadi.sk/d/HYBcS9iccfWMV - «Общие функции»

https://yadi.sk/d/DPa6ZiGscfWeY - «Универсальные таймеры»

  • Спасибо 2
  • Нравится 1
  • Полезно 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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

А проверьте-ка меня, кто читать умеет (xr_gulag.script):

 

Первый акт марлезонского балета:

function gulag:availJob(job)
	if job.begin == nil or game.time() - job.begin > job.idle then
		...
	end
	return false
end
- если на работу кто-то назначен, у нее есть idle, и этот idle не вышел - возвращается false

 

Второй акт марлезонского балета:

function gulag:prepare_available_jobs()
	local Job_avail = {}
	for i, job in ipairs( self.Job_avail_in_state ) do
		if self:availJob( job ) then
			if not self:availCurrent( job ) or not self.Object_begin_job[job.object] then
				self:free_obj_and_reinit( job.object )
			end
			table.insert( Job_avail, job )
		end
	end
	return Job_avail
end
- если у работы есть таймаут, то если задано idle, и idle не истекло, он здесь не проверяется, и, соотвественно, obj с работы никогда не освобождается.

А если idlе не задан или вышел - то когда obj будет освобожден по таймауту, работа попадет в список доступных, и obj тут же снова будет на нее назначен. Так ?

 

А тетьим актом марлезонского балета будет попытка осовободить obj'а с id nil со всех доступных работ, поскольку ЭТОТ obj до них явно еще не дошел.

 

Вопрос: где я не прав, а если прав, то гуманности ли ради ?

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

Нарисовал-бы диаграммой этот "xr_gulag.script", тогда, и не умеющие читать увидели-бы...

И вообще, кто какие сталкерские менеджеры хорошо знает - опубликовали-бы их алгоритмы, для "эффективности прогресса".

Изменено пользователем 7.9
  • Нравится 1
  • Согласен 2

всё легко

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

А этим занимаются в очередном, хе-хе, антисоветском подполье. ;)

Да, кстати, о птичках: Йож, как известно, птица - гордая. Пока не пнешь - не полетит.
Для неписей в офлайне таким магическим пинком является
function se_smart_terrain:task( obj ) ... return CALifeSmartTerrainTask( self.gulag.ObjectJobPathName[obj.id] ) end

При этом непись рывком перемещается на некое расстояние по-ближе к первой точке пути работы.

 

Откуда оно вообще вызывается, и каким образом оно связано с освобождением/назначением непися на работу, я лично нифига не понял. Но как-то связано. По крайней мере, с частотой.

А теперь читаем мой пост выше в части, касающейся, хе-хе, первого акта марлезонского балета. Результат, хе-хе, немного, хе-хе, предсказуем.
 

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

@Kirgudu, за луа_хелпер могу сказать, что некоторые функции там не дописаны, и некоторые приводят к вылетам, их тоже следует дополнить и/или поправить. Artos сам говорил, что это далеко не окончательный вариант, и каждый в праве править под себя все функции. Кое-что мне у него не нравится и я пишу по своему, т.е... ну неофициальной доработкой этого заниматься как-то глупо. Кто их использует - тот доделает, а кто не использует - тому и не нужно. Так же можно функционал таймеров расширить и т.п. Ошибок таких как у тебя не ловил, за исправления спасибо, заберу.

 

@7.9, у всех типов менеджеров структура одна и та же, пойми один и поймешь все. Такое расписывать - дело не благодарное, а время прогрессов прошло, кто что хотел уже все давно сделали.

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

Господа, может кто встречался. Хотел адаптировать свой мод под 6патч. Диалог медеджер у меня не используется. Игра запускается, все работает, в начале сохранения все грузятся, но потом через какое-то время сохранки бьются вот с таким логом.

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...s\s.t.a.l.k.e.r\gamedata\scripts\xr_motivator.script:374: attempt to index a nil value
 

stack trace:

у мня это вот такая строка

self.npc_script_version = alife():object(self.object:id()).script_version

Из-за чего это может быть? Использую проводников, но они есть под 6 патч.  Скрипты Сяка используются.

 

Единственное, что здесь может дать такой вылет - отсутствие self.object - что, в общем-то, странно.

А скрипт показать (на дропбокс или еще какой ЯД) ? dc

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

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

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

@Хемуль36рус, надо адаптировать мотиватор от 6 патча, там есть разности в сохранениях, поэтому и вылеты при загрузке. так же еще таск менеджер и диалог менеджер.

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

Может это.https://www.dropbox.com/s/9xrmf89huigsocm/xr_motivator.script?dl=0

  здесь (Показать)
Изменено пользователем Dennis_Chikin

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

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

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

был такой код

  тык (Показать)

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

function trader_init(obj, data)

xr_logic.pstor_store(tobj, "assort", data)

 

Ну вот оно и записалось. Или я чего-то не понимаю ?

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

Вторая строка находится внутри локально объявленной функции ft. И эту функцию как аргумент передали другой функции, чтобы там уже ее вызвать. Внутри этой ft - data никак не объявлена. Она (ft) что, прихватывает с собой все namespace того модуля, в котором была локально объявлена внутри другой функции?

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

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

 

Одно из назначений замыканий - асинхронный код. Т.е. мы вызываем функцию, в нее передаем т.н. коллбэк (или каллбэк, как угодно) - другую функцию, но мы не можем с уверенностью сказать, в какой момент времени будет вызван этот коллбэк. При этом мы можем использовать замыкания - использовать в коллбэке переменные из области видимости, где он сам создается. Весьма банальный пример есть на википедии.

Изменено пользователем Desertir
  • Согласен 2

ТЧ 1.0004. SAP и Trans mod

github

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

А если я делаю так

class "my_SMALL_class"

...

function my_SMALL_class:Get_f()
   local f = function()
      return self
   end
   return f
end

Потом где-нибудь вызову у объекта моего класса метод Get_f, полученную функцию куда-то там передам, потом ее вызову опосля

local my_obj = my_script.my_SMALL_class()
local my_F = my_obj:Get_f()
local x = my_F()

- она мне вернет ссылку на этот объект класса, так чтоли?

Вроде такое не работало насколько я помню...

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

Вроде как да. До тех пор, пока будет существовать ссылка на переменную f - будет доступен объект в котором этот f был создан.

Кстати, можно и так вызывать функцию f:

local my_obj = my_script.my_SMALL_class()
local my_F = my_obj:Get_f()()
  • Спасибо 1
Ссылка на комментарий

@Zander_driver, у меня все прекрасно сработало.


class "my_SMALL_class"
function my_SMALL_class:__init()
    self.test_field = 5
end
function my_SMALL_class:Get_f()
   local f = function()
      return self
   end
   return f
end

local con = get_console()
local my_obj = my_SMALL_class()
local my_F = my_obj:Get_f()
local x = my_F()
con:execute("~~~"..tostring(x.test_field))

Код весьма странный, можно вполне замкнуть my_obj. Кстати, я считал, что не будет работать, пока не вспомнил, что это луабинд, и по факту селф это переменная. В яваскрипте например такое сканает только с объявлением переменной или с выкрутасами типа apply или bind, но не суть.

Сборщик мусора вполне сам позаботится про замкнутые переменные. Это же не объект луа, а юзердата. Луа выполняет функцию "удерживания ссылки на замкнутую переменную". Но если по ссылке записать невесть что (из двигла) и пытаться чтото потом сделать с полученной переменной (метод вызвать), получится вылет, и скрипты тут ни при чем.

 

  • Полезно 1

ТЧ 1.0004. SAP и Trans mod

github

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

@Dennis_Chikin, sistem исправлен, там вроде в строке

[script]
current_server_entity_version = 6
 вместо 6 прописано 7 и больше ничего.

Пробовал загрузит на 4 патче, вообще не понятно что за лог.

  4 патч (Показать)
Изменено пользователем Хемуль36рус

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

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

Хемуль36рус, все, понял, что у тебя происходит.

Короче, xr_motivator трогать вообще не нужно. Верни все как было до "адаптации".

 

Нужно править 2 других файла, и делать конвертер сейвов.

Попозже распишу, что и как.

 

https://dl.dropboxusercontent.com/u/27871782/dialog_manager46.script

 

Вот так вот выглядит универсальный файл диалогов. Причем сохранение/восстановление на самом деле не нужно совсем.

 

С заданиями - чуть сложнее, с одной стороны, но при этом не нужны архисложные преобразования. save/load к версии вообще не привязан:

  Показать

 

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

@Dennis_Chikin, то-есть тот, из 4 патча? Интересно, обычно адаптировали только эти скрипты.

 

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

 

@Dennis_Chikin, извини не совсем понял. То что по ссылке, этим можно диалог менеджер заменит, а тот кусок что в спойлере, нужно вставить в таск, вместо оригинального куска.Так?

 

Нет, это для примера. Чтоб работали, надо откатить до твоего мода. Или твой мод поправить. Не сейчас. Пока просто верни все как есть, и занимайся чем нибудь еще на 4-й версии. dc

 

 

@Dennis_Chikin, то есть Charsi прав, адаптировать не получится. Интересно, те скрипты не трогались, а адаптировать их нужно. Вообще не понятно, зачем пысы такую процедуру провели, ведь проблем то вроде не было с диалогами.

 

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

 

Сам же скрипт приведен как пример, что можно делать такое, что от версий вообще не зависит. Но когда я его переделывал - тоже не заботился о том, чтобы его можно было вот так взять, и скопировать в чей-то мод. Просто по тому, что иначе овчинка выделки не стоит - тянуть нелепую "совместимость" с сэйвами сталкера версии 2003-го года, которой по факту все равно не существует даже у оригинала. dc

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

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

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

dc

Наверняка человек мало что понял.

Меня самого выражение ( ( ( n1:id() ~= 0 ) and n1 ) or n2 ) несколько смутило. В том смысле, что необходимо некоторое время, чтобы сопоставить - кто такой n1 и n2 по отношению к first и second speaker-ам.  Да и столько скобок, что ... ну на любителя конечно.

Наверное просто стоило сказать что speaker-ы поменялись местами, и чтобы далее не заморачиваться на эту тему, нужно написать дополнительную функцию, которая сама будет ставить first_speaker-ом actor-а. Типа :

function normalize_speakers(first_speaker, second_speaker)
    local is_actor  = first_speaker:id() == 0
    return is_actor and first_speaker or second_speaker, is_actor and second_speaker or first_speaker
end


function give_kolbasa(first_speaker, second_speaker)
    first_speaker, second_speaker = normalize_speakers(first_speaker, second_speaker)
    -- ну и далее по тексту
end

........

dc

10000. Ну а как по-другому контролировать speaker-ов?

Вызовы из логики ещё можно поправить в xr_logic. А из xml и скриптов как?

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

Скобок можно меньше, но так - нагляднее.

А простыни о 10000 однотипных строк городить - зачем ? Вот уж действительно где запутаться нефиг делать.

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

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

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

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

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

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

Войти

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

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

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