MrHeAdShot, gamedata\scripts\xr_motivator.script:пишеш в нём [spoiler]--[[------------------------------------------------------------------------------------------------------------------
автор: mmp mod (Пенёк)
порядок вызова методов биндера:
reload
reinit
load
net_spawn
------------------------------------------------------------------------------------------------- -------------------]]
memtsg = {} --' временная таблица
lasthealth = 0
lastime = nil
local bloodsuckers_restr = {}
bloodsucker_zone_enter = {}
----------------------------------------------------------------------------------------------------------------------
class "motivator_binder" (object_binder)
function motivator_binder:__init (obj) super(obj)
self.loaded = false
self.last_update = 0
----memusage.collect_info(self.object, "__init")
self.first_update = false
self.treasure_processed = false
self.now_in_combat = false
self.strelok_particles_added = false
end
function motivator_binder:extrapolate_callback(cur_pt)
if self.st.active_section then
xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "extrapolate_callback")
self.st.move_mgr:extrapolate_callback(self.object)
end
if patrol(self.object:patrol()):flags(cur_pt):get() == 0 then
return true
end
return false
end
function motivator_binder:reinit()
object_binder.reinit(self)
--memusage.collect_info(self.object, "reinit_start")
--printf("motivator_binder:reinit(): self.object:name()='%s'", self.object:name())
-- КОЛЛБЕКИ ЗДЕСЬ СТАВИТЬ НЕЛЬЗЯ! Здесь еще неизвестна активная схема.
-- Ставьте коллбеки в методе update в отмеченном комментарием месте.
local char_ini = self.object:spawn_ini() or ini_file("scripts\\dummy.ltx")
---------------------------------------------------------------------------------------------------------- ------------
-- Общие скрипты
----------------------------------------------------------------------------------------------------------------------
db.storage[self.object:id()] = { followers = {} }
self.st = db.storage[self.object:id()]
--' Создание менеджера контроля положений тела
--memusage.collect_info(self.object, "before_statemgr")
self.st.state_mgr = state_mgr.bind_manager(self.object)
self.st.move_mgr = move_mgr.move_mgr(self.object)
self.st.move_mgr:initialize()
--memusage.collect_info(self.object, "after_statemgr")
--memusage.collect_info(self.object, "reinit_end")
end
----------------------------------------------------------------------------------------------------------------------
f unction motivator_binder:net_spawn(sobject)
printf("motivator_binder:net_spawn(): self.object:name()='%s'", self.object:name())
local ppos = self.object:position()
--printf("position [%s][%s][%s]", ppos.x, ppos.y, ppos.z)
xrs_dyn_music.npc_table[self.object:id()] = self.object
--memusage.collect_info(self.object, "netspawn_start")
if not object_binder.net_spawn(self, sobject) then
return false
end
--' Кешируем squad
db.storage[self.object:id()].squad_obj = sim_board.get_sim_board().squads[alife():object(self.object:id()).squad_id]
-- if self.object:spawn_ini():section_exist("dont_spawn_online") then
-- printf("!!!OFFLINE")
-- alife():object(self.object:id()).dont_spawn_online = true
-- end
db.add_obj(self.object)
-- Все CALLBACK-и ставить здесь:
self.object:set_patrol_extrapolate_callback(motivator_binder.extrapolate_callback, self)
self.object:set_callback(callback.hit, motivator_binder.hit_callback, self)
self.object:set_callback(callback.death, motivator_binder.death_callback, self)
self.object:set_callback(callback.use_object, motivator_binder.use_callback, self)
--memusage.collect_info(self.object, "after__callback")
--self.object:set_callback(callback.sound, motivator_binder.hear_callback, self)
-- ставим дефолтное расстояние входа в смарткаверы
self.object:apply_loophole_direction_distance(1.0)
--' Загрузка историй для лагеря.
if self.loaded == false then
local char_ini = ""
local spawn_ini = self.object:spawn_ini()
local filename = nil
if spawn_ini then
filename = utils.cfg_get_string(spawn_ini, "logic", "cfg", self.object, false, "")
printf("filename is [%s]", tostring(filename))
end
if filename ~= nil then
char_ini = ini_file(filename)
else
char_ini = self.object:spawn_ini() or ini_file("scripts\\dummy.ltx")
end
printf("xr_info loaded!!!")
xr_info.loadInfo(self.object, char_ini)
end
if not self.object:alive() then
return true
end
-- setting npc relation and sympathy from storage
local relation = db.goodwill.relations and db.goodwill.relations[self.object:id()]
if relation ~= nil and db.actor then
game_relations.set_npcs_relation(self.object, db.actor, relation)
end
local sympathy = db.goodwill.sympathy and db.goodwill.sympathy[self.object:id()]
if sympathy ~= nil then
game_relations.set_npc_sympathy(self.object, sympathy)
end
game_relations.set_level_faction_community(self.object)
db.add_enemy( self.object )
self.e_index = db.heli_enemy_count - 1
--' загрузка озвучки
--memusage.collect_info(self.object, "before_soundmgr")
sound_theme.init_npc_sound(self.object)
--memusage.collect_info(self.object, "after_soundmgr_netspawn_end")
--' Для зомбированных чуваков говорим что аномалий не существует
-- if self.object:character_community() == "zombied" then
local manager = self.object:motivation_action_manager()
manager:remove_evaluator (stalker_ids.property_anomaly)
manager:add_evaluator (stalker_ids.pr operty_anomaly, property_evaluator_const(false))
-- end
xr_smartcover.init_global_evaluators(self.object)
smart_terrain.setup_gulag_and_logic_on_sp awn(self.object, self.st, sobject, modules.stype_stalker, self.loaded)
--' грузим универсальную реакцию на болотную тварь
bloodsucker_reaction.add_bloodsucker_reactions(self.object)
--' грузим универсальную реакцию на актёра вышедшего из левелчейнджера
actor_reaction.add_actor_reactions(self.object)
--' Универсальный тормоз на выход из комбата
if self.object:character_community() ~= "zombied" then
post_combat_idle.add_post_combat_idle(self.object)
end
self.object:group_throw_time_interval(2000)
if self.object:profile_name() == "stc_strelok" then
printf("strelok_health [true]")
stc_strelok_health_manager.cs_strelok_health(self.object)
end
return true
end
function motivator_binder:net_destroy()
--printf("motivator_binder:net_destroy(): self.object:name()='%s'", self.object:name())
xrs_dyn_music.npc_table[self.object:id()] = nil
xrs_dyn_music.stop_combat(self.object:id())
xr_sound.stop_sounds_by_id(self.object:id())
local st = db.storage[self.object:id()]
if st.active_scheme then
xr_logic.issue_event(self.object, st[st.active_scheme], "net_destroy", self.object)
end
db.del_obj(self.object)
db.storage[self.object:id()] = nil
self:clear_callbacks()
if self.e_index ~= nil then
db.delete_enemy( self.e_index )
end
if self.object:profile_name() == "stc_strelok" then
stc_strelok_health_manager.remove_health_bar()
end
object_binder.net_destroy(self)
end
function motivator_binder:clear_callbacks()
self.object:set_patrol_extrapolate_callback(nil)
self.object:set_callback(callback.hit, nil)
self.object:set_callback(callback.death, nil)
-- self.object:set_callback(callback.use_object, nil)
end
function motivator_binder:hit_callback(obj, amount, local_direction, who, bone_index)
callstack()
-- FIXME: коллбеки неплохо было бы регистрировать в общем storage, а не посхемно...
-- просто всегда ставить их при включении схемы и снимать при отключении.
if obj:profile_name() == "stc_strelok" then
stc_strelok_health_manager.hit_callback(obj, who, amount)
end
if self.st.active_section then
xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "hit_callback", obj, amount, local_direction, who, bone_index)
end
if self.st.combat_ignore then
xr_logic.issue_event(self.object, self.st.combat_ignore, "hit_callback", obj, amount, local_direction, who, bone_index)
end
if self.st.combat then
xr_logic.issue_event(self.object, self.st.combat, "hit_callback", obj, amount, local_direction, who, bone_index)
end
if self.st.hit then
xr_logic.issue_event(self.object, self.st.hit, "hit_callback", obj, amount, local_direction, who, bone_index)
end
if amount > 0 then
printf("HIT_CALLBACK: %s amount=%s bone=%s", obj:name(), amount, tostring(bone_index))
sr_territory.issue_event(self.object, "hit_callback", obj, amount, local_direction, who, bone_index)
xr_wounded.hit_callback(self.object:id())
sim_combat.hit_callback(self.object:id(),who:id())
end
end
function motivator_binder:death_callback(victim, who)
--russian-stalker addon
--Динамические новости
local m_post_message = ""
local messages_none = {
"Ты на пенёк сел должен был косарьб отдать ну а хули тут так мало ты уёбок??",
"Сахаров, если это выброс, скинь мне касарь",
"Количество выбросов неумолимо растёт",
"Может это был суицид",
"Давно такой хуйни не видел"
}
local messages_kill = {
"Ебаная сукааа.!",
"Ебланом больше - ебланом меньше, хех!",
"О! Сидрыч, хоть и не я убил его, но с тебя всё-равно причитается!",
"Бармен, чё делать-то теперь? Ладно, пойду посмотрю на труп, вдруг на флешке инфа эта есть... Если чё, пиши в личку.",
"Оба-на, ходил-то с такой-то пушкой, а отбиться не смог... Пойду прогуляюсь за его стволом... Если чё, то я ёе первый забил!",
"Эх, собаке - собачья смерть.",
"Шакальё совсем озверело, давно пора этих уродов в расход...",
"Уроды! Мать их! Совсем страх потеряли!... ",
"Ээээээ... Ну чё, братцы?! Кто со мной крыс этих мочить?!... ",
"Да когда ж это кончится?!... ",
"Твою мать! А я-то думал, что всех порешил...",
"Мля, только вчера с ним виделись... Жаль пацана...",
"Земля пухом! Хороший сталкер был... Пойду КПК подберу, мож хабар остался...",
"Что с зоной происходит?... Раньше вот за хабаром ходили, боялись монстров и аномалий, а сейчас и брата сталкера опасаться приходится...",
"Вояки новое оружие в Зону закинули. Вот бы достать...",
"Видел военного в страном комбезе. Узнал только Сферу, броник чудной...",
"Мне тут натрещали, что вояки БТР восстановили. Смотрите по сторонам...",
"Что-то вертолеты разлетались. К дождю.. Хе-хе..",
"Говорят, вояки приторговывают снарягой. Кто-нить, сходите, узнайте.",
"Тут вояки где-то пулемет раскопали. Стреляют по воронам...",
"Мужики, на кордон заход с болот неудобный, у поста вояк. Стерегитесь, идите ночью.",
"За барахолкой мутантов полно. Кто хабар несет, осторожно.",
"Черт, снорка дохлого видел. Его химера прикончила.",
"Видел стаю кабанов. Откормились, блин, на радиоактивных харчах..",
"Что-то зомбяки повылазили. Поосторожнее, пули их почти не берут.",
"Блин, воронье разлеталось. Падаль где-то валяется, наверно. Стерегитесь.",
"У, какие хряки тут бегают! Кому копытце принести?",
"Блин, в болотах плоти бегают. Здоровые...",
"Чьорт побери, контролер в Подземельях лютует, завалил бы кто",
"Бюрера захерачил, упарился...",
"У базы бандюков на свалке видел кровососа. А он меня нет.",
"На Свалке снорки расплодились. Радиация их не берет, что ли.",
"На Армейских Складах на болоте были замечены снорки, количество мне не уточнили. Не попадитесь.",
"В Долине кошки бродят. Чудно.",
"На складах Излома видел. Жуть.",
"На Агропроме живности расплодилось... Подзаработать на отстреле можно.",
"Псевдособака набросилась, еле пристрелил!",
"Чуваки! Тут эта, зомбяки ходют! В долине...",
"На Янтаре мертвые с акээмами стоятъ... И тишина...",
"Пля, на снорка две обоймы извел. Прыгучий, гад...",
"Мужики, кровососа тока картечь в бошку валит. На заметочку так...",
"Ща такого хряка завалил! Копыта на десять кило!",
"Уффф! кровососа захерачил...Весь взмок...",
"Хе-хе, котяру поймал и хвост отхватил. Кому продать?!",
"Мужики, в Болотах какой-то зеленой жгучей херни полно. Осторожно.",
"Ну вот и ещё один конкурент в мир иной отошёл... Аминь!...",
"А говорил - заговорённый!... хех!...",
"Вот мля, а он мне денег должен!",
"Что у него было при себе? Иль всё убийца выгреб?",
"Такого человека погубили!!!",
"Ну и поделом ему!!!",
"Я недалеко! Могу помочь!",
"Друга моего сволочи убили! Парни, вы не видели кто это сделал? Если видели, стукните в личку",
"Одним 'стариком' меньше.",
"Шрам, небойсь, прибил бедного.",
"Жопой чую, не к добру это...",
"Не засоряем канал! Ну помер мужик...не первый и не последний.",
"Видал я этого. Давно надо было порешить.",
"-1",
"Сахаров сказал, что скоро может быть выброс. Но пока Зона не стабильна, он не знает наверняка.",
"Кто на Янтаре - ОСТОРОЖНО! Видел большую кучу зомби...пошёл-ка я отсюда",
"Фу-х! Слава Богу, что я с ним не пошёл сегодня на ходку. Вот чуяло моё сердце!",
}
local messages_monster = {
"Вояки новое оружие в Зону закинули. Вот бы достать...",
"Видел военного в страном комбезе. Узнал только Сферу, броник чудной...",
"Мне тут натрещали, что вояки БТР восстановили. Смотрите по сторонам...",
"Что-то вертолеты разлетались. К дождю.. Хе-хе..",
"Говорят, вояки приторговывают снарягой. Кто-нить, сходите, узнайте.",
"Тут вояки где-то пулемет раскопали. Стреляют по воронам...",
"Мужики, на кордон заход с болот неудобный, у поста вояк. Стерегитесь, идите ночью.",
"За барахолкой мутантов полно. Кто хабар несет, осторожно.",
"Черт, снорка дохлого видел. Его химера прикончила.",
"Видел стаю кабанов. Откормились, блин, на радиоактивных харчах..",
"Что-то зомбяки повылазили. Поосторожнее, пули их почти не берут.",
"Блин, воронье разлеталось. Падаль где-то валяется, наверно. Стерегитесь.",
"У, какие хряки тут бегают! Кому копытце принести?",
"Блин, в болотах плоти бегают. Здоровые...",
"Чьорт побьери, контролер в Подземельях лютует, завалил бы кто",
"Бюрера захерачил, упарился...",
"У базы бандюков на свалке видел кровососа. А он меня нет.",
"На Свалке снорки расплодились. Радиация их не берет, что ли.",
"На Армейских Складах на болоте были замечены снорки, количество мне не уточнили. Не попадитесь.",
"В Долине кошки бродят. Чудно.",
"На складах Излома видел. Жуть.",
"На Агропроме живности расплодилось... Подзаработать на отстреле можно.",
"Псевдособака набросилась, еле пристрелил!",
"Чуваки! Тут эта, зомбяки ходют! В долине...",
"На Янтаре мертвые с акээмами стоятъ... И тишина...",
"Пля, на снорка две обоймы извел. Прыгучий, гад...",
"Мужики, кровососа тока картечь в бошку валит. На заметочку так...",
"Ща такого хряка завалил! Копыта на десять кило!",
"Уффф! кровососа захерачил...Весь взмок...",
"Хе-хе, котяру поймал и хвост отхватил. Кому продать?!",
"Мужики, в Болотах какой-то зеленой жгучей херни полно. Осторожно.",
"Ну говорил же я ему, что там твари эти шляются! Не послушал, и вот результат...",
"Неудачник...",
"Я пупею... Говорил, что безопасно там, безопасно... Хорошо что я отказался в последний момент с ним идти, а то бы, глядишь, рядом с ним полёг...",
"Нда... Прогулялся за хабаром... Судьба...",
"Что сказать?... Зона для сталкера не место для прогулки…",
"Страшная смерть! Надеюсь не мучился брадяга...",
"Вчера только там зачистку делали, тропку сделать надо было... Мля...",
"Да говорил я всем уже - не ходить в то место, тварей не мерено!... Почему Че в сеть не скинул?...",
"Хороший мужик был, рисковый, хабаром делился когда туго было, земля пухом, брат сталкер!",
"Ещё один в зону попёрся, когда уже разуму наберутся?... Все же знают - не меньше чем по по двое ходить надо!...",
"Разорвали бродягу!... Ну уж нет, я раньше пулю в голову себе пущу!...",
"Таак... Где это он напоролся?... Надо срисовать координаты...",
"Бьют тварей бьют, а их всё больше становится...",
"Во живность плодится - сталкеру шагнуть негде!",
"Животное, говорите, убило?",
"Во молодёжи понаехало, уже монстра убить не могут...",
"Стучите в личку! Пойдем на монстра.",
"Я нашел труп! Никому бы не пожелал такой смерти.",
"Монстр его на куски разорвал.",
"Так ему и надо!",
"Эх зона сколько жизней загубила..." ,
"Я тут по этому поводу анекдот вспомнил..."
}
local fnames = {
"Руслан",
"Саша",
"Сергей",
"Слава",
"Толик",
"Юра",
"Богдан",
"Вениамин",
"Виталий",
"Вова",
"Дима",
"Иван",
"Костя",
"Леша ",
"Андрей",
"Санек",
"Шурик",
"Вадя",
"Васян",
"Васек",
"Витюха",
"Веталь",
"Вован",
"Жорка",
"Гришка",
"Гришко",
"Димон",
"Л еха",
"Димуха",
"Жека",
"Фимка",
"Илюха",
"Костян",
"Митька",
"Михал",
"Миха",
"Михась",
"Колян",
"Толян",
"Павлуха",
"Петруха" ,
"Степка",
"Степуха",
"Тимоха",
"Фелька",
"Юрась",
"Яшка",
"Андрюха",
"Тоха",
"Аркаша",
"Тёмка",
"Борян",
"Бодя",
"Андрей",
" Антон",
"Олег",
"Роман",
"Александр",
"Сергей",
"Анатолий",
"Юрий",
"Богдан",
"Вениамин",
"Виталий",
"Владимир",
"Дмитрий",
"Ива н",
"Константин",
"Алексей",
"Саня",
"Санек",
"Артур",
"Яшка",
"Ярик",
"Яра",
"Слава",
"Боря",
"Борька",
"Богдан",
"Славик",
" Вадим",
"Вадя",
"Вадик",
"Валик",
"Валера",
"Шурик",
"Вася",
"Васька",
"Васько",
"Веня",
"Витя",
"Витька",
"Виталик",
"Влад",
" Вова",
"Вовка",
"Леня",
"Сева",
"Севка",
"Гена",
"Генка",
"Георг",
"Гоша",
"Жора",
"Герман",
"Глеб",
"Гриша",
"Алекс",
"Гришка ",
"Гришко",
"Даня",
"Данила",
"Данько",
"Денис",
"Дима",
"Димка",
"Дмитро",
"Женя",
"Лешка",
"Женька",
"Егор",
"Егорка",
"Фим а",
"Ваня",
"Ванька",
"Игорек",
"Илья",
"Костя",
"Костик",
"Толик",
"Лева",
"Леня",
"Ленька",
"Макс",
"Матвей",
"Митя",
"Миша" ,
"Мишка",
"Никита",
"Ник",
"Антон",
"Коля",
"Олег",
"Паша",
"Пашка",
"Петро",
"Петя",
"Петька",
"Рома",
"Ромка",
"Ростик",
" Тошка",
"Рус",
"Сава",
"Семен",
"Сема",
"Серега",
"Сеня",
"Степан",
"Степа",
"Тима",
"Тимка",
"Артем",
"Федор",
"Федя",
"Федьк а",
"Филя",
"Филька",
"Эдик",
"Юрка",
"Юрик",
"Юрко",
"Яша"
}
local snames = {
"Хирург",
"Шпион",
"Бизон",
"Бобер",
"Бульдог",
"Бык",
"Воробей",
"Дятел",
"Зверь",
"Змей",
"Горбун",
"Кабан",
"Карась",
"Ке нарь",
"Клоп",
"Легавый",
"Лось",
"Пацюк",
"Удав",
"Батон",
"Битый",
"Длинный",
"Беспредел",
"Болт",
"Бритва",
"Бубен",
"Валет" ,
"Винт",
"Динамит",
"Козырь",
"Кастет",
"Косяк",
"Дохлый",
"Крест",
"Крюк",
"Лапоть",
"Лом",
"Панадол",
"Перо",
"Пистон",
"Пя так",
"Решка",
"Смерть",
"Доходяга",
"Точило",
"Туз",
"Чекан",
"Чучело",
"Шило",
"Шпала",
"Штырь",
"Шухер",
"Кулак",
"Череп",
" Дохляк",
"Бармалей",
"Батый",
"Кащей",
"Рембо",
"Сусанин",
"Терминатор",
"Чапай",
"Чингиз",
"Банан",
"Батон",
"Дырявый",
"Батя",
"Баян",
"Братан",
"Гангрена",
"Глюк",
"Градус",
"Дух",
"Звездец",
"Изгой",
"Кастет",
"Жженый",
"Козырь",
"Косяк",
"Лапоть",
" Леший",
"Мавр",
"Ништяк",
"Облом",
"Пельмень",
"Перец",
"Рашпиль",
"Жирдяй",
"Сухарь",
"Упырь",
"Жлоб",
"Битый",
"Жмот",
"Жмур" ,
"Изверг",
"Калека",
"Колотун",
"Косой",
"Кривой",
"Ловкач",
"Лысый",
"Лютый",
"Блатной",
"Местный",
"Мутный",
"Мятый",
"Одног лазый",
"Падла",
"Паразит",
"Пижон",
"Подлец",
"Покойник",
"Псих",
"Болтун",
"Рваный",
"Рвач",
"Слепой",
"Сопля",
"Стиляга",
"С толичный",
"Трупак",
"Ухарь",
"Ушастый",
"Хохмач",
"Борзой",
"Гнилой"
}
monster_classes = {
[clsid.bloodsucker_s] = "Кровосос",
[clsid.boar_s] = "Кабан",
[clsid.dog_s] = "Собака",
[clsid.flesh_s] = "Плоть",
[clsid.pseudodog_s] = "Псевдособака",
[clsid.burer_s] = "Бюрер",
[clsid.cat_s] = "Кошка",
[clsid.chimera_s] = "Химера",
[clsid.controller_s] = "Контролёр",
[clsid.fracture_s] = "Излом",
[clsid.poltergeist_s] = "Полтергейтс",
[clsid.gigant_s] = "ПсевдоГигант",
[clsid.zombie_s] = "Зомби",
[clsid.snork_s] = "Снорк",
[clsid.tushkano_s] = "Тушканчик",
[clsid.psy_dog_s] = "Псевдособака",
[clsid.psy_dog_phantom_s] = "Призрак псевдособаки",
[clsid.rat] = "Крыса"}
local m_game_vertex = who:game_vertex_id()
local lvert = game_graph():vertex(m_game_vertex)
local lid = lvert:level_id()
local mlevel = alife():level_name(lid)
local m_s_level = mlevel
local victim_name = victim:character_name()
local killer_name = who:character_name()
local victim_comm = victim:character_community()
local killer_comm = who:character_community()
local post_message_prob = 0.8
if killer_comm=="monster" then
local m_clsid = get_clsid(who)
killer_name = monster_classes[m_clsid]
if math.random() < post_message_prob then
m_post_message = messages_monster[math.random(table.getn(messages_monster))]
end
end
if killer_comm~="monster" then
if math.random() < post_message_prob then
m_post_message = messages_kill[math.random(table.getn(messages_kill))]
end
end
if killer_name==victim_name then
killer_name="Выброс"
killer_comm="monster"
if math.random() < post_message_prob then
m_post_message = messages_none[math.random(table.getn(messages_none))]
end
end
if killer_comm~=nil then
local m_text_kill_string=victim_name.." "..game.translate_string(victim_comm)..". "..game.translate_string(m_s_level)
local news_text = "%c[255,255,160,0]".."Погиб Сталкер:".."\\n".."%c[default]"..m_text_kill_string
local news_caption = game.translate_string("st_tip")
local texture = "ui_iconsTotal_weapons"
db.actor:give_game_news(news_caption, news_text, texture, 15*1000, 15*1000)
if (m_post_message ~= "") then
local fname = fnames[math.random(table.getn(fnames))]
local sname = snames[math.random(table.getn(snames))]
local from = fname.." "..sname
local news_text = "%c[255,160,160,160]"..from.."\\n".."%c[default]"..m_post_message
db.actor:give_game_news(news_caption, news_text, "ui_iconsNpc_stalker_neytral_balon_6",25*1000, 15*1000)
end
end
--end
callstack()
--' Distemper 03.2008 --
xrs_dyn_music.stop_combat(self.object:id())
--' Если игрок был с квестом от механика - фейлить его
local tm = task_manager.get_task_manager()
local inited_find_upgrade_tasks = tm.inited_find_upgrade_tasks
if inited_find_upgrade_tasks and inited_find_upgrade_tasks[self.object:id()] then
for k,v in pairs(inited_find_upgrade_tasks[self.object:id()]) do
printf("failing task %s status %s", tostring(v.id), tostring(v.status) )
if v.status == "selected" then
v.last_check_task = "fail"
end
end
end
local st = db.storage[self.object:id()]
local npc = self.object
stalker_generic.remove_level_spot(npc, st)
--' end --
if who:id() == db.actor:id() then
xr_statistic.addKillCount(self.object)
xr_statistic.inc_killed_stalkers_counter()
end
--' Загрузка историй для лагеря.
local known_info = utils.cfg_get_string(st.ini,st.section_logic , "known_info", self.object, false, "", nil)
printf("xr_info from death loaded!!!")
xr_info.loadInfo(self.object, st.ini, known_info)
if self.st.death then
xr_logic.issue_event(self.object, self.st.death, "death_callback", victim, who)
end
if self.st.active_section then
xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "death_callback", victim, who)
end
sr_territory.issue_event(self.object, "death_callback", victim, who)
sr_light.check_light(self.object)
death_manager.drop_manager(self.object):create_release_item()
db.delete_enemy( self.e_index )
self:clear_callbacks()
-- Отключаем реакцию на кровососа
bloodsucker_reaction.disable_bloodsucker_reaction(self.object)
--' Наносим небольшой импульс вперед.
if(actor_stats.remove_from_ranking~=nil)then
local community = self.object:character_community()
if community == "zombied" or
community == "monolith" or
community == "arena_enemy"
then
else
actor_stats.remove_from_ranking(self.object:id())
end
end
release_body_manager.get_release_body_m anager():moving_dead_body(self.object) --' Distemper 11.02.2008
end
function motivator_binder:use_callback(obj, who)
printf("motivator_binder:use_callback(obj, who)")
if self.object:alive() then
inventory_upgrades.need_victim(obj) --' Distemper 03.2008
xr_use.notify_on_use(obj, who)
if self.st.active_section then
xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who)
end
else
if self.treasure_processed == false then
printf("treasure_manager.use(self.object)")
treasure_manager.use(self.object)
self.treasure_processed = true
end
end
end
function motivator_binder:update(delta)
object_binder.update(self, delta)
if bind_stalker.to_delayed_alife_release_objects[self.object:id()] == true then
printf("releasing object ["..self.object:name().."]")
alife():release(alife():object(self.object:id()),true)
return
end
local object_alive = self.object:alive()
local object = self.object
local actor = db.actor
local st = db.storage[object:id()]
local st_combat = st.combat
if not self.strelok_particles_added and object:profile_name() == "stc_strelok" then
object:start_particles("monsters\\polter_idle","bip01_head")
self.strelok_particles_added = true
end
if st ~= nil and st.active_scheme ~= nil and object_alive then
-- Обрабатываем Override on_combat
local switched = false
local manager = object:motivation_action_manager()
if manager:initialized() and manager:current_action_id() == stalker_ids.action_combat_planner then
local overrides = xr_logic.generic_scheme_overrides(object)
if overrides then
if overrides.on_combat then
xr_logic.pick_section_from_condlist(actor, object, overrides.on_combat.condlist)
end
if st_combat and st_combat.logic and not xr_logic.try_switch_to_another_section(object, st_combat, actor) then
if overrides.combat_type then
set_combat_type(object, actor, overrides)
end
else
switched = true
end
else
set_combat_type(object, actor, st_combat)
end
end
if not switched then
xr_logic.try_switch_to_another_section(object, st[st.active_scheme], actor)
end
else
-- если нет активной секции, то тип боя взять из секции on_combat
xr_combat.set_combat_type(object, actor, st_combat)
end
if self.first_update == false then
if object_alive == false then
death_manager.drop_manager(object):create_release_item()
end
self.first_update = true
end
if time_global() - self.last_update > 1000 then
sr_light.check_light(object)
self.last_update = time_global()
end
--' проверка, не находится ли сталкер в одном из sr_bloodsucker
for k,v in pairs(bloodsuckers_restr) do
if v:inside(object:position()) and object:alive() then
if bloodsucker_zone_enter[k] == nil then
-- printf("ZONE ENTERED")
bloodsucker_zone_enter[k] = object
end
else
if bloodsucker_zone_enter[k] ~= nil then
-- printf("ZONE ENTERED")
bloodsucker_zone_enter[k] = nil
end
end
end
--' Выбираем активный сектор для НПС
self.st.active_sector = sr_danger.select_active_sectors(object)
--' Апдейт менеджера состояний тела
if self.st.state_mgr then
if object_alive then
self.st.state_mgr:update()
-- Апдейт торговли
if self.st.state_mgr.combat == false and
self.st.state_mgr.alife == false
then
trade_manager.update(object)
end
else
self.st.state_mgr = nil
end
end
--' Апдейт саундменеджера
if object_alive then
xr_sound.update(object:id())
end
-- Апдейт отряда
local squad = db.storage[self.object:id()].squad_obj
if squad ~= nil then
if squad.commander_id == self.object:id() then
squad:update()
end
end
--[[
object:info_clear()
if object_alive then
local active_section = db.storage[object:id()].active_section
if active_section then
object:info_add("section: " .. active_section)
end
local best_enemy = object:best_enemy()
if best_enemy then
object:info_add("enemy: " .. best_enemy:name())
end
object:info_add(object:name().." ["..object:team().."]["..object:squad().."]["..object:group().."]")
if alife():object(object:id()) == nil then
return
end
local squad = db.storage[object:id()].squad_obj
if squad ~= nil then
object:info_add("squad_id: " .. squad.squad_id)
if squad.sim_combat_id ~= nil then
local smart = sim_board.get_sim_board().smarts[squad.sim_combat_id].smrt
local sim_combat = smart.combat_manager
object:info_add("sim_combat: stage[" .. sim_combat:get_squad_stage(squad).."]")
end
end
if object:is_talk_enabled() then
object:set_tip_text("character_use")
else
object:set_tip_text("")
end
else
object:set_tip_text_default()
end
]]
end
function motivator_binder:reload(section)
--memusage.collect_info(self.object, "reload_start")
object_binder.reload(self, section)
--printf("motivator_binder:reload(): self.object:name()='%s'", self.object:name())
--self.object:set_pda_callback(pda_callback)
--memusage.collect_info(self.object, "reload_end")
end
function motivator_binder:net_save_relevant()
--printf("motivator_binder:net_save_relevant(): self.object:name()='%s'", self.object:name())
return true
end
function motivator_binder:save(packet)
set_save_marker(packet, "save", false, "motivator_binder")
object_binder.save(self, packet)
if self.object:profile_name() == "stc_strelok" then
stc_strelok_health_manager.save(packet)
end
packet:w_bool(self.treasure_processed)
xr_logic.save_obj(self.object, packet)
trade_manager.save(self.object, packet)
-- treasure_manager.save(packet)
xr_sound.save_npc(packet, self.object:id())
dialog_manager.save_npc(packet, self.object:id())
set_save_marker(packet, "save", true, "motivator_binder")
end
function motivator_binder:load(reader)
self.loaded = true
printf("obj1: [%s]", self.object:name())
set_save_marker(reader, "load", false, "motivator_binder")
printf("obj2: [%s]", self.object:name())
object_binder.load(self, reader)
printf("obj3: [%s]", self.object:name())
if self.object:profile_name() == "stc_strelok" then
stc_strelok_health_manager.load(reader)
end
self.treasure_processed = reader:r_bool()
xr_logic.load_obj(self.object, reader)
trade_manager.load(self.object, reader)
-- treasure_manager.load(reader)
xr_sound.load_npc(reader, self.object:id())
dialog_manager.load_npc(reader, self.object:id())
set_save_marker(reader, "load", true, "motivator_binder")
end
function motivator_binder:hear_callback(self, who, sound_type, sound_position, sound_power)
if who:id() == self:id() then
return
end
local type = "NIL"
if bit_and(sound_type, snd_type.weapon) == snd_type.weapon then
type = "WPN"
if bit_and(sound_type, snd_type.weapon_shoot) == snd_type.weapon_shoot then
type = "WPN_shoot"
elseif bit_and(sound_type, snd_type.weapon_empty) == snd_type.weapon_empty then
type = "WPN_empty"
elseif bit_and(sound_type, snd_type.weapon_bullet_hit) == snd_type.weapon_bullet_hit then
type = "WPN_hit"
elseif bit_and(sound_type, snd_type.weapon_reload) == snd_type.weapon_reload then
type = "WPN_reload"
end
elseif bit_and(sound_type, snd_type.item) == snd_type.item then
type = "ITM"
if bit_and(sound_type, snd_type.item_pick_up) == snd_type.item_pick_up then
type = "ITM_pckup"
elseif bit_and(sound_type, snd_type.item_drop) == snd_type.item_drop then
type = "ITM_drop"
elseif bit_and(sound_type, snd_type.item_hide) == snd_type.item_hide then
type = "ITM_hide"
elseif bit_and(sound_type, snd_type.item_take) == snd_type.item_take then
type = "ITM_take"
elseif bit_and(sound_type, snd_type.item_use) == snd_type.item_use then
type = "ITM_use"
end
elseif bit_and(sound_type, snd_type.monster) == snd_type.monster then
type = "MST"
if bit_and(sound_type, snd_type.monster_die) == snd_type.monster_die then
type = "MST_die"
elseif bit_and(sound_type, snd_type.monster_injure) == snd_type.monster_injure then
type = "MST_damage"
elseif bit_and(sound_type, snd_type.monster_step) == snd_type.monster_step then
type = "MST_step"
elseif bit_and(sound_type, snd_type.monster_talk) == snd_type.monster_talk then
type = "MST_talk"
elseif bit_and(sound_type, snd_type.monster_attack) == snd_type.monster_attack then
type = "MST_attack"
elseif bit_and(sound_type, snd_type.monster_eat) == snd_type.monster_eat then
type = "MST_eat"
end
end
if type ~= "NIL" then
printf("SND *%s* dist: %d [%f], %s -> %s", type, self:position():distance_to(who:position()), sound_power, who:name(), self:name())
end
end
function AddToMotivator(npc)
if alife() then
npc:bind_object(this.motivator_binder(npc))
end
end
-- Эвалюаторы, которые имеют высший приоритет, и, соответственно, перебивают остальные скрипты собой
function addCommonPrecondition(action)
--action:add_precondition (world_property(xr_evaluators_id.reaction,false))
action:add_precondition (world_property(xr_evaluators_id.stohe_meet_base + 1,false))
action:add_precondition (world_property(xr_evaluators_id.sidor_wounded_base + 0, false))
--'action:add_precondition (world_property(xr_evaluators_id.chugai_heli_hunter_base, false))
action:add_precondition (world_property(xr_evaluators_id.abuse_base, false))
end
function register_bloodsucker_restr(obj)
printf("registering blood restr!!!")
bloodsuckers_restr[obj:id()] = obj
end
Добавлено (11.05.2011, 00:49:50)
---------------------------------------------
все 2 папки и файл создаёш сам в папке с игрой(я делал на чистое небо но может и на другие пойдёт)