UriZzz 1 004 Опубликовано 25 Января 2019 Скрытый текст Всем привет! В этой теме есть замечательный скрипт на пост-эффект при критическом попадании за авторством АМК Team. У этого скрипта есть один недостаток: проблема в том, что скрипт порой срабатывает с запозданием где-то в полсекунды (или около того) после получения хита, смотрится ужасно. Я думаю (поправьте если ошибаюсь), это из-за того, что скрипт повешен на апдейт и скорость срабатывания зависит от частоты апдейта. Чтобы решить эту проблему без какой-нибудь скриптовой чёрной магии, придётся править движок. Спокойно, никаких тут разборов языка C++ не будет, обойдёмся без взрыва мозга и воспользуемся самым доступным вариантом - X-Ray extensions. Скачать последнюю сборку от @НаноБот можно отсюда. Конкретно нам нужен коллбэк на хит актора, в чистом движке ТЧ его нет, зато он есть в XRay ext и в большинстве сборок седьмого патча. С помощью xray ext пропатчиваем (мудрить с коррекшен листом не обязательно, достаточно пропатчить на дефолтных настройках) файл xrGame.dll (он уже есть в 230й сборке), кидаем dllку в папку bin в корне игры и подтверждаем замену (внимание! Сохраните резервную копию чистой dllки где-нибудь во избежание возможных проблем). Итак, мы имеем пропатченный двигло, но этого мало. Прежде чем использовать коллбэк, его ещё нужно активировать. Для этого нам понадобится файл bind_stalker.script из распакованных ресурсов игры. Открываем его тестовым редактором и среди всего безобразия ищим вот такую строчку: function actor_binder:reinit() Ниже видим такие строки: self.object:set_callback(callback.inventory_info, self.info_callback, self) self.object:set_callback(callback.article_info, self.article_callback, self) self.object:set_callback(callback.on_item_take, self.on_item_take, self) self.object:set_callback(callback.on_item_drop, self.on_item_drop, self) self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self) self.object:set_callback(callback.task_state, self.task_callback, self) --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self) self.object:set_callback(callback.level_border_enter, self.level_border_enter, self) self.object:set_callback(callback.level_border_exit, self.level_border_exit, self) self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) Это доступные коллбэки. В самом низу этого списка пишем self.object:set_callback(callback.hit, self.actor_hit_callback, self) -- хит актору это новоиспечённый коллбэк. Далее ищем: function actor_binder:net_destroy() И ниже: self.object:set_callback(callback.inventory_info, nil) self.object:set_callback(callback.article_info, nil) self.object:set_callback(callback.on_item_take, nil) self.object:set_callback(callback.on_item_drop, nil) --self.object:set_callback(callback.actor_sleep, nil) self.object:set_callback(callback.task_state, nil) self.object:set_callback(callback.level_border_enter, nil) self.object:set_callback(callback.level_border_exit, nil) self.object:set_callback(callback.take_item_from_box, nil) И в самом низу этого списка дописываем: self.object:set_callback(callback.hit, nil) Сие есть отрегистрация коллбэка. Далее где-нибудь среди функций, например под: function actor_binder:take_item_from_box(box, item) local story_id = box:story_id() if story_id == nil then return end ... end Пишем как-то так: function actor_binder:actor_hit_callback(obj) effect_blood.wounded_pp_update() -- это файл скрипта пост- эффекта и функция пост-эффекта в нём end Ииии всё! Теперь, когда мы повесили скрипт на коллбэк хита автору, он: А. Не будет постоянно висеть на апдейте а срабатывать только когда ГГ получает по щам. Б. Будет срабатывать мгновенно при крит.хите. Приятной игры. (Принцип активации коллбэка подсмотрен в ОГСЕ) 3 Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Поделиться этим сообщением Ссылка на сообщение
UriZzz 1 004 Опубликовано 4 Октября 2019 (изменено) Товарищи - скриптеры, помогите разобраться со скриптом. В проблема с одним из примеров от @amik, Скрытый текст local obj = alife():story_object( 6 ) -- 6 - сид Волка local obj_id = obj.id function add_spot_on_map(obj_id,type,text) if obj_id then if not text then text = "no_text" end level.map_add_object_spot_ser(obj_id, type, text) end end Вызываем: function add_spot_on_map2(obj_id,type,text) имя_файла.add_spot_on_map(obj.id,"green_location","Текст") end Метку можно убрать вот так: local obj = alife():story_object( 6 ) local obj_id = obj.id function remove_spot_from_map(obj_id,type) if obj_id and level.map_has_object_spot(obj_id, type) ~= 0 then level.map_remove_object_spot(obj_id, type) end end эту вызывать: function remove_spot() this.remove_spot_from_map(obj.id,"green_location") end Во первых в функциях вызова допущена ошибочка - аргумент obj.id точку нужно заменить на видимый пробел, иначе будет вылет с руганью на index global 'obj'. Во вторых, скрипт работает но метку вешает по чему-то на гг, а не на того на кого хочу повесить - на Толика, в чём причина? Рассматриваю код уже пол часа и не понимаю в чём причина, функции простые как автомат Калашникова, всё вроде правильно... Изменено 4 Октября 2019 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Поделиться этим сообщением Ссылка на сообщение