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

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

 

 

Но (см. комментарий) сообщения нет.  з.ы. и да, проблема не в выводе сообщения - даже явное return 1/0 не приводит к вылету :-) (т.ею. до a4_message не доходит, при этом - даже если она вызывается из a4_on_update)

И не будет никакого сообщения при таком коде.

local packet = net_packet()
local new_game = packet:r_u8() != 1 

Во-первых, как справедливо заметил @naxac, неравенство должно обозначаться «~=».

А во-вторых, чтобы пользоваться net-пакетами, надо для начала хотя бы изучить что они такое и с чем их едят. Начать можно с азов в теме «Справочник по функциям и классам», да и в целом на форуме информации предостаточно. Даже тут, на предыдущей странице, было обсуждение, которое могло бы навести на некоторые мысли.

В частности, вызов конструктора local packet = net_packet() возвращает новый, чистый (!) net-пакет. Всегда. И пытаться получить из него признак запуска игры - бессмысленно.

 

Вообще, использовать net-пакеты для сохранения признака того, что игра уже запускалась - это палить из пушки по воробьям. Один вопрос: зачем?

Для этого лучше сохранить переменную в pstor; как это сделать - писалось много раз, в том числе на предыдущей странице.

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

Спасибо, про сравнение даже не подумал как-то. Позор моим... (блин, седины нет :-) )

 

 

Вообще, использовать net-пакеты для сохранения признака того, что игра уже запускалась - это палить из пушки по воробьям. Один вопрос: зачем?

 

Да так-то до них дело ещё не доходит - а в дальнейшем мне тут ещё будет что хранить. Хотя на данный момент да, идиотизм - целый пакет из-за 1байта (ну или. какое там выравнивание? :-) ) А за pstor - спасибо, сам при более ранних ковыряния видел только пакеты (ещё бы я помнил, где находил пример нужных мне действий :-) )

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

 

 

Можно и так
Я просто хотел реализовать худ предметов: схема такова - кушаем батон, спавнится сам худ на классе чего-нибудь, заводится таймер, и потом худ удаляется. Но вот со спавном этого худа проблемы...
Ссылка на комментарий

а в дальнейшем мне тут ещё будет что хранить

В зависимости от специфики и размера сохраняемых данных - пстор, обсуждавшиеся тут универсальные хранилища, нет-пакет конкретного объекта и т. д. Вариантов хватает. По целям надо и средства выбирать.
Ссылка на комментарий

@Kirgudu, да, похоже - действительно была проблема в синтаксисе.

Теперь a4_on_update таки выполняется (return 1/0 приводит к падению).

Впрочем, сообщение показать не удается

function a4_message()  
  local actor = alife():actor()
  local cactor = level.object_by_id(actor.id)
  cactor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!", "ui\\ui_npc_monster", Frect():set(0,215,163,105), 1000, 50000)
end
Ссылка на комментарий

@Wlad777, без движковых правок - нет.

Плохо. Опять костыли на костылях городить придётся.

 

А вот следующий вопрос: есть zone_flame_small, рядом стоит актор. Дистанция до этого конкретного костра получена, нужно узнать горит он или нет. Можно ли это отследить?

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

---------------------------------

www.amk-zone.de

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

@alex4321, ещё раз:

 

 

В частности, вызов конструктора local packet = net_packet() возвращает новый, чистый (!) net-пакет. Всегда. И пытаться получить из него признак запуска игры - бессмысленно.

Поэтому

local packet = net_packet()
local new_game = packet:r_u8()

вернёт что? Мне неизвестно - не пробовал получать значение из нового net-пакета.

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

Да пофиг, что оно вернет - я пока что сократил до

function a4_on_update()
  a4_message()
end

net_packet-в я сейчас не юзаю. В таком варианте оно на каждый вызов actor_binder:update должно вызывать мой код, т.к. я не отписываюсь от события. Как минимум - 1 раз вызывает, раз крешится при замене a4_message() на return 1/0. Но вывода сообщения не проходит. Т.е. проблема с 

