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

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


Zeka1996Korneev

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

Пытался создать спальный мешок согласно посту http://www.amk-team.ru/forum/topic/6458-uroki-po-modostroeniiu/?p=645126

При попытке использовать мешок ловлю вылет с вот таким логом:

Expression : fatal error

 

Function : CScriptEngine::lua_error

 

File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp

 

Line : 73

 

Description : <no expression>

 

Arguments : LUA error: ... \gamedata\scripts\bind_stalker.script:192: attempt to index global 'main_sleep' (a nil value)

Похоже в скрипте main_sleep.script где то автором закралась ошибка.

Кто не будь тэстил сей пример?

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

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

UriZzz.gif

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


Ссылка на сообщение
(изменено)
@Charsi, сработало благодарю:), как я понимаю это просто мод на каратание времени. Но как можно реализовать сон как потребность, что бы гг через некоторое время захотелось спать (начало двоится в глазах, в углу появилась иконка сигнализирующая о том что мол пора баиньки) в этом скрипте как я понимаю, такого нет? Изменено пользователем UriZzz

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

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

UriZzz.gif

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


Ссылка на сообщение
(изменено)
Скрытый текст

Всем привет!

В этой теме есть замечательный скрипт на пост-еффект при критическом попадании за авторством АМК Team

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

Создаем файл effect_blood.script и записываем туда следующее:

lite_treshold = 0.05 -- насколько должно уменьшиться здоровье с предыдущего обновления чтоб экран окрасился в красный crit_treshold = 0.30 -- насколько должно уменьшиться здоровье с предыдущего обновления чтоб ГГ начало шатать drop_item_on_crit_prob = 0.20 -- вероятность того что ГГ выронит оружие effector_power_coeff = 0.7 prev_health = -1 chk_h_t = 0 function wounded_pp_update()   if (chk_h_t or 0) < time_global() then     chk_h_t = time_global()+1000     if prev_health > (db.actor.health + lite_treshold) then       level.add_pp_effector("fire_hit.ppe", 2011, false)       local effector_power = (prev_health - db.actor.health)*100*effector_power_coeff       level.set_pp_effector_factor(2011, effector_power)       if prev_health > db.actor.health + crit_treshold then         level.add_cam_effector("camera_effects\\fusker.anm", 999, false, "")             local snd_obj = xr_sound.get_safe_sound_object([[actor\pain_3]])         snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)         if math.random() < drop_item_on_crit_prob then           local active_item = db.actor:active_item()           if active_item and active_item:section() ~= "bolt" and active_item:section()~= "wpn_knife" then             db.actor:drop_item(active_item)           end         end       end     end     prev_health = db.actor.health   end end

2. Далее открываем bind_stalker.script:
после строчек:

 

function actor_binder:update(delta)   object_binder.update(self, delta)   local time = time_global()   game_stats.update (delta, self.object)

пишем:

effect_blood.wounded_pp_update()

У этого скрипта есть один недостаток: проблема в том что скрипт порой срабатывает с запозданием где то в пол секунды (или около того) после получения хита, смотрится ужасно. Я думаю (поправьте если ошибаюсь) это из-за того что скрипт повешен на апдейт и скорость срабатывания зависит от частоты апдейта. Что бы решить эту проблему без какой нибудь скриптовой чёрной магии придется править движок. Спокойно, не каких тут разборов языка 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

Пишим как то так:

function actor_binder:actor_hit_callback(obj)
    effect_blood.wounded_pp_update() – это файл скрипта пост- эффекта и функция пост-эффекта в нём
end

Ииии всё!

Теперь когда мы повесили скрипт на кэлбэк хита автору он:

А. Не будет постоянно висеть на апдейте а срабатывать только когда ГГ получает по щам.

Б. Будет срабатывать мгновенно при крит.хите.

Приятной игры.

(Принцип активации кэлбэка подсмотрен в ОГСЕ)

 

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

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

Мы хорошие ребята, жаль патронов маловато:):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

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


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

@Antolich, прежде всего вы ошиблись темой. Здесь публикуют готовые примеры кода, который новисы потом могут использовать в своих работах, так шта геть в ковырялку.

  • Согласен 1

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

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

UriZzz.gif

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


Ссылка на сообщение
26.05.2020 в 19:07, misterok21 сказал(а):

Как сделать некролог (сообщение о смерти)

Функция не работает.

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

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

UriZzz.gif

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


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

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

AMK-Team.ru

×
×
  • Создать...