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

Внимание.

В следствии глобального сбоя системы сайт восстановлен из бэкапа за 16.10.2026

 

_Val_ _Val_

Скриптование


Svoboда

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

@Nazgool,

Тепло, но я не совсем про это.

		if( l_tpIniFile->section_exist( type_name() ) )
			if (l_tpIniFile->r_string(type_name(),"script"))
				ai().script_engine().add_script_process(ScriptEngine::eScriptProcessorGame,xr_new<CScriptProcess>("game",l_tpIniFile->r_string(type_name(),"script")));
			else
				ai().script_engine().add_script_process(ScriptEngine::eScriptProcessorGame,xr_new<CScriptProcess>("game",""));

А про это... Вроде как это сломано, но я починил, выпилив JIT и обновив луа.

Поделиться этим сообщением


Ссылка на сообщение

@Nazgool,

Там суть в создании новых Lua_State'ов, которые движок каждый апдейт пинает (resume), но только если они ещё не завершены.

 

Я собственно искал аналог Sleep (в луа это wait ) , чтоб приостановить луашный поток.

Те можно изобразить что-то вроде такого

function main()
local m_surge_manager = surge_manager.get_surge_manager()
m_surge_manager:initialize()
while true do
m_surge_manager:update()
wait(10000)
end
end

Причём таймер работает как надо, раньше времени поток не продолжится.

Вроде в ТЧ или ЧН ПЫС использовали это
 

 

[single]
    script = ;level_weathers  Теперь погода перенесена на биндер актера и апдейтится оттуда. Потоковый скрипт убран.

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

Поделиться этим сообщением


Ссылка на сообщение

@Карлан,

Уже ничего не надо :)

Ответ на мой вопрос -

 

 

аналог Sleep (в луа это wait )

Просто интересно, пользовался ли кто таким. (Это не связано coroutine)

Поделиться этим сообщением


Ссылка на сообщение

Нет ли тут подводных камней?

 

function bind_function(func,...)
	return function ()
	return func(unpack(arg))
	end
end

function bind_member(func, inst, ...)
	return function ()
	return func(inst, unpack(arg))
	end
end

class "test_class"
function test_class:__init()
printf ("test_class:__init()")
end

function test_class:test_fun(a, 
printf ("test_class:test_fun()")
printf (a+1)
printf (b+1)
end

function my_test(a, 
printf (a+1)
printf (b+1)
end

function test()
local test_inst = test_class()
local f = bind_function(my_test, 10, 20)
local f2 = bind_member(test_class.test_fun, test_inst, 10, 20)
f()
f2()
end

 

 

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

Поделиться этим сообщением


Ссылка на сообщение

@Nazgool,

У меня Lua 5.1.5, и то, что я написал робит.

 

"Шаблонность" в Lua зачётная, я блин больше времени убил, пока писал аналог на С++ того, что выше, а то, что ниже :russian_ru:...

 

 

function bind_member(func, inst, ...)
	local arg1 = arg
	return function (...)
	return func(inst, unpack(arg1), unpack(arg))
	end
end

 

 

Такой вопрос, стоит вводить систему "эвентов" ? Вроде же вызовы двиг<->скрипты дорогие, значит надо их минимизировать.

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

Поделиться этим сообщением


Ссылка на сообщение

@Desertir,

 

 

Которую уже

Я не так давно снова стал сидеть на Сталкерских форумах, так что не всё знаю.

 

Движок? Определённо! Первое, что приходит в голову, апдейт биндеров.

 

Вообще я это всё начал из-за отсутствия апдейта, нормального, без всяких цепляний к чему-то там. (©мультиплеер)
+ Хочетцо модульную систему. Дописал в конфиге строчку, скрипт прописался, куда ему надо.

 

 

 onUpdate     = Event()
 onInitialize = Event()
function main()
Initialize()
Update()
end
function Initialize()
onInitialize:Call()
end
function Update()
while true do
onUpdate:Call()
wait(1)
end
end

 

 

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

 

 

аналог Sleep (в луа это wait )

Однако

function wait(time_to_wait)
	verify_if_thread_is_running()
	if (time_to_wait == nil) then
		coroutine.yield()
	else
		local time_to_stop = time_global() + time_to_wait
		while time_global() <= time_to_stop do
			coroutine.yield()
		end
	end
end

 

 

:facepalm:

Поделиться этим сообщением


Ссылка на сообщение

 

Оператор # возвращает целое число n, такое, что t[n] не nil, и t[n + 1] равно nil. Другими словами оператор #, возвращает  максимальный индекс непрерывной последовательности ключей от начала массива. Соответственно, для таблицы:

local t = {1, [100] = 2}
print(#t) -- > 1, поскольку t[1] не nil, а t[1 + 1] равно nil.

Для массива, в котором значения хранятся одно за другим, оператор # вернет количество элементов в массиве.

 

 

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

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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