Вы задаёте интересующий вас вопрос и тот, кто может вам на него ответить, пишет свой ответ. Правила темы:
1. Прежде чем задать вопрос, желательно прочитать все предыдущие страницы темы. Даже если вы не найдете там нужного ответа - я уверен, вы узнаете много нового. Второй вариант - воспользоваться поиском по ключевому слову.
2. Вы можете задавать вопросы, только непосредственно касающиеся создания модификаций и редактирования файлов игры
3. Личные вопросы не допускаются
4. Отвечать на вопросы желательно достаточно развернуто, задевая все аспекты касающиеся конкретного вопроса
5. Отвечать вы можете только в том случае если уверены в правильности ответа, если не знаете - просто не отвечайте. Авторы неправильных, вводящих в заблуждение ответов будут наказываться.
6.Соблюдайте грамотность и правильность построения вопросов и ответов, во избежание их удаления. "Спасибо / пожалуйста / не знаю" и прочие односложные и не несущие смысловой нагрузки сообщения, будут удаляться немедленно, а их авторы - наказываться.
Основная цель темы - помочь новичкам-модостроителям, второстепенная - свести на нет тенденцию создания новых тем по каждому интересующему новичков вопросу.
Franki когда-то поделился: 1.Строим рестриктор с нужным радиусом (шейпом)и с логикой типа: ---------------------------
Код
active = sr_idle@one [sr_idle@one] on_actor_inside = {=функция проверки на "мы внутри" и переход в следующую схему, если нужно} sr_idle@dva
[sr_idle@dva] on_actor_outside = sr_idle@one - если выехали из зоны, то возврат в первую схему
ну и что-то ещё нужное
тело самой функции
Код
for a=1,65534 do local obj = level.object_by_id( a) if obj and obj:clsid() == clsid.car_s then ;-- тут именно на класс траспорта и указано local obj_pos = obj:position() local stop_pos = vector():set(53.237545,9.755438,-183.677277) if obj_pos~=nil and obj_pos:distance_to(stop_pos)<"размер рестриктора в цифрах" and restrictor:inside(obj_pos) then " actor:give_info_portion("na_avto") end break end end end
------------- если гг попадает в рестриктор именно на машине, а не пешком, то выдается "actor:give_info_portion("na_avto")" Ну, как то так - Андрей использовал подобную схему в конкурсном задании, я её не проверял.
Сообщение отредактировал Korpus - Понедельник, 16.02.2015, 17:15
В патрульных путях БТР (в all.spawn) есть: ff=true и fb=true. Что это?
А сам не проверял? Если эффекта ни какого не даёт при вставке false (по логике вещей), то , наверняка, очередной атавизм, каких в ТЧ полно. Если ещё пофантазировать на тему, то похоже на "ff - вперёд, fb - назад", т.е. разрешено двигаться, как электричке... или сектора обстрела "по курсу и с кормы".... ну, это мои домыслы
Сообщение отредактировал Korpus - Понедельник, 16.02.2015, 17:30
В общем пробовал я на чистый тч эту схему, после подключения перестали работать другие рестрики! Честно говоря так и не понял в чем дело, ни вылета не последовало ничего вообще, просто ни какой реакции, может это на АМК моде работает?!
после подключения перестали работать другие рестрики
Это у тебя биндер зависает - 150%. Как в этом убедиться? Лично я это вижу, когда "индикатор" lvid-gvid перестаёт изменять показания, часы могут останавливаться, сейвы биться. Внимательнее посмотри на схему вызова этого рестриктора - мож, где косячок его координатами и остальными его параметрами. Если при его построении не возникает зависания, посмотри логику рестриктора, могут быть ошибки в вызываемых через через него поршней и функций. Пробуй вместо вызова нужной сюжетно функции-поршня вызывать простейшие и проверенные тестовые функции-поршни - выдача звука, пост-эффекта, сообщения и подобное. Ищи косяки в тексте кода (лишняя или отсутствующая "точка- запятая" - уже фатально, хотя может быть и не выражено в немедленном крэшэ).
ЦитатаХ_и_м_и_к ()
может это на АМК моде работает?!
Та схема сделана на чистом ТЧ, т.е. без использования скриптов АМК.
Кстати... У тебя "шапка" функции какая? В данном случае надо типа так: function "твоя функция" (actor, restrictor) И помещать её надо было в xr_effects.script
Сообщение отредактировал Korpus - Среда, 18.02.2015, 10:34
1. Ставишь рестриктор, например радиус 15 метров. Логика рестриктора
active = sr_idle@one
[sr_idle@one] on_actor_inside = {=actor_inside_by_car} sr_idle@dva %+actor_inside_by_car% ;инфопорция, что ГГ на машине on_actor_inside2 = {!actor_inside_by_car} sr_idle@dva %+actor_is_walker% ;инфопорция, что ГГ пешком
[sr_idle@dva]
2. Открываешь файл db.script, пишешь туда
car_on_level = {} function add_car( obj ) car_on_level[ obj:id() ] = obj end function del_car( obj ) car_on_level[obj:id()] = nil end
3. Открываешь файл bind_physic_object.script
В метод function generic_physics_binder:net_spawn(data) пишешь
if self.object:clsid() == clsid.car_s then db.add_car( self.object ) end
В метод function generic_physics_binder:net_destroy() пишешь
db.del_car( self.object )
4. Открываешь файл xr_conditions.script пишешь туда
function actor_inside_by_car( actor, obj ) local zone = db.zone_by_name[ obj:name() ] if zone then for k,v in pairs( db.car_on_level ) do if zone:inside( v:position() ) then return true end end end return false end
5. Проверяешь в игре, что получилось.
Терпение...... И все получится!
Сообщение отредактировал makdm - Четверг, 19.02.2015, 08:35
Всем привет Игра (мод Age of Nemesis (ЧН)) вылетает при первом переходе на Кордон Прилагаю лог
Expression : ovi Function : CSoundRender_Source::LoadWave File : E:\priquel\sources\engine\xrSound\SoundRender_Source_loader.cpp Line : 70 Description : Invalid source info: Arguments : c:\program files (x86)\s.t.a.l.k.e.r. age of nemesis\gamedata\sounds\characters_voice\human_02\military\fight\threat\threat_close_5.ogg
и сейвMy WebPage Надеюсь на помощь, уж совсем не хочется сносить игру
ZZZ
Сообщение отредактировал SaZoN - Среда, 25.02.2015, 22:01
SaZoN, runefury, В этой теме помощи не дождётесь именно по вашей проблеме. Напишите каждый в темах именно по своему моду. Эта тема, по работе с файлами вообще, а не по проблемам прохождений и вылетов конкретных модификаций.
Сообщение отредактировал Елена - Четверг, 26.02.2015, 02:35
Когда-то играл в мод SIMBION (к сожалению, заглох), и в нём были ammo_dumdum с эффектом разрыва тела (как в аномалии воронка) Подскажите пожалуйста как их выдернуть на чистую ТЧ 1.0006 В общем проблема в отсутствии эффекта разрыва тела.
В общем проблема в отсутствии эффекта разрыва тела.
В игре Сталкер нет разрыва тела. Вы можете перед НПС поставить хоть сто ящиков с динамитом, а затем взорвать их. Никакого разрыва тела вы не увидите. Просто будет взрыв и рядом будет "валяться" тело без единого повреждения. Не верите? Возьмите гранатомёт и бабахните им в НПС. Увидели разрыв тела? То о чём вы пишите - это визуальный эффект, который создан скриптами. Объясняю на примере ТЧ, как в аномалию попадает плоть. После того как её движок покрутил в аномалии, само тело плоти удаляется. Одновременно запускаются партиклы крови. И на месте плоти спавнятся уже куски тела. К ним прикладывается сила, которая делает их разброс. Движок игры всё делает так быстро, что у игрока возникает иллюзия, что плоть разорвало в аномалии. Поэтому, даже если вы пропишите своему стволу ammo_dumdum и "шмальнёте" в НПС ничего не будет. НПС просто помрёт. Поэтому "выдёргивать" нужно не патроны "дум-дум", а скриптовую часть, которая отслеживает попадание пули "дум-дум" в НПС и после этого производит визуальный эффект разрыва тела. А это нужно смотреть реализацию эффекта в самом моде. Ну, или написать свою.
Терпение...... И все получится!
Сообщение отредактировал makdm - Четверг, 26.02.2015, 22:53
makdm, всё что вы написали, для меня, очевидно. К сожалению в скриптах я неопытен. Обратился, с надеждой может кто ковырялся или заинтересовался. Самому мне будет сложно. Но можно. Подскажите какой вероятный скрипт ковырять.
Я вам подскажу как - бы я сделал. Отследить попадание пули можно на проверке callback.hit Файл xr_motivator.script метод motivator_binder:hit_callback(obj, amount, local_direction, who, bone_index) Здесь можно отследить, что хит нанесён игроком и в руках игрока находится пушка, которая стреляет патронами дум-дум. Если утверждение истина, то вызывается скрипт, который и воспроизводит разрыв тела НПС.
Аналогично делается проверка для монстров. Файл bind_monster.script метод generic_object_binder:hit_callback(obj, amount, local_direction, who, bone_index)
Добрый день (утро,вечер,ночь). Такая проблема.Играю в Лост Альфу и очень хочу что бы мой ГГ бегал с большим количеством груза.Как изменить я в курсе проблема в другом. Геймдата зачем-то разбита на части в файлы формата db.Чем их распаковать нашёл.Но с изменёнными файлами игра работает только если начать новую игру.Сейвы не грузятся)) Думал проблема в том что имеется конфликт между изменёнными распакованными файлами и упаковкой db .Ели нашёл упаковщик.Но увы с изменённым и упакованным файлом игра вообще не запускается.((((( Как мне заставить игру загружать сейв с изменённым файлом???????????????????????? Новую начинать не вариант) Спасибо за внимание.
Как мне заставить игру загружать сейв с изменённым файлом???????????????????????? Новую начинать не вариант)
Проблему решил сам) Так всё просто оказалось.Просто не надо весь архив из db0 оставлять в папке геймдата,а только те фалы которые изменяешь.Ну и конечно нужно их разместить на том месте где они должны быть.К примеру файлик actor.ltx в папке (gamedata\config\creatures\actor.ltx) .Создавая нужные папки если их нет в геймдате.У меня к примеру не было creatures .Так что у меня теперь 130 кг в рюкзаке и ношусь по зоне с ветерком)Надо теперь артефактами заняться ,а то они какие-то унылые)Эх разбаловала Солянка) разбаловала...
Добавлено (28.02.2015, 10:00) --------------------------------------------- Такой вопрос.Как изменить бинокль что бы он подсвечивал всех и неписей и мутантов.А то ЛА это по моему первый мод где такой функции у бинокля нет.
Сообщение отредактировал Вова_Рус - Пятница, 27.02.2015, 22:50
[sections] ;--/ 01 = basic_modules ;--/ НЕ Отключать! 02 = game_modules ;--/ НЕ Отключать! 03 = main_modules ;--/ НЕ Отключать! 04 = ai_modules 05 = user_modules ;==================================================================== ;--/ комментарии по модулям ;--/[0] - критически важный базовый модуль! НЕ УДАЛЯТЬ и НЕ ОТКЛЮЧАТЬ! ;--/[1] - критически важный в локальных ситуациях (квесты, эпизоды, ...). НЕ желательно отключать. ;--/[2] - опциональный(необязательный) для старта игры, но НЕ удалять если был включен. ;--/[3] - опциональный(необязательный) для игры, исключающий отдельные функции/фишки во всей игре. ;--/[4] - опциональный(необязательный) для игры, исключающий отдельные функции/фишки в отдельных эпизодах. ;--/[-] - зависящий от родительского. Отдельно НЕ отключать, отключается только вместе с родительским! ;--/[?] - информация по возможности отключения которого уточняется. ;--/[x] - модуль, находящийся в разработке (т.е. зарезервирован) ;--/ управление: true|false -> в(от)ключить
[basic_modules] ;--/ основные базовые модули 01 = m_hlp , true ;--/[0] Helpers-функции (HE отключать!) 02 = m_timers , true ;--/[0] Таймерные функции (HE отключать!) 03 = m_slave , true ;--/[0] Основные mod-функции (HE отключать!) 04 = m_lvchg , true ;--/[1] Control Level Changers 05 = m_relogic , true ;--/[1] Change old logic ;==================================================================== [game_modules] ;--/ модули оригинальной игры 01 = se_stor , true ;--/[0] The general storehouse (HE отключать!) ... 09 = game_stats , true ;--/[0] "Статистика игры" ;==================================================================== [main_modules] ;--/ модули собственно мода 00 = m_netpk , true ;--/[1] Net-packet'ы 01 = m_patrols , true ;--/[1] Менеджер путей/точек ... 39 = m_effects , true ;--/[3]Эффекты от критического ранения ГГ 40 = m_particles , true ;--/[3]Доп.менеджер партиклов и т.д
m_effects.ltx
;--/ для модуля "Визуальные эффекты" (m_effects.script) [options] ;--/ debug = false ;--/ (false|true) (от|в)ключен режим отладки и вывод в лог доп.собщений radiation = true ;--/ (false|true) (от|в)ключен режим постэффектов радиации gg_kick = true ;--/ (false|true) (от|в)ключен режим "шальная пуля" от АМК blood = true ;--/ (false|true) (от|в)ключен режим "кровавые" эффекты от попадания в ГГ blood_wpn = true ;--/ (false|true) (от|в)ключен "кровавый/взрывной" эффект для некоторых типов оружия
[explosive_weapon] ;--/ 'разрывное' оружие wpn_sgauss = true
local tKeepItems = {} --/ список предметов, которые нельзя удалять (квестовые например) local tWeaponBloody = {} --/ 'кровавое' оружие local tWeaponFlame = {} --/ 'огнемет'ы local tWeaponExplosive = {} --/ 'разрывное' оружие local tBloodyClsids = {} --/ классы 'кровавого' оружия local tNoDrop = {} --/ не выбрасываемые предметы/оружие local iRadPP = nil local iWndPP = nil local iWndPP2 = nil local oSndWnd,oSndWnd2 = nil,nil
local iTimeUpdate = 0 local i,k,v,o --/ ----------------------------------------------------------------- --/ Initialize Module (инициализация, выполняется единожды) --/ ----------------------------------------------------------------- function init() -- printf("init:[%s]", ">") --/#~# event("presets"):register(PreSets) bInit = true end --/ ----------------------------------------------------------------------------------------------- --/ Process (функции) --/ ----------------------------------------------------------------------------------------------- function PreSets(e) -- printf("PreSets:[%s]", ">") --/#~# if not bInit then abort(sModule..":Not_initialised!") end tKeepItems = Get_IniSection("misc\\death_generic.ltx", "keep_items", "true") --/ список предметов, которые нельзя удалять local ltx = ini_file("mods\\"..sModule..".ltx") bDebug = ReadFromIni(ltx, "options", "debug", bDebug, "bool") --/ debug-mode bKickActor = ReadFromIni(ltx, "options", "gg_kick", bKickActor, "bool") --/ "шальная пуля" для ГГ (АМК) bRadPPEnabled = ReadFromIni(ltx, "options", "radiation", bRadPPEnabled, "bool") --/ эффекты от радиации bBloodPPEnabled = ReadFromIni(ltx, "options", "blood", bBloodPPEnabled, "bool") --/ кровавые эффекты от пападания в ГГ bWpnBloody = ReadFromIni(ltx, "options", "blood_wpn", bWpnBloody, "bool") --/ "кровавый/взрывной" эффект для некоторых типов оружия tNoDrop = Get_IniSection(ltx, "no_drop", "true") tWeaponBloody = Get_IniSection(ltx, "bloody_weapon", "true") --/ 'кровавое' оружие tWeaponFlame = Get_IniSection(ltx, "flame_weapon", "true") --/ 'огнемет'ы tWeaponExplosive = Get_IniSection(ltx, "explosive_weapon", "true") --/ 'разрывное' оружие local tCls = Get_IniSection(ltx, "bloody_clsids", "true") --/ классы 'кровавого' оружия for k,v in pairs(tCls) do if v and clsid[k] then tBloodyClsids[clsid[k]] = true end end oSndWnd = xr_sound.get_safe_sound_object("actor\\pain_3") oSndWnd2 = xr_sound.get_safe_sound_object("heart\\2") ReInit_Options() iTimeUpdate = time_global() + 8000 event("options"):register(ReInit_Options) event("npc_hit"):register(OnHit) event("mob_hit"):register(OnHit) event("npc_death"):register(OnDeath) event("mob_death"):register(OnDeath) event("actor_death"):register(OnActorDeath) if bRadPPEnabled or bBloodPPEnabled or bKickActor then timer_1s():register(OnTimer_1s) event("actor_hit"):register(OnActorHit) end end
function ReInit_Options(e) --/ режим 'испарения' тел/оружия при 'взрыве' local iOpt = GetVarA("opt_vpr", 0) bVprCrp = iOpt >= 1 --/ откл/вкл - режим "испарения" тел bVprWpn = iOpt == 2 --/ откл/вкл - режим "испарения" оружия end
function OnActorDeath(e) timer_1s():unregister(OnTimer_1s) event("actor_hit"):unregister(OnActorHit) end
function OnTimer_1s(t,uo) if bRadPPEnabled then Actor_Radiation_PP() end --if bKickActor then --Actor_Wounded_PP() --elseif bBloodPPEnabled then --Actor_Wounded_PP2() --end end
function OnActorHit(e) --/oWho,iAmount Actor_Wounded_PP(e) end --/------------------------------------------------------------------ --/ Эффекты от радиации --/------------------------------------------------------------------ function Actor_Radiation_PP() local iRadiation = db.actor.radiation --/ уровень радиации у ГГ if not iRadPP and iRadiation >= 0.3 then iRadPP = random_u16() level.add_pp_effector("alcohol.ppe", iRadPP, true) elseif iRadPP and iRadiation <= 0.01 then level.remove_pp_effector(iRadPP) iRadPP = nil end end --/------------------------------------------------------------------ --/ Эффекты от критического ранения ГГ --/------------------------------------------------------------------ function Actor_Wounded_PP(e) if e.amount > 0.05 then local oActor = db.actor if oActor then -- log("%s:Actor_Wounded_PP:Health=[%s],Who=[%s]:[%s]", sModule, ShortStr(e.amount), e.who and e.who:name(), ">") --/#~# if not iWndPP then iWndPP = random_u16() level.add_pp_effector("shoot.ppe", iWndPP, false) else level.set_pp_effector_factor(iWndPP,(e.amount)*100) end if e.amount > 0.3 then --/ сильно подранили level.add_cam_effector("camera_effects\\fusker.anm", random_u16(), false, "") oSndWnd:play_no_feedback(oActor, sound_object.s2d, 0, vector(), 1.0) if math.random() < e.amount^2 then Drop_ActiveItem() --/ "потеря" активного предмета end end end end end
--/ "потеря" активного предмета function Drop_ActiveItem() local oItem = db.actor:active_item() if oItem and not tNoDrop[oItem:section()] then db.actor:drop_item(oItem) end end
function Actor_Wounded_PP2() local oActor = db.actor if oActor and oActor.health <= 0.2 then log("%s:Actor_Wounded_PP2:Health=[%s]:[%s]", sModule, oActor.health, ">") --/#~# if not iWndPP2 then iWndPP = random_u16() --level.add_pp_effector("red_fade_out.ppe", 1999, true) level.add_pp_effector("bloody.ppe", iWndPP2, true) level.set_pp_effector_factor(iWndPP, 5.0) if not oSndWnd:playing() then oSndWnd:play_at_pos(oActor, oActor:position(), 1, sound_object.looped) end elseif oSndWnd:playing() then oSndWnd:set_position(oActor:position()) if math.random() <= 0.1 then Drop_ActiveItem() --/ "потеря" активного предмета end end elseif iWndPP2 then level.remove_pp_effector(iWndPP) iWndPP2 = nil if oSndWnd:playing() then oSndWnd:stop() end end end
--/------------------------------------------------------------------ --/ Hit to NPC or Mob --/------------------------------------------------------------------ function OnHit(e) if e.victim and e.amount >= 0.1 and e.who and IsStalker(e.who) and (tonumber(e.bone) or 0) > 0 then OnHit_Firebated(e.victim, e.who) --/ проверка хита из 'огнеметов' end end
--/------------------------------------------------------------------ --/ Check NPC or Mob Dead (гибель непися или монстра) --/------------------------------------------------------------------ function OnDeath(e) -- printf("OnDeath_NPC:Victim=[%s],Who=[%s]:[%s]", e.victim and e.victim:name(), e.who and e.who:name(), ">") --/#~# if e.victim and e.who then if e.victim:section() == "zombie_blow" then --/ убит 'взрывной' зомби, у него свои партиклы и звуки this.OnDeath_ZombyBlow(e.victim, e.who) elseif IsStalker(e.who) then local iTypeWpn = Get_Type_Weapon(e.who) if iTypeWpn == 2 then this.OnDeath_Firebated(e.victim, e.who) elseif bWpnBloody and iTypeWpn > 0 then this.OnDeath_PP(e.victim, e.who, iTypeWpn == 3) end end end end
--/------------------------------------------------------------------ --/ проверка типа оружия: 'кровавое', 'огнемет' или 'разрывное' --/------------------------------------------------------------------ function Get_Type_Weapon(oNPC) local oItem = oNPC:active_item() local iClassId = oItem and oItem:clsid() if iClassId and isWeapon(oItem,iClassId) then local sSection = oItem:section() if tWeaponExplosive[sSection] then -- log("%s:Get_Type_Weapon:Wpn=[%s],cid=[%s]~explosive:[%s]", sModule, sSection, iClassId, "i" ) --/#~# return 3 --/> 'разрывное' elseif tWeaponFlame[sSection] then -- log("%s:Get_Type_Weapon:Wpn=[%s],cid=[%s]~flame:[%s]", sModule, sSection, iClassId, "i" ) --/#~# return 2 --/> 'огнемет' elseif tBloodyClsids[iClassId] then -- log("%s:Get_Type_Weapon:Wpn=[%s],cid=[%s]~blood:[%s]", sModule, sSection, iClassId, "i" ) --/#~# return 1 --/> 'кровавое' else for k,v in pairs(tWeaponBloody) do if sSection:match(k) then return 1 --/> 'кровавое' end end end end return 0 --/> end
--/------------------------------------------------------------------ --/ "кровавые" эффекты (для некоторых типов оружия), victim=killed | who=killer --/------------------------------------------------------------------ function OnDeath_PP(oVictim, oWho, bExplosive) -- log("%s:OnDeath_PP:Victim=[%s],Who=[%s],VprAmmo=[%s],VprCrp=[%s],flg=[%s]:[%s]", sModule, oVictim:name(), oWho:name(), db.bVprAmmo, bVprCrp, bExplosive, "i" ) --/#~# local bHuman = IsHuman(oVictim) local sParticles = "hit_fx\\hit_flesh_headshot" --/hit_big_particles local sSound = nil local sBone = "bip01_spine" if bExplosive and db.bVprAmmo and oWho:id() == idActor then --/ оружие и патрон 'разрывные' sParticles = "amk\\zomb_explode" sSound = "anomaly\\anomaly_body_tear_1" --/body_tearing_sound if bHuman and math.random() < 0.5 then sParticles = "anomaly2\\body_tear_0"..(math.random(1,2)-1) end this.Get_BlowHit(db.actor,oVictim) --/ даем хит от взрыва if bVprCrp and oVictim:story_id() == 4294967296 and not get_object_story_id(oVictim:id()) then --/ разрешено 'испарять' трупы if IsStalker(oVictim) then if not IsQuestNPC(oVictim) then --/ не квестовый НПС local tRecipes = GetVar("amk_body_recipe",{}) if not tRecipes[oVictim:id()] then --/ в трупе нет рецепта this.Add_Disappearing(oVictim) --/ добавляем в таблицу "испаряемых" трупов end end else --/ монстров удаляем без доп.условий this.Add_Disappearing(oVictim) --/ добавляем в таблицу "испаряемых" трупов end end end if db.m_particles then local tParticles = { particle = sParticles, sound = sSound, --bone = sBone, pos = oVictim:bone_position(sBone) } m_particles.add_object(oVictim,tParticles) else --/ from particle_flame.script if bHuman then local aParticlesParams = particle_params(vector():set(0,0,0.3), vector():set(0,0,0), vector():set(1,0,0)) action(oVictim, particle(sParticles, sBone, aParticlesParams, false), cond(cond.time_end,3000)) else local vPosObj = oVictim:position() local vPos = vector():set(vPosObj.x, vPosObj.y+0.5, vPosObj.z) local oParticles = particles_object(sParticles) oParticles:play_at_pos(vPos) end if sSound then local oSnd = xr_sound.get_safe_sound_object(sSound) if oSnd and not Snd:playing() then oSnd:play_no_feedback(oVictim, sound_object.s2d, 0, oVictim:position(), (bHuman and 2.0) or 1.0) end end end end --/------------------------------------------------------------------ --/ Хит из огнемета --/------------------------------------------------------------------ function OnHit_Firebated(oNPC, oWho) local oWeapon = oWho and oWho:active_item() if oWeapon and tWeaponFlame[oWeapon:section()] then if db.m_particles then local tParticles = { particle = "amk\\flame", bone = "bip01_spine" --stop_on_death = true } m_particles.add_object(oNPC, tParticles) end if oNPC.health < 0.15 and string.match(oNPC:section(),'zomb') then oNPC:kill(oNPC) end end end
function OnDeath_Firebated(oVictim, oWho) -- log("%s:OnDeath_ZombyBlow:Victim=[%s],Who=[%s]:[%s]", sModule, oVictim and oVictim:name(), oWho and oWho:name()), ">") --/#~# --/ даем партиклы 'дыма' if db.m_particles then local tParticles = { particle = "explosions\\explosion_fuelcan", sound = "weapons\\t_rgd5_explosion", pos = oVictim:bone_position("bip01_spine") } m_particles.add_object(oVictim, tParticles) end this.Add_Disappearing(oVictim) --/ труп 'исчезающий' --/ если актор рядом - дадим хит local oActor = db.actor if oActor:see(oVictim) then local iDist = distance_between(oActor,oVictim) if iDist < 10 then local h = hit() h.draftsman = oVictim h.direction = vector():sub(oActor:position(),oVictim:position()):normalize() --/vector():set(0,0,0) h:bone("bip01_spine") --/ чтобы учитывалась броня h.power = 1/iDist h.impulse = 25/iDist h.type = hit.explosion oActor:hit(h) h.power = 8/iDist h.type = hit.chemical_burn oActor:hit(h) end end end
function OnDeath_ZombyBlow(oVictim, oWho) if oVictim:section() == "zombie_blow" then -- log("%s:OnDeath_ZombyBlow:Victim=[%s],Who=[%s]:[%s]", sModule, oVictim and oVictim:name(), oWho and oWho:name(), ">") --/#~# --/ даем партиклы 'взрыва' if db.m_particles then local tParticles = { particle = "amk\\zomb_explode", sound = "anomaly\\anomaly_body_tear_1", pos = oVictim:bone_position("bip01_spine") } m_particles.add_object(oVictim, tParticles) end this.Add_Disappearing(oVictim) --/ труп 'исчезающий' --/ хит от 'взрыва' трупа this.Get_BlowHit(oWho,oVictim) --/ если убил не ГГ, но он рядом - дадим и ему хит if oWho:id() ~= idActor then this.Get_BlowHit(db.actor,oVictim) end end end
function Get_BlowHit(oVictim,oWho) local iDist = distance_between(oVictim,oWho) if iDist < 10 then local h = hit() h.draftsman = oWho h.direction = vector():sub(oVictim:position(),oWho:position()):normalize() --/vector():set(0,0,0) h:bone("bip01_spine") --/ чтобы учитывалась броня h.power = 1/iDist h.impulse = 25/iDist h.type = hit.explosion oVictim:hit(h) h.power = 10/iDist h.type = hit.chemical_burn oVictim:hit(h) -- log("%s:Get_BlowHit:Victim=[%s],Who=[%s],Dist=[%s]:[%s]", sModule, oVictim:name(), oWho:name(), ShortStr(iDist), "i") --/#~# end end
--/------------------------------------------------------------------------------------------------ --/ Удаление "испаряемых/исчезающих" трупов/оружия (режимы: vaporize & vanish) --/------------------------------------------------------------------------------------------------ --/ добавляем труп (id, время смерти) в id-массив "исчезающих" трупов function Add_Disappearing(oVictim) if not oVictim then return end --/> oVictim:kill(oVictim) local tStor = db.storage[oVictim:id()] if tStor then tStor.vanish = {timeout = 0.2} if IsStalker(oVictim) then --/ сталкер? tStor.vanish.timeout = 0.75 --/ delta-time for stalkers tStor.vanish.removed = true --/ флаг удаления тела if bVprWpn then --/ если разрешено 'испарение' оружия - добавляем испаряемое оружие local oActiveItem = oVictim:active_item() --/ активный предмет if oActiveItem then if isWpn(oActiveItem) and alife():object(oActiveItem:id()) then -- log("%s:Add_Disappearing:victim=[%s]~>wpn=[%s]:[%s]", sModule, oVictim:name(), oActiveItem:name(), "!") --/#~# tStor.vanish.wid = oActiveItem:id() soWpn.parent_id = 65535 --/ делаем оружие бесхозным end oVictim:drop_item(oActiveItem) --/#?# end end end --/ запуск таймера [time(sec),func,params] timer_xs():start(tStor.vanish.timeout,Remove_Vanish_Corpse,{id=oVictim:id(),cnt=0}) -- log("%s:Add_Disappearing:Obj=[%s/%s]:[%s]", sModule, oVictim:name(), oVictim:id(), oVictim:clsid(), "+") --/#~# end end
function Remove_Vanish_Corpse(t) local idCorpse,iCnt = t.id,t.cnt --/ Id трупа и счетчик попыток local tStor = idCorpse and db.storage[idCorpse] if tStor and tStor.vanish then if not iCnt or iCnt > 3 then --/ превышен предел числа попыток удалений tStor.vanish = nil printf("Remove_Vanish_Corpse:Clear:Cnt=[%s],Id=[%s]:<%s>", iCnt, idCorpse, "Warning!") --/#~# else local oCorpse = level.object_by_id(idCorpse) --/ game_object if oCorpse then local soCorpse = alife():object(idCorpse) --/ server_object -- printf("Remove_Vanish_Corpse:corpse=[%s]~>check_remove:[%s]", oCorpse and oCorpse:name(), ">") --/#~# if soCorpse then local tV = tStor.vanish --/ проверка разрешения ударения трупа сталкера if tV.removed ~= nil then if tV.removed == true then --/ проверка наличия в трупе рецепта local tRecipes = GetVar("amk_body_recipe",{}) if tRecipes[idCorpse] then --/ в трупе рецепт tV.removed = false --/<!> ставим флаг НЕудаления if db.is_dbg1 then log("%s:Remove_Vanish_Corpse:=[%s]<~recipe:<%s>", sModule, oCorpse:name(), "!") end --/#~# else --/ проверка наличия в трупе НЕудаляемых (квестовых) предметов oCorpse:iterate_inventory( function (dummy, oItem) if tKeepItems[oItem:section()] or IsSobjObj(oItem) then --/ предмет в списке НЕудаляемых или сюжетный tV.removed = false --/<!> ставим флаг НЕудаления if db.is_dbg1 and IsSobjObj(oItem) then log("%s:Remove_Vanish_Corpse:=[%s]<~Quest_Item=[%s/%s]:<%s>", sModule, oCorpse:name(), oItem:section(), oItem:story_id(), "!") end --/#~# return --/> end end ,oCorpse) end end if not tV.removed then tStor.vanish = nil return true --/> end end -- log("%s:Remove_Vanish_Corpse:=[%s],id=[%s]:[%s]", oCorpse:name(), sModule, idCorpse, ">>") --/#~# this.Get_Skeleton(oCorpse) --/ спавн скелета if bVprWpn and tV.wid then --/ есть оружие --/ запуск таймера удаления оружия [time(sec),func,params] timer_xs():start(0.1,Remove_Vanish_Weapon,{id=tV.wid, cnt=0}) log("%s:Remove_Vanish_Corpse:=[%s],Id=[%s],vpr_w=[%s],wid=[%s]:[%s]", sModule, oCorpse:name(), idCorpse, bVprWpn, tV.wid, "XoX") --/#~# end log("%s:Remove_Vanish_Corpse:=[%s/%s]:[%s]", sModule, soCorpse:name(), idCorpse, "X!X") --/#~# SwitchToOffLine(idCorpse) --/#!# переводим online->offline --Del_MapSpot(idCorpse, "deadbody_mini_spot") --/ #?# level.remove_calls_for_object(oCorpse) --/#?#oCorpse|soCorpse|idCorpse db.del_obj(oCorpse) soCorpse:visible_for_map(false) --/ скрываем метку alife():release(soCorpse, true) else --/ нет/не тот объект обработки - повтор (перезапуск таймера) t:reset(0.25,{id=idCorpse,cnt=iCnt+1}) log("%s:Remove_Vanish_Corpse:ReStart:Id=[%s],Not_Sobj=[%s/%s]:<%s>", sModule, idCorpse, oCorpse and oCorpse:name(), soCorpse and soCorpse:name(), "Warning!") --/#~# end end end end end
function Remove_Vanish_Weapon(t) local idItem,iCnt = t.id, t.cnt --/ Id и счетчик попыток удаления предмета/оружия -- log("%s:Remove_Vanish_Weapon:Id=[%s],Cnt=[%s]:[%s]", sModule, idItem, iCnt, ">") --/#~# if idItem and iCnt and iCnt < 3 then local oItem = level.object_by_id(idItem) --/ game_object local soItem = alife():object(idItem) if oItem and soItem then if not oItem:parent() and soItem.parent_id == 65535 then --/ ствол бесхозный -- log("%s:Remove_Vanish_Weapon:id=[%s],name=[%s],p_id=[%s],cnt=[%s]:[%s]", sModule, idItem, soItem:name(), soItem.parent_id, iCnt, "XwX" ) --/#~# alife():release(soItem, true) --/ удаляем ствол из игры else log("%s:Remove_Vanish_Weapon:ReStart:Cnt=[%s],Wpn=[%s],Id=[%s],Pid=[%s]:[%s]", sModule, iCnt, soItem:name(), idItem, soItem.parent_id, "<+" ) --/#~# soItem.parent_id = 65535 --/ делаем оружие бесхозным --/ перезапуск таймера удаления оружия t:reset(0.2,{id=idItem,cnt=iCnt+1}) end end end end
function Get_Skeleton(oNPC) if oNPC then local soSkelet = Spawn_Obj("breakable_object", oNPC:bone_position("bip01_spine"), oNPC:level_vertex_id(), oNPC:game_vertex_id()) local pk = get_netpk(soSkelet,1) --/ запрос нет-пакета ('state') if pk:isOk() then --/ получен доступ к нет-пакету объекта? local data = pk:get() --/ читаем данные из нет-пакета --/TODO: доработать!!! local bHuman = IsHuman(oNPC) or string.match(oNPC:section(),'zomb') local sVisual = "crash_monster" if db.iSSVer >= 8 then --/ for STCS/SCOP if bHuman then --/ сталкер sVisual = "crash" end data.visual_name = "dynamics\\dead_body\\skelet_"..sVisual else --/ for SHOC if bHuman then --/ сталкер local tSkeletons = { "combine_pose_03", "combine_pose_04", "combine_pose_05", "torso" } sVisual = tSkeletons[math.random(#tSkeletons)] end data.visual_name = "physics\\dead_body\\skelet_"..sVisual end pk:set(data) --/< запись в нет-пакет level.client_spawn_manager():add(soSkelet.id, 65535, Callback_For_Skeleton, "skelet") end end end
function Callback_For_Skeleton(uo,idObj,oObj) --/ 'опускаем' скелет на землю небольшим хитом (on_the_ground) if oObj then -- log("%s:Callback_For_Skeleton:=[%s/%s]<~hit_on_the_ground:[%s]", sModule, oObj:name(), idObj, ">") --/#~# local h = hit() h.draftsman = oObj h.direction = vector():set(0,-1,0) h.power = 0.001 h.impulse = 1 h.type = hit.strike oObj:hit(h) end end
Теперь, как из этого ВСЕГО, если этого достаточно, собрать реально работающие разрывные патроны для чистой игры (чтобы можно было легко адаптировать к модам)? HELP!
ЦитатаВова_Рус ()
бинокль
В LA не играл (играю в OGSE 0.6.9.3), но возможно там есть в продаже улучшенный бинокль? Если нет, надо будет глядеть конфиги/скрипты других модов с работающей, нужной тебе функцией.
Сообщение отредактировал uzznick - Суббота, 28.02.2015, 14:58