function search_weapon_complete1(actor, npc) if db.actor ~= nil then if db.actor:object("ПРЕДМЕТ") then db.actor:give_info_portion("ПОРШЕНЬ") return true end end return false end
------------------------------------------------------------------------------ "Проверка на взятие нескольких разных предметов и выдача инфопоршня"
Код
Код:
local t_wpn = {"ПРЕДМЕТ1", "ПРЕДМЕТ1", "ПРЕДМЕТ1"} function search_ALL_weapons_complete() local gg = db.actor if gg then for i=1,#t_wpn do if not gg:object(t_wpn[i]) then return false end end gg:give_info_portion("ПОРШЕНЬ") return true end return false end
------------------------------------------------------------------------------ "Проверка на взятие N-колличества одного и того же предмета(например 10 аптечек)"
Основная функция: Код
Код:
function Actor_Has_ListItems(sSection,iNum) if not iNum then iNum = 1 end local oActor = db.actor local iCnt = 0 if oActor and sSection then oActor:iterate_inventory( function (dummy, oItem) if oItem:section() == sSection then iCnt = iCnt + 1 if iCnt >= iNum then return true --/> актор имеет N предметов end end end ,nil) end return iCnt >= iNum --/> имеет ли актор N предметов end
Вызов: Код
Код:
function search_2_bumazhki_sidr_complete() return this.Actor_Has_ListItems("medkit", 10) end
------------------------------------------------------------------------------ "Проверка на взятие предмета(обычная)"
Код
Код:
function search_weapon_complete(actor, npc) if db.actor ~= nil then return db.actor:object("wpn_vintorez")~=nil end return false end
------------------------------------------------------------------------------ "Проверка на наличие предмета у эктора"
Код
Код:
function have_docs_from_x14(first_speaker, second_speaker) return first_speaker:object("ПРЕДМЕТ") ~= nil end
function give_nagrada_x14 (trader, actor) dialogs.relocate_item_section(trader, "ПРЕДМЕТ", "in") end
------------------------------------------------------------------------------ "Прверка на наличие многих предметов"
Код
Код:
function have_n_m1() return ИМЯ_СКРИПТА.have_n_m("bread",2,"kolbasa",2,"conserva") end
function have_n_m(section,number) local actor = db.actor if actor then local cnt = 0 actor:iterate_inventory( function (dummy, item) if item:section() == section then cnt = cnt + 1 end end ,nil) return cnt >= number end return false end
------------------------------------------------------------------------------ "Вызов .РРЕ эфекта через диалог(Типа Удар в морду)"
Код
Код:
function punch() -- set_inactivate_input_time(30) local snd_obj = xr_sound.get_safe_sound_object([[affects\hit_fist]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) level.add_cam_effector("camera_effects\fusker.anm", 999, false, "") end
function malo_hp() db.actor.health = -0.3 --Минус 30% дезек end
------------------------------------------------------------------------------ "Удаление предмета из инвентаря(например аптечки)"
Код
Код:
function Delete_ak74u_from_Actor() local oItem = db.actor:object("medkit") --/ определяем предмет у ГГ if oItem then --/ у ГГ есть предмет db.actor:drop_item(oItem) --/ выбрасываем предмет (опционально) alife():release(alife():object(oItem:id()), true) --/ удаляем из игры end end
function dell() for a = 1,65534 do local se_obj = alife():object(a) if se_obj and se_obj:section_name() == "СЕКЦИЯ ПРЕДМЕТА" then alife():release(se_obj, true) end end end
------------------------------------------------------------------------------ "Удаление нескольких одинаковых предметов(например удалим 7 аптечек)"
Код
Код:
function Delete_2_bumazhki_sidora_from_Actor() local cnt = db.actor:object_count() local ch=0 for i=0, cnt-1 do local item = db.actor:object(i) if item:section() == "medkit" then local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) ch = ch+1 if ch == 7 then --7 - кол-во удаляемых аптечек break end end end end end
------------------------------------------------------------------------------ "Функция телепортации(Использовать для телепорта на другую локацию нельзя)"
Код
Код:
function teleportate_to_() local a = vector() a.x = -241.71509460448 a.y = -26.742816052856 a.z = -304.54711914063 db.actor:set_actor_position(a) end
------------------------------------------------------------------------------ "Функция рамдомного удаления предметов из инвентаря ГГ"
Код
Код:
function ReleaseRandomItem(num) local actor = db.actor local cnt = actor:object_count() if cnt<num then return end for i=1,num do local item = actor:object(math.random(0, cnt-1)) local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) cnt = actor:object_count() end end end
вызывать так: Код
Код:
ReleaseRandomItem(5) -- 5 - число удаляемых предметов
Вызов через диалог: Код
Код:
function RRI() имя_файла.ReleaseRandomItem(5) end
Пример: Код
Код:
<action>имя_файла.RRI</action>
------------------------------------------------------------------------------ "Заходим на локацию и меняем группировку"
Код
Код:
function join_monolith (actor, npc) -- ставить на дельта апдейт printf ("ACTOR NOW IN имя группировки COMMUNITY") if db.actor and level_id.имя уровня then -- пример l01_escape и т.п db.actor:set_character_community ("имя группировки", 0, 0) end end
function habar_davay(actor, npc) treasure_manager.get_treasure_manager():give_treasure("имя тайника") end
------------------------------------------------------------------------------ "Удаление всего и вся из инвентаря - и пда, и болт, и фонарик, и бинокль, и детектор"
Код
Код:
function test_index() local cnt = db.actor:object_count() for i=0, cnt-1 do local item = db.actor:object(i) local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) end end end
------------------------------------------------------------------------------ "Таймер" "Вариант без вывода на худ"
Код
Код:
local iTimer function Start_Timer_5_minutes() --/ (пере)запуск таймера (из диалога) iTimer = time_global() + 5*1000 --/ взводим таймер на 5cek end
function Timer_N_minutes() --/ вызывается из ':update' сталкер-биндера if iTimer and iTimer < time_global() then --/ проверка текущего значения iTimer = nil --/ выключаем таймер скрипт.функция() --/ выполняем действие end end
------------------------------------------------------------------------------ "Вариант с выводом на худ"
Код
Код:
local iTimer local last function start_timer_minutes_test(seconds) if last~= nil then iTimer = time_global()+last --/ взводим таймер на остаток времени last else iTimer = time_global() + 7*1000 --/ взводим таймер например 7 сек. end end
function timer_n_minutes_test() --/ вызывается из ':update' сталкер-биндера if iTimer then last=iTimer-time_global() -- присваиваем переменной остаток времени до конца работы таймера if iTimer < time_global() then iTimer = nil --/ выключаем таймер last=nil СКРИПТ.ФУНКЦИЯ--/ выполняем действие end end end
-- выводим значение таймера в обратном отсчете на худ
Код:
function hud_static() --/ вызывается из ':update' сталкер-биндера local hud = get_hud() local st if iTimer then st = hud:GetCustomStatic("hud_timer") if st==nil then hud:AddCustomStatic("hud_timer", true) st = hud:GetCustomStatic("hud_timer") end if last~=nil then local hours = math.floor(last/3600000) local minutes = math.floor(last/60000 - hours*60) local seconds = math.floor(last/1000 - hours*3600 - minutes*60) local text = string.format("%02d:%02d:%02d",hours,minutes,seconds) -- выводим время в формате 00:00:00 --local text=string.format("%.f",last/1000) st:wnd():SetTextST(text) end else if hud:GetCustomStatic("hud_timer")~=nil then hud:RemoveCustomStatic("hud_timer") end end end
------------------------------------------------------------------------------ "Расчет попадания в НПС(Выводится информации - в какую часть тела попал)"
Код
Код:
Автор:Николай ФеНиКс(ФеНиКс) Код if bone_index > 0 and who then if who:id() == db.actor:id() then --/ для актора local oActiveItem = db.actor:object("wpn_svd") if oActiveItem then --/ у актера проверяемое оружие local kuda = "" if bone_index == 14 or bone_index == 15 then kuda = "Ранен в глаз" elseif bone_index == 13 then kuda = "Ранен в голову" elseif bone_index == 16 then kuda = "Ранен в челюсть" elseif bone_index == 17 then kuda = "Ранен в шею" elseif bone_index == 9 or bone_index == 10 or bone_index == 11 or bone_index == 18 then kuda = "Ранен в грудь" elseif bone_index >= 1 and bone_index <= 8 then kuda = "Ранен в ногу" elseif bone_index >= 19 and bone_index <= 42 then kuda = "Ранен в руку" end news_manager.send_tip(db.actor, kuda, nil, nil, 2000) end end end
Вставлять функцию в мотиватор в функцию hit_callbak. Например, после этого: Код if self.st.hit then xr_logic.issue_event(self.object, self.st.hit, "hit_callback", obj, amount, local_direction, who, bone_index) end
------------------------------------------------------------------------------ "Функция для квестов(типа убить группу сталкеров, например, пятерых)"
Код
Код:
function mochim_five_nps() if has_alife_info("первый_грохнут") and has_alife_info("второй_грохнут") and has_alife_info("третий_грохнут") and has_alife_info("четвертый_грохнут") and has_alife_info("и_пятый_наконец") then return true else return false end end
Использование: В теле квеста пишем complete'ы: Код
После выполнения условий функции mochim_five_nps выдается поршень esc_kvest_secret_merc_kill_poslannick и задание обновляется.
------------------------------------------------------------------------------ "Спавн предмета или НПС с меткой в ПДА"
Код
Код:
local ObjId=0 function pda_killer_spawn() local obj= alife():create("pda_merc_killer_glav",vector():set(-223.700,-7.678,-129.688),17000,281) local text = "Текст метки" level.map_add_object_spot_ser(obj.id, "blue_location", text) --/blue_location - тип метки ObjId=obj.id end
Эту метку можно удалить так: Код
Код:
function delete_spot() for a=1,65534 do --Перебор айди local obj = alife():object(a) if obj and obj:section_name() == "pda_merc_killer_glav" then --/pda_merc_killer_glav -- Секция предмета или НПС level.map_remove_object_spot(obj.id,"blue_location") break end end end
------------------------------------------------------------------------------ "Вешаем метку в ПДА по Sid'у(Например на Волка)"
Код
Код:
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
------------------------------------------------------------------------------ "Вывод сообщения на экран"
Код
Код:
function kvest_search_2_bumazhki_sidr_complete() news_manager.send_tip(db.actor, "%c[255,255,128,128]Автор сообщения\n%c[default]Текст сообщения", 0, "wolf", 17000) end
------------------------------------------------------------------------------ "Еще способ вывода сообщения"
Код
Код:
local text = "Здесь текст" function test() news_manager.send_tip(db.actor, text, 0, "trader", 20000) end
------------------------------------------------------------------------------ "Заставляем диалог появиться самому на примере Волка(подходим к Волку и диалог появляется сам)"
Спавним рестриктор на координатах Волка с радиусом метра 2.Делаем логику рестриктору: Код
function on_talk() local npc = level_object_by_sid(006) db.actor:run_talk_dialog(npc) end
------------------------------------------------------------------------------ "Делаем некоторых НПС бессмертными"
Код
Код:
function immotral() local npc1 = level_object_by_sid(006) --волк local npc2 = level_object_by_sid(092) --проводник local npc3 = level_object_by_sid(032)-- кузнецов local npc4= level_object_by_sid(100) --Серый if npc1 then npc1.health = 1 end if npc2 then npc2.health = 1 end if npc3 then npc3.health = 1 end if npc4 then npc4.health = 1 end end
В голову дохнут.
------------------------------------------------------------------------------ "Отправляем НПС в другую группировку(например Волка)"
Код
Код:
function name() local npc = level_object_by_sid(006) npc:set_character_community("имя группировки", 0, 0) end
Если разговариваем с самим Волком, то вызываем эту функцию: Код
Код:
function name(actor, npc) npc:set_character_community("имя группировки", 0, 0) end
------------------------------------------------------------------------------ "Удалим предмет из игры (или сталкера из игры(Удалим Волка))"
Код
Код:
function dell_kluk_final() local se_obj = alife():object("esc_wolf") if se_obj then alife():release(se_obj, true) end end
------------------------------------------------------------------------------ "При вызове происходит использование антирада"
Код
Код:
function do_something() local item = db.actor:object("antirad") if antirad then db.actor:eat(item) end end function do_something() local item = db.actor:object("antirad") if antirad then db.actor:eat(item) end end
Должно быть так: Код
Код:
function do_something() local item = db.actor:object("antirad") if item then db.actor:eat(item) end end
------------------------------------------------------------------------------ "Проверка:Какой костюм одет(не одет)(например, Экзоскелет)" Надет ли костюм
Код
Код:
function check_outfit() local outfit = db.actor:item_in_slot(6) if outfit:section() == "exo_outfit" then --/Если в 6 слоте присутствует "exo_outfit" тогда return true --/"exo_outfit" одет else return false --/"exo_outfit" не одет end end
Не надет ли костюм [spoiler=]Код
Код:
function check_outfit() local outfit = db.actor:item_in_slot(6) if outfit:section() == "exo_outfit" then --/Если в 6 слоте присутствует "exo_outfit" тогда return true --/"exo_outfit" не одет else return false --/"exo_outfit" одет end end
function hit_nanesti() for a=1,65635,1 do local obj=level.object_by_id(a) if obj and string.find(obj:name(),"ПРЕДМЕТ") then local h = hit (); h.power = 10000; h.direction = vector():set (0, 0, 0); h.impulse = 0; h.draftsman = obj; h.type = hit.explosion; obj:hit (h); end end end
------------------------------------------------------------------------------ "Проверяет, находится ли, например, Волк на локации Кордон"
Код
Код:
function rest() local npc = level_object_by_sid(006) --волк if npc and level.name() == "l01_escape" then return true else return false end end
------------------------------------------------------------------------------ "Проверка:Например на Кордоне находится ГГ или нет"
Код
Код:
function go_to_marsh_complete() if level_name == "l01escape" then return true else return false end end
------------------------------------------------------------------------------ Функция запуска выброса
Схема выброса состоит из постэффектов, анимаций камеры, звуков. Для начала нужно в папке gamedata/scripts blowout.script. В файл вписать это:
Код:
function run_blowout() --/ функция, запускающая выброс level.set_weather_fx ("surge_day") --/ погода как на АЭС при выбросе level.add_cam_effector("camera_effects\\earthquake.anm", 1975, false, "") --/ анимациЯ "землетряска" local snd_obj = xr_sound.get_safe_sound_object([[anomaly\blowout]]) --/ запуск звука "Выброс" snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) --/ проигрывание звука "Выброс" set_postprocess ("scripts\\earthshake.ltx") --/ постпроцесс local h = hit() --/ повреждения h.direction = vector():set( 1, 0, 0 ) h.impulse = 1 h.draftsman = db.actor h.power = 0.1 h.type = hit.radiation db.actor:hit(h) h.power = 0.04 h.type = hit.telepatic db.actor:hit(h) h.power = 0.6 end
Дальше нужно как-то запустить выброс. Я не использовал таймер, так как у меня с ним проблемы. Запустил через диалог.
Открываем в gamedata/config/gameplay/ файл dialogs_.... . Я например поставил в dialogs_escape. Дальше нужно вписать в любой диалог строку
Эта фраза, окончательная при разговоре с Волком. Когда он выдает нам оружие происходит выброс.
Скриптовые функции by antreg
-------------------------------------------------------------------------------- Спавн НПС с присвоением ID:
Код:
function spawn_mervin2() local obj=alife():create("esc_mervin2",vector():set(9.693,56.273,48.022),5205,2417) local params=amk.read_stalker_params(obj) params.custom="[logic]\ncfg = scripts\\new\\esc_mervin2.ltx" params.sid=30137 amk.write_stalker_params(params,obj) end
--В функции прописывается не только ID, но и путь к файлу логики НПС. Sid необходимо зарегистрировать в файле: game_story_ids.ltx (путь: \gamedata\config) Sid присваивается не сразу – условие такое, что таким методом НПС следует спавнить с другой локации, т.е. предположим, что нам нужен НПС с Сидом, по которому мы будем ставить на него метки, удалять и т.д. В этом случае нужно заспавнить его, когда ГГ находится на локации, отличной от той, где должен заспавниться НПС.
-------------------------------------------------------------------------------- Удаление НПС по ID или по имени:
Код:
function del_mervin2()--удаление по ID (если спавнили НПС с присвоением ID) local sim = alife() local se_obj = sim:story_object(30137) if se_obj then sim:release(se_obj, true) end end
function delete_osoz1()--удаление по имени (если спавнили НПС без присвоения ID) for a=10,65635,1 do local obj=alife():object(a) if obj and string.find(obj:name(),"esc_osoz1") then alife():release(obj,true) end end end
-------------------------------------------------------------------------------- Функции проверки появления предмета (предметов) в инвентаре:
Код:
function first_urok_dialog_have(task, objective)--проверка одного предмета return new_dialog.item_much("svitok_1",1) ~= false end
function first_urok_dialog_have(task, objective)--проверка нескольких одинаковых предметов return new_dialog.item_much("svitok_1",5) ~= false end
function graf_first_dialog_have(task, objective)--проверка нескольких разных предметов с разным количеством return new_dialog.item_much("doc1",1) ~= false and new_dialog.item_much("wpn_aug_a3",5) ~= false end
function graf_second_dialog_have(task, objective)--альтернативный способ проверки одного предмета в инвентаре if db.actor ~= nil then return db.actor:object("wpn_g3_camo") ~= nil end return false end
-------------------------------------------------------------------------------- Функция завершения квеста, когда отдаём найденный (найденные предметы) и получаем награду:
Код:
function graf_tri_dialog_done(first_speaker, second_speaker) flamethrower.relocate_n_items_section(second_speaker, "flash_tsezar", "out", 3)--отдаём 3 флешки Цезаря dialogs.relocate_item_section(second_speaker, "af_cristall", "in")--получаем в награду от Цезаря Кристалл end
Альтернативная функция передачи предметов через new_dialog.out_item_much:
Код:
function pekar_first_dialog_done(first_speaker, second_speaker) new_dialog.out_item_much("muka",5) new_dialog.out_item_much("pekar_outfit",1) flamethrower.relocate_n_items_section(second_speaker, "bread_pekar", "in", 10) end
--Здесь отдаём Пекарю 5 мешков муки, возвращаем антигравитационный костюм и получаем в награду 10 буханок хлеба. В первом примере, когда используем relocate_n_items_section, предмет остаётся в инвентаре НПС. Во втором примере, когда используем new_dialog.out_item_much, предмет просто исчезает, в инвентаре НПС его не будет.
-------------------------------------------------------------------------------- Функция передачи ГГ предметов от какого-нибудь НПС:
Код:
function tsezar_first_dialog_dal(first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "super_outfit", "in") flamethrower.relocate_n_items_section(second_speaker, "antirad", "in", 10) end
--В этой функции видно, что для передачи 1 шт. чего-либо, используем dialogs.relocate_item_section, а для передачи нескольких однотипных предметов flamethrower.relocate_n_items_section. В принципе, можно обойтись и только последним видом: flamethrower.relocate_n_items_section, но только поставив количество после запятой 1.
-------------------------------------------------------------------------------- Функция спавна трупа с присвоением ему ID:
Код:
function spawn_trupak() local obj = alife():create("esc_trupak",vector():set(-168.462,-0.001,17.821),1737,1392) local tbl = amk.read_stalker_params(obj) tbl.sid = 30117 tbl.health = 0 tbl.updhealth = 0 amk.write_stalker_params(tbl, obj) end
--Чтобы труп не убирался уборщиком, надо в скриптовом файле: sak_off_corpses.script в функции: off_corpses (она в самом начале) прописать нашего трупа (esc_trupak) в исключения. Вот так (по аналогии с остальными): and npc_name~="esc_trupak". Кроме этого, надо всегда учитывать максимальный номер ID трупов в моде. В случае НС5+ТТ, значение (в этой же функции) выставлено так: if obj.m_story_id > 30200 then (это после списка трупов). Говорит о том, что максимально допустимый СИД трупа может быть 30200, если у трупа будет СИД = 30201, то он не попадёт в исключение и будет удаляться.
--То же самое и с оружием. Если мы хотим заспавнить скриптом ствол на земле или ещё где и не хотим, чтобы он удалился уборщиком, то в этой же функции (ниже) находим массив с перечислением стволов и добавляем туда свой ствол. Вот так: and not string.find(wpn_name,"wpn_winchester_knyaz")
-------------------------------------------------------------------------------- Функция выдачи СМС сообщения, привязанного к спавну НПС или чего угодно другого:
Код:
function spawn_killer_attak() local obj=alife():create("esc_killer_attak1",vector():set(210.178,-0.010,-26.217),51168,1265) local obj=alife():create("esc_killer_attak2",vector():set(210.178,-0.010,-26.217),51168,1265) local obj=alife():create("esc_killer_attak3",vector():set(224.825,-0.011,6.590),56564,1175) news_manager.send_tip(db.actor, "Стрелок, это Бармен. На южный блокпост Бара напали наёмники, выручай, я знаю, ты где то рядом!", nil, nil, 20000) end
--Значение 20000 — это время, которое сообщение будет «висеть» на мониторе. Зависит от количества символов. Чем больше сообщение, тем побольше стоит поставить время отображения на экране, но более 60000 ставить не стоит, слишком долго. Я для себя выбрал значение 30000, как базовое, для коротких сообщений — 20000).
-------------------------------------------------------------------------------- Выдача СМС сообщения по условию:
Чтобы выдать сообщение по условию, надо прописать вначале само условие с выдачей инфопоршня в файл: dimos.script в функцию: start_dimos. Например так:
Код:
if (или elseif, если это не первое условие, а последующее в массиве условий) level.name()=="l03_agroprom" and has_alife_info("sledopyt_first_dialog_start") and not has_alife_info("taynik_sms") then db.actor:give_info_portion("taynik_sms")
Создаём в этом же файле (dimos.script) функцию:
Код:
function sms_taynik() db.actor:give_info_portion("taynik_talk") news_manager.send_tip(db.actor, "Стрелок, иди по дороге вперёд, к северному корпусу, ищи у дороги заваленный вход в катакомбы. Как подойдёшь, я тебе проход открою.", nil, nil, 30000) end
--Далее, регистрируем 2 новых инфопоршня в файле с инфопоршнями. Прописываем в инфопоршень taynik_sms вызов функции СМС. Вот так должно всё выглядеть: <info_portion id="taynik_sms"> <action>dimos.sms_taynik</action> </info_portion> <info_portion id="taynik_talk"></info_portion>
--Всё сообщение готово. Теперь, когда получили задание от Следопыта встретиться с Инкогнито и перешли на локацию Агропром, то придёт СМС_ка.
Архив будет пополнятся, так же вы сами можете выкладывать функции.
Автор:
Арбитр [ 30 дек 2011, 11:40 ]
Заголовок сообщения:
Re: Архив скриптовых функций для ТЧ
Определяем,находится ли ГГ в нужной нам зоне
Код:
function check_npc_in_box(npc, p1,p2) local pos=npc:position() if is_point_inside_interval(pos.x,p1.x,p2.x) and is_point_inside_interval(pos.y,p1.y,p2.y) and is_point_inside_interval(pos.z,p1.z,p2.z) then return true else return false end end function is_point_inside_interval(x,p1,p2) if p1>p2 then p1,p2 = p2,p1 end if x>p1 and x<p2 then return true else return false end end
Функция удаления какого-либо эффекта
Код:
function clear() level.remove_pp_effector(1034) end
Убиваем НПС(я не помню как использовал,вроде на него должен быть наведен прицел)