function a4_message()  
  local actor = alife():actor()
  local cactor = level.object_by_id(sactor.id)
  cactor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!","ui\\ui_npc_monster",Frect():set(0,215,163,105),1000,50000)
end
Ссылка на комментарий

 

local actor = alife():actor()
local cactor = level.object_by_id(sactor.id)

 

Точно sactor.id? Строчкой раньше определяется переменная actor. Это первое.

А второе - зачем такие мучения? Не проще ли сделать так?

db.actor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!","ui\\ui_npc_monster",Frect():set(0,215,163,105),1000,50000)
@Serge!, это при условии, что там всегда 0. А также что позиция чтения установлена с начала пакета (см. выше).
Ссылка на комментарий

 

 

это при условии, что там всегда 0

этот ноль меня удивил, т.к. я ждал, что там какой-нибудь мусор.

Никакие позиции не усанавлива, просто тупо скопировал строки из Вашего сообщения. Вот так:

local packet = net_packet()
news_manager.send_tip(db.actor," s -->"..tostring(packet:r_u8()))
Добавлено Kirgudu,

Говоря про позицию чтения, я имел в виду ЗП/ЧН, где для вновь созданного пакета она может не равняться нулю, о чём и писалось несколькими сообщениями назад.

Ссылка на комментарий
db.actor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!","ui\\ui_npc_monster",Frect():set(0,215,163,105),1000,50000)

Кстати, верно - опечатку в коде поправил, а тут как висела, так и оставалась. Ну и за упрощенный вариант спасибо. Но сейчас у меня такой код :

 

 

function a4_message()  
  db.actor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!","ui\\ui_npc_monster",Frect():set(0,215,163,105),1000,50000)
end

function a4_on_update()
  -- Вполне вероятные ошибки в работе с net_packet-м, но доэтой стадии не доходит, т.к. попытка вызвать a4_message() ни к чему не приводит
  a4_message()
end

function a4_on_new_game()
  a4_message()
end

function init()
  event("game_new"):register(a4_on_new_game)
  event("actor_update"):register(a4_on_update)
end 

 

 

Однако, сообщения нет. Более того - если я помещаю db.actor:give_game_news... в bind_stalker:update - тоже нет. А по return 1/0 - падает, т.е. до выполнения этого кода дело доходит.

 

upd. А вот вариант с news_manager.send_tip в моём случае подходит и работает. Т.к. мне это вообще только для отладки - то и хрен с ним, буду показывать инфу так.

function a4_message()
  news_manager.send_tip(db.actor, "TEST", nil, nil, 30000) 
end
Изменено пользователем alex4321
Ссылка на комментарий

Потому что в news_manager.send_tip() используется альтернативный метод вывода сообщения:

db.actor:give_game_news("Свободу тушканам!", "Тушканчики всех стран, объединяйтесь!", "ui\\ui_npc_monster", 0, 50000)

В этом варианте не указываются координаты и размеры вырезаемого из текстуры изображения.

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

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

Кстати, вероятно - но проверить пока не могу. А код такой вышел :

 

 

function a4_message()
  news_manager.send_tip(db.actor, "TEST", nil, nil, 30000) 
end

function a4_on_update()
  if xr_logic.pstor_retrieve(db.actor, "game_started", false) == false then
    event("game_new"):trigger({})
    xr_logic.pstor_store(db.actor, "game_started", true)
  end
  event("actor_update"):removeThisCallback()
end

function a4_on_new_game()
  a4_message()
end

function init()
  event("game_new"):register(a4_on_new_game)
  event("actor_update"):register(a4_on_update)
end

 

 

Теперь я уже могу подписываться на событие game_new в своих скриптах. Отрабатывает как и должно  по задумке - 1 раз при старте новой игры.

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

@alex4321, триггер добавляй прямо в коллбек, нечего всякие нагромождения городить, в оригинале там инфопоршень ставится на единоразовое отрабатывание, можешь поступить так же и туда еще один ивент добавить, но у меня нету, вот посмотри мой код:

 

