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

Уроки по модостроению


Zeka1996Korneev

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

Скрытый текст

Всем привет!

В этой теме есть замечательный скрипт на пост-эффект при критическом попадании за авторством АМК 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

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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


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

Товарищи - скриптеры, помогите разобраться со скриптом.

В проблема с одним из примеров от @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'.

Во вторых, скрипт работает но метку вешает по чему-то на гг, а не на того на кого хочу повесить - на Толика, в чём причина?

Рассматриваю код уже пол часа и не понимаю в чём причина, функции простые как автомат Калашникова, всё вроде правильно...:unknw::kez_12:

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

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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


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

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