Добавлено (08.02.2013, 13:31) --------------------------------------------- ColR_iT, А ты не мог бы еще описать, как сделать медленное восстановление хп?
Sanjaaa, готовый вариант чего? Ссылка на файл xr_s.script, есть в конце статьи, не "промажешь". Остальное же нужно адаптировать под себя, в том числе и пример...
ColR_iT, по твоему уроку сделал уборку оружия, но не смог адаптировать медленное восстановление хп. По моему они конфликтуют друг с другом. Хотя я напичкал много всего, может и из-за этого.
Mirage, и что ты мне предлагаешь? У меня это всё работает на данной схеме безотказно. Что написал ты, я даже не представляю и каким образом может конфликтовать пример из шапки и пример из приведённой ссылке, где реализуется медленное восстановление здоровья.
6poHR777, здесь как тебе уже будет удобно, можно проверять и отдельно взятые названия, можно и в секции предметов, во время употребления которых нужно убирать оружие, дописать какой-нибудь параметр и считывать его... в общем способы есть, выбор за тобою.
По нежеланию трудящихся трудится, выкладываю урок, так сказать, "без лишних слов". В уроке: убирание оружия при использовании аптечек. В качестве бонуса: медленное восстановление здоровья, невозможность пользоваться другой аптечкой, пока мы используем первую и прерывание восстановления здоровья, в случае какого либо воздействия, приведшее к потере здоровья, иными словами, если мы получили хит, восстановление жизни прекращается. Кроме того, "бонусы" можно отключать по желанию. Реализоваться это будет, понятное дело, на схеме предоставленной в шапке темы. Список файлов, который нам понадобиться: xr_s.script - основной файл, без него никак (ссылка есть в шапке темы); bind_stalker.script - куда же без него? Будем проверять используется ли аптечка или нет; medicine.script - этот файл мы создадим и в нём же будет находится весь функционал; item.ltx - придётся подправить параметры аптечек, выключив им движковое лечение. Приступим!
Подумав, пришёл к выводу, что файл medicine.script, мы создавать с ноля не будем, а Вы просто его скачаете вот от сюда:>>ClicK Me<<. Скачиваем и располагаем его в папку gamedata/scripts. Далее, открываем файл bind_stalker.script и перед методом use_inventory_item (как его добавить описано в шапке темы) вписываем вот такую таблицу:
if item_[obj:section()] then medicine.Rehabilitation(obj) end
Теперь в методе update впишите следующую строку кода:
Код
xr_s.on_actor_update(delta)
В файле item.ltx уберите движковое восстановление здоровья у аптечек, прописав значение 0 для параметра eat_health. В противном случае от медленного лечения не будет толка. Собственно всё! Все "бонусы", в том числе и само убирание оружия, можно выключить в файле medicine.script. Да и вообще в нём прокомментирована каждая строчка, так что проблем возникнуть не должно. Единственный момент - не сохраняйтесь пока работает восстановление! К вылету это не приведёт, но при загрузке возможен момент, когда первая аптечка не даст желаемого эффекта, для последующих всё будет так, как нужно. Не критично, но неприятно. Не смог поправить в силу данной реализации. Вылеты отловлены. Логические ошибки поправлены. Всё работает - проверено. P.S. Рекомендую тщательно ознакомиться с файлом medicine.script. Всё реализуется на динамическом подключении функции к биндеру - так что пример ярче некуда.
P.P.S. Добавил в "шапку".
Сообщение отредактировал ColR_iT - Вторник, 19.02.2013, 12:49
Я наверно ужасно тупой!!! Тысячу раз перечитал и сделал так....
function actor_binder:OnUseObject(obj)
if obj and obj:section() == "bread" then xr_s.register_callback("update", use_med.MedkitUsing, {time_global(), 4000}) end --сделал так потому что у меня уже был коллбек на юз предмета и все уже было готово.
Потом я создал файл use_med.script и в нем написал следующее...
function MedkitUsing() --# Прячем оружие. bind_stalker.hide_weapon() --# Проверим работает ли ещё таймер? --# userObj[1] - время начала работы таймера; --# userObj[2] - время работы таймера (мсек) if time_global() > userObj[1] + userObj[2] then --# Работа таймера закончена - покажем оружие. bind_stalker.restore_weapon() xr_s.unregister_callback ("update", use_med.MedkitUsing) end end
Потом я добавил в файл bind_stalker в function actor_binder:update(delta) object_binder.update(self, delta)
вот это xr_s.on_actor_update
Из того что я сделал я толком ничего не понял... И что-то подсказывает мне что где-то чего то не хватает...
Вот так у меня в бинд сталкере: function actor_binder:use_inventory_item(obj) if string.find(obj:section(), "medkit") then xr_s.register_callback("update", use_med.MedkitUsing, {time_global(), 4000}) end if string.find(obj:section(), "bandage") then xr_s.register_callback("update", use_bandage.BandageUsing, {time_global(), 4000}) end end создаешь сам, если нет такой функции(как я понял, ты вместо этого function actor_binder:OnUseObject(obj) создал) и function actor_binder:update(delta) object_binder.update(self, delta)
yantar_psy_blowout.update()
xr_s.on_actor_update(delta)
Добавлено (01.04.2013, 23:14) --------------------------------------------- И эти не забудь прописать:
function actor_binder:net_destroy() if(actor_stats.remove_from_ranking~=nil)then actor_stats.remove_from_ranking(self.object:id()) end -- game_stats.shutdown () db.del_actor(self.object)
sedmoy23, а в чём собственно проблема? В том, что не работает? Так ты просто был не очень внимателен. В функцию MedkitUsing, что в файле use_med.script, нужно передавать параметр userObj, который представляет из себя таблицу. У тебя же этого нет. Это первая ошибка. Вторая - ты не прописал вызов функции on_actor_update из файла xr_s.script в биндер актора. Ты, возможно, начнёшь возмущаться: "как же так, мол!? А вот это что?":
Код
xr_s.on_actor_update
Всё бы хорошо, только это не вызов функции, это считывание глобальной переменной с именем on_actor_update из указанного файла. А функцию нужно было вызвать так:
Код
xr_s.on_actor_update(delta)
Mirage, а позволь поинтересоваться, а что у тебя в файле use_bandage.script в функции BandageUsing?
ColR_iT, Блин.... тяжело тут все понять... Было бы проще по моему покопаться в геймдате с комментариями...
Добавлено (02.04.2013, 01:28) --------------------------------------------- ColR_iT, а что касается внимания не упрекай меня в этом... я тебе серьезно говорю, перечитал раз 20!
function BandageUsing(userObj) --# Прячем оружие. bind_stalker.hide_weapon() --# Проверим работает ли ещё таймер? --# userObj[1] - время начала работы таймера; --# userObj[2] - время работы таймера (мсек) if time_global() > userObj[1] + userObj[2] then --# Работа таймера закончена - покажем оружие. bind_stalker.restore_weapon() xr_s.unregister_callback ("update", use_bandage.BandageUsing) end end
sedmoy23, извини, если обидел, но факт "на лицо". У тебя фактически "граматические" ошибки при написании кода. Какие - я указал. Забавно... Убери вторую функцию и измени проверку в колбеке на юз на такую:
Код
if string.find(obj:section(), "medkit") or obj:section() == "bandage" then xr_s.register_callback("update", use_med.MedkitUsing, {time_global(), 4000}) end