function actor_binder:update(delta)
	object_binder.update(self, delta)
	local time = time_global()
	if self.is_start then
		self.is_start = false		
		if not has_alife_info("storyline_actor_start") and level.name() == "l01_escape" then
			give_info("storyline_actor_start")
			_G.g_start_avi = true		
		end
		if not has_alife_info("global_dialogs") then give_info("global_dialogs") end --// Karlan to alex4321: сюда можешь вставлять ивент
		functions_task.add_lchanger_location() --// on delete [x] // Karlan to ALL: система переходов сейчас совсем другая
		event("update_1st"):trigger({time=time,delta=delta,binder=self})
	end	

	-- m_ammo.update_ammo() --// on delete [x]
	self.weather_manager:update() --// апдейт погоды --// on delete [x]
	-- self.actor_detector:update() --// апдейт схемы детектора  --// on delete [x]
	xr_sound.update_actor() --// апдейт звуковой схемы актера --// on delete [x]
	
	--// обновление отключения ввода с клавиатуры
	if self.st.disable_input_time and game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle then 
		self.st.disable_input_time = nil
		level.enable_input()
	end	
	--// обновление через интервалы времени
	if self.tmr_upd < time then
		self.tmr_upd = time + 200 --// ~5 раз в сек
		--// обновление рестрикторов, которые под логикой, срабатывает через интервалы времени
		-- bind_restrictor.actor_update(delta) --// on delete [x]
		manager_task.actor_update() --// on delete [x]
		--// апдейт прятание оружия игрока во время диалога // Karlan to Karlan: утащить в инфо, или добавить в движок еще один и сделать через два
		if weapon_hide == true or actor:is_talking() then
			if self.weapon_hide == false then
				actor:hide_weapon()
				self.weapon_hide = true
			end
		else
			if self.weapon_hide == true then
				actor:restore_weapon()
				self.weapon_hide = false
			end
		end	
		--// обновление сна с переносом чувака в указанную позицию // Karlan to ALL: это НИГДЕ не используется (todo: все удалить) --// on delete [x]
		--// Karlan to ALL: мое предположение: нокаутирующий удар с усыплением и переносом актора (грабеж/разбой/похищение?) (todo: посмотреть билды)
		if self.st.sleep_relocate_time and game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle then
			actor:set_actor_position(self.st.sleep_relocate_point)
			local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look)
			actor:set_actor_direction(dir:getH())
			self.st.sleep_relocate_time = nil
		end
		self.tmr_cnt = self.tmr_cnt +1
		if self.tmr_cnt >= 5 then --// ~1 раз в сек
			self.tmr_cnt = 0
			--// вывод сообщения о большой радиации
			if actor.radiation >= 0.7 then
				if not self.hud_rad then
					self.hud_rad = get_hud()
					if not self.hud_rad:GetCustomStatic("cs_radiation_danger") then
						self.hud_rad:AddCustomStatic("cs_radiation_danger", true)
						self.hud_rad:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")
					end
				end
			elseif self.hud_rad then
				self.hud_rad:RemoveCustomStatic("cs_radiation_danger")
				self.hud_rad = nil
			end
		end
	end
	--// обновление пси-антенны
	if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:update(delta) end --// on delete [x]
	
	event("actor_update"):trigger({time=time,delta=delta,binder=self})
end

 

 

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

@hi_flyer, в онлайне или оффлайне? на тебе пример для онлайна:

function kill_npc_in_gulag(gulag_name)
	local gulag = xr_gulag.get_gulag_by_name(gulag_name)
	if gulag then
		for k,v in pairs(gulag.Object) do
			if type(v)=="userdata" then
				local o = level.object_by_id(k) --// можно сразу v:kill(v)
				if o then o:kill(o) end
			end
		end
	end
end

для оффлайна сам думаю сообразишь.

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

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

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

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

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

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

Войти

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

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

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