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

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


Svoboда

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

Возник вопрос - как запустить определенный код (речь о Lua)  после начала новой игры в CoP (т.е. оно должно отработать 1 раз).

Найти чего-то подходящего именно к такому случаю - я не смог, запихнуть в actor_proxy:net_spawn - вариант, но в случае CoP - срабатывает оно ещё до полной загрузки, а в update - как-то не айс запихивать сюда одноразовое событие же.

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


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

@alex4321, другого не дано, только апдейт, заюзай системы событий, подпишешь - отпишешь.

Спасибо, пытаюсь приюзать xs_sandbox. Вроде как устройство вполне прозрачное, но вызвать обработчик пока не получается.

В _g.script инициализация добавлена.

-- list of registered modules, can have dependence one from other (must be grouped in table)
-- in every module must be an "init()" function for module's initialization
-- for some events (like packet save or load) order is VERY important
binds = {
	"a4_system",
}
function actor_binder:update(delta)
	object_binder.update(self, delta)

	if string.find(command_line(), "-designer") then
		return
	end
--надо бы проверить, не отработал ли этот return
	if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
		jump_level.try_to_jump()
		self.already_jumped = true
		return
	end
...
	event("actor_update"):trigger({})
end

 

Соответственно, если я всё делаю правильно - то будет вызван обработчик, повешенный к actor_update

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

function a4_on_update()
  -- Вполне вероятные ошибки в работе с net_packet-м, но доэтой стадии не доходит, т.к. попытка вызвать a4_message() ни к чему не приводит
  local packet = net_packet()
  local new_game = packet:r_u8() != 1
  if new_game then
    event("game_new"):trigger({})
    packet:w_u8(1)
  end
  event("actor_update"):unregister(a4_on_update)
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

 

Но (см. комментарий) сообщения нет. 

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

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

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


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

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

 

 

Вообще, использовать 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

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


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

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

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

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


Ссылка на сообщение
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

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


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

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

 

 

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

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


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

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