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

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


Svoboда

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

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

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


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

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

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


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

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

 

function _G.blabla()

...

end

 

Или function blabla()

...

end

 

_G.blabla = this.blabla

 

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

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

 

 

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

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

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

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


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

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

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

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


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

"Изначально грешил на таблицу"

 

и таки да. Либо крестик снять, либо трусы надеть.

"ep\\military\\ml1" или [[ep\military\ml1]] - что-нибудь одно.

Неплохо еще проверять, что объект получен, прежде чем пытаться с ним что-нибудь делать.

  • Нравится 1
  • Согласен 1

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


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

local s_obj=s_obj[ math.random(#s_obj) ]

 

Вполне законная операция. Хотя без предупреждения так делать не стоит, если не хотим затруднить кому-нибудь вносить свои изменения, и вообще разбираться, как наш код работает.

 

P.S. Ну не правы - так не правы. Успехов.

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

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


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

"Как правильно" - главное, это ПРИНЦИПИАЛЬНО ничего не читать. Тем более на том форуме, где задается вопрос. А то вдруг там ответ в том же разделе имеется - даже целая тема.

 

Ага, в свете наличия специальных тем - это тоже важно: писать в любую другую, но только не в ту, которой вопрос касается.

  • Согласен 1

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


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

Выходит вместо db.actor можно писать просто nil ?

bind_stalker.script:

function actor_binder:net_spawn(data)

...

db.add_actor(self.object)

 

db.script:

function add_actor( obj )

actor = obj

 

Но, как уже писал, это плохая идея, производить несколько операций с переменной, которая используется 100500 миллионов раз в секунду, вместо одной.

Да еще везде и всюду набирать руками это самое db.actor с риском где-то забыть или попутать буковки местами.

 

Так что:

bind_stalker.script:

function actor_binder:__init( npc ) super( npc )

_G.actor = self.object -- теперь отовсюду будет работать просто actor, без всякого self.object и db.

 

 

function actor_binder:net_destroy()

...

_G.actor = nil

object_binder.net_destroy( self )

end

  • Полезно 1

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


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

Что это сейчас было ?

 

function determine_section_to_activate(npc, ini, section_logic, actor)
	if not ini:section_exist(section_logic) then
		return "nil"
	end

	-- Распарсить строку выбора активной секции с учетом команд, заключенных в %%
	local active_section_cond = cfg_get_condlist(ini, section_logic, "active", npc)
	local active_section
	if not active_section_cond then
		abort("object '%s': section '%s': unable to find field 'active'", npc:name(), section_logic)
	else
		active_section = pick_section_from_condlist(actor, npc, active_section_cond.condlist)
		if not active_section then
			abort("object '%s': section '%s': section 'active' has no conditionless else clause",
				npc:name(), section_logic)
		end
	end
	return active_section
end
- из оригинала.

 

"может патч не тот?" - Ага. Несовместимая версия драйвера /dev/hands

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

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


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

что-то совсем лыжи не едут...

	local lvid = npc:vertex_in_direction( npc:level_vertex_id(), npc:direction(), 10 )
	if npc:accessible( lvid ) then
		npc:set_dest_level_vertex_id( lvid )
		log( "info", "action_anomaly(%s):execute, accessible: %s, current: %s",
			npc:name(), lvid, self.object:level_vertex_id() )
	else ...
! Cannot find saved game ~info~ [blowout_scheme] (bar_ecolog_professor)evaluator_anomaly:evaluate, dest reached

! Cannot find saved game ~info~ [blowout_scheme] (bar_ecolog_professor)evaluator_anomaly:evaluate, dist: 2.9374704360962 to amk_zone_gravi_zone_strong0777

! Cannot find saved game ~info~ [blowout_scheme] action_anomaly(bar_ecolog_professor):execute, accessible: 41085, current: 41085

и в такой позе стоит.

 

- это так и должно быть ?

Я почему-то думал, что npc:vertex_in_direction() - это не тот вертекс, в котором непись сейчас, а какой-то другой, "в ту сторону".

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

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


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

То есть, тогда конструкция if npc:accessible( lvid ) получается полностью бессмысленной ?

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


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

А вылет точно в этой функции ?

Или ошибка все-таки в game_relations, line communities ?

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


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

1. se_respawn.script:

-- Обновление в офлайне

function se_respawn:update()

cse_alife_smart_zone.update( self )

--'printf("RESPAWN: [%s] se_respawn update_offline", tostring(self:name()))

self:execute()

end

Здесь с этим можно что-нибудь сделать.

 

2. нет, неправильно. Это заполнение синих ящиков патронами от пм и воткой.

 

3. недостаточно.

  • Спасибо 1

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


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

bind_respawn.script - это при заходе на локацию.

xr_effects.script - это если вызывается еще откуда-то (из непися, дверей, ворон и прочих лампочек).

 

соответственно, убираешь то, что тебе не нужно, и оставляешь то, что нужно.

 


 

Что-то я переутомился, что-ли...

	self.dir1 = npc:direction()
	local npc_pos = npc:position()
	local n = 1

	local lvid1, pos
	local dir = self.dir1
	for i = r1, r1 + 10, 2 do
		lvid1 = level.vertex_in_direction( npc_pos, dir, i )

		if lvid1 ~= npc_lvid then
			pos = level.vertex_position( lvid1 )

			log( "info", "r1: %s, i: %s, lvid: %s, dist: %s", r1, i, lvid1,
				pos:distance_to( npc_pos ) )
	end	end
r1: 7.8898077011108, i: 7.8898077011108, lvid: 43, dist: 229.41188049316

r1: 7.8898077011108, i: 9.8898077011108, lvid: 43, dist: 229.41188049316

r1: 7.8898077011108, i: 11.889807701111, lvid: 43, dist: 229.41188049316

r1: 7.8898077011108, i: 13.889807701111, lvid: 43, dist: 229.41188049316

r1: 7.8898077011108, i: 15.889807701111, lvid: 43, dist: 229.41188049316

r1: 7.8898077011108, i: 17.889808654785, lvid: 43, dist: 229.41188049316

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

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


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

Да. А есть разница ?

Мне нужно, банально, какой-нибудь вертекс там, куда смотрит непись. Не прямо под носом, и не очень далеко. Любой, блин.

Вертекс, который в 300 метрах сзади непися - это что-то явное не то.

 

upd: однако, и вправду переутомился.

в vertex_in_direction() должна быть не позиция, а npc_lvid.

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

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


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

Только сейчас обратил внимание.

Ага, видимо, холода на всех действуют...

 

системный респавн

если именно регулярный, который в локациях где актора сейчас нет - тогда self:execute()

в se_respawn:update()

 


npc:accessible_nearest() в каком случае 1 возвращает ? -1 я уже видел, nil - тоже. Что у него еще припасено ?

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

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


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

 

Гм. Чем дальше в лес, тем толще партизаны...

lvid1 = level.vertex_in_direction( npc_lvid, self.dir[1], i )

С разных исходных позиций:

targets[1], r1,i: 9.4276762008667,9.4276762008667, lvid: 29341, dist: 0.65685898065567

targets[1], r1,i: 9.0319900512695,9.0319900512695, lvid: 30935, dist: 9.6079540252686

targets[1], r1,i: 9.4302082061768,9.4302082061768, lvid: 31782, dist: 0.99326068162918

 

Какой смысл задавать ему расстояния ?

А есть и другой? Под системным респавном я всегда подразумевал стандартный респ НПС и мобов.

Все-таки это погода.

Есть и другой.

 

bind_respawn.script

Как видно из когда, работает только на текущей локации. Где se_respawn:update() не работает. Делает

function respawn_binder:update( delta )
	object_binder.update( self, delta )
	self.se_respawn:update_online()
end
Есть еще xr_effects.script - когда кто-то где-то прописал что-нибудь типа %respawner_spawn(что:попало)%
  • Спасибо 1

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


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

 

 

Не понятно, что именно тебя удивляет? Насколько я понимаю, vertex_in_direction() возвращает самый ближний, валидный, вертекс к той точке, которая находится на запрашиваемом расстоянии от переданного вертекса

 

Вот так и не понял: ближний к той, или ближний к этой. То одно, то другое. Вот что мне делать, чтобы получить который не ближе 10, но не дальше 20 метров оттуда, откуда смотрим ? С горя уже начал пробовать высчитать координаты "руками", а потом попросить ближайший доступный. Так и там - то -1, то nil, то 1 откуда-то лезет.

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


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

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