=VENOM= 50 Опубликовано 30 Апреля 2016 Поделиться Опубликовано 30 Апреля 2016 (изменено) Большинство неписей получают логику из гулага. Бандиты на АТП очевидно в гулаге. Я вроде бы ясно указал, что в логике бандитов-NPC на АТП в оригинальной ТЧ нет секции on_death. Логика - это всё, что есть у NPC в кастом + всё, что прописано в гулаге смарттеррейна, если, конечно, NPC под гулагом - по-моему, это очевидно. Я и не думал, что нужно именно сохранить идентификатор убийцы, а всего лишь получить его - прямо сейчас, онлайн. Разумеется, для первого случая придётся воспользоваться pstor. Что же касается Неужели ради этого кому-то милее лезть в богомерзкие нетпакеты? Соглашусь. Изменено 30 Апреля 2016 пользователем =VENOM= Ссылка на комментарий
Max_Raf 35 Опубликовано 8 Мая 2016 Поделиться Опубликовано 8 Мая 2016 Столкнулся с проблемой. Стоит версия X-ray Extensions 232. Есть 2 одинаковых ствола. На одном установлен прицел. Я пытаюсь с помощью функций изменения значений в памяти объектов (get_wpn_int , set_wpn_int) установить на втором стволе прицел. А именно: копирую значения по смещению 936 ( флаги установленных аддонов) и по смещению 1008 ( зум фактор ). Вроде бы всё нормально: прицел стоит на стволе, но как будто не используется - нету текстуры прицела, а так же не срабатывает смещение худа как в режиме прицеливания . К примеру с подствольником таких проблем не возникло. Вообщем, как активировать на втором стволе нормальное функционирование прицела? Чего не хватает? ... А наше дело маленькое - с ружьём да по болотам. (с) Ссылка на комментарий
vampirnik77 121 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 (изменено) Решил поработать над скриптами. Вот есть такая дефолтная функция. function load_sound() local snd_ini = ini_file("misc\\script_sound.ltx") --' Итерируемся по списку тем. if not snd_ini:section_exist("list") then abort("There is no section [list] in script_sound.ltx") end local n = snd_ini:line_count("list") local id, value = "","" local category = "" --' начальная установка theme = {} for i=0,n-1 do result, section, value = snd_ini:r_line("list",i,"","") local type = utils.cfg_get_string(snd_ini, section, "type", db.actor, true, "") --' Определяем тип звука. if type == "npc" then theme[section] = npc_sound(snd_ini, section) elseif type == "actor" then theme[section] = actor_sound(snd_ini, section) elseif type == "3d" then theme[section] = object_sound(snd_ini, section) elseif type == "looped" then theme[section] = looped_sound(snd_ini, section) end end end Не целесообразней ли будет, хранить таблицу theme,а не собирать ее каждый раз? Изменено 9 Мая 2016 пользователем vampirnik77 Официальная страница проекта Neof-One Crew Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 (изменено) В параллельной теме обсуждалось только что. Целесообразнее. Но следует еще доработать. А потом провести ревизию собственно звуков. Как минимум - local snd_ini = ini_file("misc\\script_sound.ltx") вынести из функции. Изменено 9 Мая 2016 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
vampirnik77 121 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 (изменено) Да, вот только сохранить у меня пока не получилось. se_stor вызванный из start_game_callback напрочь отказывается сохранять что либо. Изменено 9 Мая 2016 пользователем vampirnik77 Официальная страница проекта Neof-One Crew Ссылка на комментарий
Romann 619 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 (изменено) Доброго времени суток, есть такой код: function give_money(victim,who) --\Добавление с 6.08.10 --\Получение денег за убийства зомби if who:id() == db.actor:id() then --для актора if victim and (victim:section() == "zombie_trup2" or victim:section() == "zombie_trup" or victim:section() == "zombie_weak" or victim:section() == "zombie_hell13" or victim:section() == "zombie_babka_weak" or victim:section() == "electro_zombie" or victim:section() == "elekt_zomb1") then local n = math.random(5,40) dialogs.relocate_money(db.actor,n,"in") elseif victim and (victim:section() == "zombie_normal" or victim:section() == "zombie_hell14" or victim:section() == "zombie_hell12" or victim:section() == "zombie_hell10" or victim:section() == "zombie_hell1" or victim:section() == "zombie_babka_normal" or victim:section() == "zombie" or victim:section() == "elekt_zomb2" or victim:section() == "elekt_zomb3" or victim:section() == "elekt_zomb4") then local n = math.random(20,70) dialogs.relocate_money(db.actor,n,"in") elseif victim and (victim:section() == "zombie_ghost" or victim:section() == "zombie_blow" or victim:section() == "zombie_beee" or victim:section() == "zombie_hell15" or victim:section() == "zombie_babka_normal" or victim:section() == "zombie_immortal" or victim:section() == "zombie_hell9" or victim:section() == "zombie_hell8" or victim:section() == "zombie_hell7" or victim:section() == "zombie_hell6" or victim:section() == "zombie_hell5" or victim:section() == "zombie_hell4" or victim:section() == "elekt_zomb5" or victim:section() == "elekt_zomb6" or victim:section() == "elekt_zomb5" or victim:section() == "controller_babka") then local n = math.random(60,110) dialogs.relocate_money(db.actor,n,"in") elseif victim and (victim:section() == "zombie_plague_komar" or victim:section() == "zombie_plague" or victim:section() == "zombie_babka_strong" or victim:section() == "zombie_strong" or victim:section() == "ghoul" or victim:section() == "vodjanoj" or victim:section() == "controller_flame" or victim:section() == "elekt_zomb8" or victim:section() == "electro_zombie_0" or victim:section() == "electro_zombie_1" or victim:section() == "electro_zombie_2" or victim:section() == "electro_zombie_3") then local n = math.random(120,500) dialogs.relocate_money(db.actor,n,"in") end end if who:id() ~= db.actor:id() and not IsMonster(who) then --\для непися if victim and (victim:section() == "zombie_trup2" or victim:section() == "zombie_trup" or victim:section() == "zombie_weak" or victim:section() == "zombie_hell13" or victim:section() == "zombie_babka_weak" or victim:section() == "electro_zombie" or victim:section() == "elekt_zomb1") then local n = math.random(5,40) who:give_money(n) game_stats.money_quest_update(n) news_manager.send_tip(db.actor,who:name().." получил "..n.." рублей", nil, nil, 2000) elseif victim and (victim:section() == "zombie_normal" or victim:section() == "zombie_hell14" or victim:section() == "zombie_hell12" or victim:section() == "zombie_hell10" or victim:section() == "zombie_hell1" or victim:section() == "zombie_babka_normal" or victim:section() == "zombie" or victim:section() == "carlic_weak" or victim:section() == "vypolzen_red" or victim:section() == "elekt_zomb2" or victim:section() == "elekt_zomb3" or victim:section() == "elekt_zomb4") then local n = math.random(20,70) who:give_money(n) game_stats.money_quest_update(n) -- news_manager.send_tip(db.actor,who:name().." получил "..n.." рублей", nil, nil, 2000) elseif victim and (victim:section() == "zombie_ghost" or victim:section() == "zombie_blow" or victim:section() == "zombie_beee" or victim:section() == "zombie_hell15" or victim:section() == "zombie_babka_normal" or victim:section() == "zombie_immortal" or victim:section() == "zombie_hell9" or victim:section() == "zombie_hell8" or victim:section() == "zombie_hell7" or victim:section() == "zombie_hell6" or victim:section() == "zombie_hell5" or victim:section() == "zombie_hell4" or victim:section() == "elekt_zomb5" or victim:section() == "elekt_zomb6" or victim:section() == "elekt_zomb5" or victim:section() == "controller_babka") then local n = math.random(60,110) who:give_money(n) game_stats.money_quest_update(n) -- news_manager.send_tip(db.actor,who:name().." получил "..n.." рублей", nil, nil, 2000) elseif victim and (victim:section() == "zombie_plague_komar" or victim:section() == "zombie_plague" or victim:section() == "zombie_babka_strong" or victim:section() == "zombie_strong" or victim:section() == "ghoul" or victim:section() == "vodjanoj" or victim:section() == "controller_flame" or victim:section() == "wolf" or victim:section() == "elekt_zomb8" or victim:section() == "electro_zombie_0" or victim:section() == "electro_zombie_1" or victim:section() == "electro_zombie_2" or victim:section() == "electro_zombie_3") then local n = math.random(120,500) who:give_money(n) game_stats.money_quest_update(n) -- news_manager.send_tip(db.actor,who:name().." получил "..n.." рублей", nil, nil, 2000) end end end Т.е. при убийстве зомби выдаются деньги, как для актора, так и для непися, но при выдаче неписю приходит сообщение, и показывает не игровое имя нпс, а название его секции - как можно исправить? Я пытался убрать под спойлер, но не получилось - код делился пополам и без спойлера. Спасибо. Изменено 9 Мая 2016 пользователем Romann Добавлено HellRatz, 9 Мая 2016 Не плохо бы такие полотна под спойлер прятать. Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz). Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб). Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
naxac 2 445 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 @Romann, код, конечно, страшный)) Для начала надо бы кэшировать секцию перед проверкой, чтобы столько раз ее не получать. И еще, лучше составить таблицу, где секция = количество денег, чтобы столько раз не перебирать elseif...or...then, а брать значения оттуда. И чтобы было имя из характера, надо делать character_name(). 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Serge! 127 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 (изменено) как можно исправить? Я бы переписал так: function give_money(victim,who) local mon5_40,mon20_70,mon60_110,mon120_500 = math.random(5,40),math.random(20,70),math.random(60,110),math.random(120,500) local tbl_zom = { "zombie_trup2" = mon5_40, "zombie_trup" = mon5_40, "zombie_weak" = mon5_40, "zombie_hell13" = mon5_40, "zombie_babka_weak" = mon5_40, "electro_zombie" = mon5_40, "elekt_zomb1" = mon5_40, "zombie_normal" = mon20_70, "zombie_hell14" = mon20_70, "zombie_hell12" = mon20_70, "zombie_hell10" = mon20_70, "zombie_hell1" = mon20_70, "zombie_babka_normal" = mon20_70, "zombie" = mon20_70, "elekt_zomb2" = mon20_70, "elekt_zomb3" = mon20_70, "elekt_zomb4" = mon20_70, "zombie_ghost" = mon60_110, "zombie_blow" = mon60_110, "zombie_beee" = mon60_110, "zombie_hell15" = mon60_110, -- "zombie_babka_normal" = mon60_110, "zombie_immortal" = mon60_110, "zombie_hell9" = mon60_110, "zombie_hell8" = mon60_110, "zombie_hell7" = mon60_110, "zombie_hell6" = mon60_110, "zombie_hell5" = mon60_110, "zombie_hell4" = mon60_110, "elekt_zomb5" = mon60_110, "elekt_zomb6" = mon60_110, "controller_babka" = mon60_110, "zombie_plague_komar" = mon120_500, "zombie_plague" = mon120_500, "zombie_babka_strong" = mon120_500, "zombie_strong" = mon120_500, "ghoul" = mon120_500, "vodjanoj" = mon120_500, "controller_flame" = mon120_500, "elekt_zomb8" = mon120_500, "electro_zombie_0" = mon120_500, "electro_zombie_1" = mon120_500, "electro_zombie_2" = mon120_500, "electro_zombie_3" = mon120_500, } local zom_sec = victim:section() if victim and tbl_zom[zom_sec] then if who:id() == db.actor:id() then dialogs.relocate_money(db.actor,tbl_zom[zom_sec],"in") elseif not IsMonster(who) then who:give_money(tbl_zom[zom_sec]) game_stats.money_quest_update(tbl_zom[zom_sec]) news_manager.send_tip(db.actor,who:character_name().." получил "..tostrng(tbl_zom[zom_sec]).." рублей", nil, nil, 2000) end end end Изменено 9 Мая 2016 пользователем Serge! 1 Ссылка на комментарий
Romann 619 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 Я бы переписал так: Вылетает по вызову этой функции: Expression : fatal errorFunction : CScriptEngine::lua_errorFile : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cppLine : 73Description : Arguments : LUA error: ...ow of chernobyl\gamedata\scripts\bind_monster.script:611: attempt to index global 'sk_zombie_life' (a nil value) Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz). Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб). Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
Serge! 127 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 (изменено) Вылетает Возможно надо попробовать переписать фрагмент кода local zom_sec = victim:section() if victim and tbl_zom[zom_sec] then if who:id() == db.actor:id() then dialogs.relocate_money(db.actor,tbl_zom[zom_sec],"in") elseif not IsMonster(who) then who:give_money(tbl_zom[zom_sec]) game_stats.money_quest_update(tbl_zom[zom_sec]) news_manager.send_tip(db.actor,who:character_name().." получил "..tostrng(tbl_zom[zom_sec]).." рублей", nil, nil, 2000) end end вот так if victim then local zom_sec = victim:section() if tbl_zom[zom_sec] then if who:id() == db.actor:id() then dialogs.relocate_money(db.actor,tbl_zom[zom_sec],"in") elseif not IsMonster(who) then who:give_money(tbl_zom[zom_sec]) game_stats.money_quest_update(tbl_zom[zom_sec]) news_manager.send_tip(db.actor,who:character_name().." получил "..tostrng(tbl_zom[zom_sec]).." рублей", nil, nil, 2000) end end end а вообще лучше бы знать куда Вы это хотите вставить. Я ориентируюсь на оригинал ТЧ. В нём bind_monster.script содержит всего 187 строк, а у Вас ошибка в 611 строке. Очень большая модификация! Хотя проблема может быть и другая, например в глобальной функции IsMonster? Я глубоко не лез, а только чуть пригладил явную непристойность. Изменено 9 Мая 2016 пользователем Serge! Ссылка на комментарий
Romann 619 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 Вылетает по вызову этой функции: Возможно надо попробовать переписать фрагмент кода В общем максимум, до работоспособности, получилось сделать так: function give_money(victim,who) local nov_zomb = { "zombie_trup2", "zombie_trup", "zombie_weak", "zombie_hell13", "zombie_babka_weak", "burer_weak", "fracture_weak", "oboroten", "electro_zombie", "elekt_zomb1" } local exp_zomb = { "zombie_normal", "zombie_hell14", "zombie_hell12", "zombie_hell10", "zombie_hell1", "zombie_babka_normal", "zombie", "burer_normal", "vypolzen_red", "elekt_zomb2", "elekt_zomb3", "elekt_zomb4" } local vet_zomb = { "zombie_ghost", "zombie_blow", "zombie_beee", "zombie_hell15", "zombie_babka_normal", "zombie_immortal", "zombie_hell9", "zombie_hell8", "zombie_hell7", "zombie_hell6", "zombie_hell5", "zombie_hell4", "dog_zombie", "dog_skeleton", "controller_babka", "elekt_zomb5", "elekt_zomb6", "elekt_zomb7" } local mast_zomb = { "zombie_plague_komar", "zombie_plague", "zombie_babka_strong", "zombie_strong", "ghoul", "vodjanoj", "snork_jumper", "spider", "molerat", "deathclaw_weak", "controller_flame", "elekt_zomb8", "electro_zombie_0", "electro_zombie_1", "electro_zombie_2", "electro_zombie_3" } if who:id() == db.actor:id() then --для актора if victim and victim:section(nov_zomb) then local n = math.random(5,40) dialogs.relocate_money(db.actor,n,"in") elseif victim and victim:section(exp_zomb) then local n = math.random(20,70) dialogs.relocate_money(db.actor,n,"in") elseif victim and victim:section(vet_zomb) then local n = math.random(60,110) dialogs.relocate_money(db.actor,n,"in") elseif victim and victim:section(mast_zomb) then local n = math.random(120,500) dialogs.relocate_money(db.actor,n,"in") end end if who:id() ~= db.actor:id() and not IsMonster(who) then --\для непися if victim and victim:section(nov_zomb) then local n = math.random(5,40) who:give_money(n) game_stats.money_quest_update(n) news_manager.send_tip(db.actor,who:character_name().." получил "..n.." рублей", nil, nil, 2000) elseif victim and victim:section(exp_zomb) then local n = math.random(20,70) who:give_money(n) game_stats.money_quest_update(n) news_manager.send_tip(db.actor,who:character_name().." получил "..n.." рублей", nil, nil, 2000) elseif victim and victim:section(vet_zomb) then local n = math.random(60,110) who:give_money(n) game_stats.money_quest_update(n) news_manager.send_tip(db.actor,who:character_name().." получил "..n.." рублей", 0, 15, nil, nil, 2000) elseif victim and victim:section(mast_zomb) then local n = math.random(120,500) who:give_money(n) game_stats.money_quest_update(n) news_manager.send_tip(db.actor,who:character_name().." получил "..n.." рублей", 0, 15, nil, nil, 2000) end end end а вообще лучше бы знать куда Вы это хотите вставить. Я ориентируюсь на оригинал ТЧ. В нём bind_monster.script содержит всего 187 строк, а у Вас ошибка в 611 строке. Очень большая модификация! ОП-2 это ). П.С.: Подскажите как поменять цвет текста, выводимых сообщений? Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz). Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб). Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
Serge! 127 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 В общем максимум, до работоспособности, получилось сделать так: Нет комментариев. Подскажите как поменять цвет текста, выводимых сообщений? Не знаю, но думаю что никак, т.к. это функция движка. Ссылка на комментарий
TIGER_VLAD 361 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 (изменено) Подскажите как поменять цвет текста, выводимых сообщений? news_manager.send_tip(db.actor, "%c[255,255,128,128]Текст 1:\n%c[default]Текст 2", nil, nil, 1000) где: %c[255,255,128,128] - это цвет сообщения. %c[default]- это конец кода цвета сообщения, дальше текст идёт в стандартном цвете. \n - перенос строки. Изменено 9 Мая 2016 пользователем TIGER_VLAD 1 1 Ссылка на комментарий
Serge! 127 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 (изменено) @TIGER_VLAD, Спасибо! (модераторам, про кнопочку спасибо я знаю), век живи - век учись. Изменено 9 Мая 2016 пользователем Serge! 1 Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 9 Мая 2016 Поделиться Опубликовано 9 Мая 2016 Привет ребята! Сам в Lua мало понимаю, так что спрошу тут) Требуется сделать небольшую вещь - нужно выполнять произвольный код 3 раза за игровые сутки. Без условий. И да, 3 раза рандомно за 24 часа, т.е в какой час - только math.random. Я максимум что смогу время игровое получить, но как потом проверку в игре делать, в bind_stalker.update() записать - не всегда прокатывает... В общем жду от вас помощи Не соответствует правилам. Ссылка на комментарий
Zander_driver 10 333 Опубликовано 10 Мая 2016 Поделиться Опубликовано 10 Мая 2016 @vampirnik77, а зачем, простите, сохранять в se_stor? неужели недостаточно собрать таблицу один раз при запуске игры / нетспавне актора и просто в памяти ее хранить. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
vampirnik77 121 Опубликовано 10 Мая 2016 Поделиться Опубликовано 10 Мая 2016 (изменено) @Zander_driver, Я еще плохо разбираюсь, но разве при загрузке сохранок память не очищается? Изменено 10 Мая 2016 пользователем vampirnik77 Официальная страница проекта Neof-One Crew Ссылка на комментарий
Romann 619 Опубликовано 10 Мая 2016 Поделиться Опубликовано 10 Мая 2016 Всем привет, подскажите пожалуйста скрипт для пропуска квестовых нпс. Ну к примеру есть определённая схема, и нужно чтоб она не применялась к квестовикам (ну вот как уборщик не убирает трупы квестовиков), есть таблица квест. нпс: local quest_nps = { ..., ..., ... } Подскажите код, чтобы схема пропускала эту таблицу, и не срабатывала на кв. нпс.. Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz). Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб). Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
=VENOM= 50 Опубликовано 11 Мая 2016 Поделиться Опубликовано 11 Мая 2016 @Romann, могу только предположить, что в таблице квестовых NPC будут указаны их имена. Тогда, если нам требуется обработка всех сталкеров (серверных объектов, на всех локациях): local quest_npc = {} for a=1,65535 do local obj = alife():object(a) if obj then if IsStalker(obj) then if not quest_npc[obj:name()] then -- обработчик сталкера - серверного объекта end end end end Если же требуется обработка именно сталкеров-NPC (они доступны только на текущей локации), тогда: local quest_npc = {} for a=1,65535 do local obj=level.object_by_id(a) if obj then if IsStalker(obj) then if not quest_npc[obj:name()] then -- обработчик сталкера - NPC end end end end 1 Ссылка на комментарий
aromatizer 4 429 Опубликовано 11 Мая 2016 Поделиться Опубликовано 11 Мая 2016 (изменено) Помогите с похожей проблемой: добавил авторазряжалку в ТТ2 и она весьма не кстати разряжает гравипушку(wpn_gravigun) на классе WP_SVD и огнемет(wpn_flame) на классе WP_LR300. Как понял, скрипт работает именно с классами оружия, а не по названию. Поправте, пожалуста, код, чтобы он не разряжал гравипушку и огнемет. Авторазряжалка: -- 08.04.2016 -- KroshkaRoo aka Romz-- TS MOD для SoC вообще и ОГСЕ в частности.--TS MOD для COP-- накопировано и накнопано Tonny S. (aka Tonny на AMK-форуме)--часть функций или их частей выковыряна из AMK, скриптов SAK и др.--[[--для использования авторазряжалки следует:- в скрипте bind_stalker.script:- function actor_binder:net_spawn(data)в конец добавитьts_mod_soc.ts_on_net_spawn() --TS_MOD--- function actor_binder:take_item_from_box(box, item)в конец добавитьts_mod_soc.ts_on_item_take(item) --TS_MOD--- function actor_binder:on_item_take (obj)в конец добавитьts_mod_soc.ts_on_item_take(item) --TS_MOD--- function actor_binder:on_item_drop (obj)ts_mod_soc.ts_on_item_drop(obj) --TS_MOD--- в скрипте _g.script- function start_game_callback()в конец добавитьts_mod_soc.ts_init_module() --TS_MOD----]]--local notest_time = 0local weapon_classes_w_ammo = {}--список аммо для каждой секции. по сути кэшlocal weapon_ammo = {}--лог в текстовый файлfunction ts_log(src,msg)local g_time = game.get_game_time()local t = game.CTime()t:set(2012,5,1,0,0,1,1)local t_diff = g_time:diffSec(t)local f=io.open("ts_log.txt","a")--local c_time = time_global()f:write(string.format("(%s) = %s => %s " ,t_diff,src,msg),"\n" )f:close()--[[--if get_console() thenlocal msg_no_ws = string.gsub("=="..src.."==>"..msg, "%s", "_")get_console():execute(msg_no_ws)end--]]--endfunction ts_init_module()weapon_classes_w_ammo = {[clsid.wpn_ak74] = true,[clsid.wpn_ak74_s] = true,[clsid.wpn_bm16] = true,[clsid.wpn_bm16_s] = true,[clsid.wpn_fn2000] = true,[clsid.wpn_fort] = true,[clsid.wpn_grenade_launcher] = true,[clsid.wpn_groza] = true,[clsid.wpn_groza_s] = true,[clsid.wpn_hpsa] = true,[clsid.wpn_hpsa_s] = true,[clsid.wpn_lr300] = true,[clsid.wpn_lr300_s] = true,[clsid.wpn_pm] = true,[clsid.wpn_pm_s] = true,[clsid.wpn_rg6] = true,[clsid.wpn_rg6_s] = true,[clsid.wpn_rpg7] = true,[clsid.wpn_rpg7_s] = true,[clsid.wpn_shotgun] = true,[clsid.wpn_shotgun_s] = true,[clsid.wpn_stat_mgun] = true,[clsid.wpn_svd] = true,[clsid.wpn_svd_s] = true,[clsid.wpn_svu] = true,[clsid.wpn_svu_s] = true,[clsid.wpn_usp45] = true,[clsid.wpn_usp45_s] = true,[clsid.wpn_val] = true,[clsid.wpn_val_s] = true,[clsid.wpn_vintorez] = true,[clsid.wpn_vintorez_s] = true,[clsid.wpn_binocular] = false,[clsid.wpn_binocular_s] = false,[clsid.wpn_grenade_f1] = false,[clsid.wpn_grenade_fake] = false,[clsid.wpn_grenade_rgd5] = false,[clsid.wpn_grenade_rpg7] = false,[clsid.wpn_knife] = false,[clsid.wpn_knife_s] = false,[clsid.wpn_mounted] = false}--for k,v in pairs(weapon_classes_w_ammo) doendfunction is_weapon_w_ammo(object)local id = get_clsid(object)if id then-- if weapon_classes_w_ammo[id] then ts_log("is_weapon_w_ammo\t\t", "ID "..tostring(id).. " object "..object:name()) endreturn weapon_classes_w_ammo[id] == trueelse-- ts_log("is_weapon_w_ammo\t\t","ERR.is_weapon_w_ammo:id=nil")return falseendendfunction ts_get_weapon_ammo_type(sobj)local stpk=net_packet()cse_alife_item_weapon.STATE_Write( sobj, stpk )local size=stpk:w_tell()stpk:r_seek(size-1)return stpk:r_u8()end-- упрощённый вызов новостиfunction ts_tip(news_caption, msg, showtime, timeout)local news_text = "#системная ошибка. перезагрузите ваш PDA"local texture = "ui\\ui_iconsTotal"if msg thennews_text = msgendif timeout == nil then timeout = 0 endif showtime == nil then showtime = 5 endif timeout == 0 thenlocal player = xr_sound.get_safe_sound_object([[device\pda\pda_tip]])-- ' Играем дефолтный звукplayer:play(db.actor, timeout, sound_object.s2d)endlocal ts_news = news_caption.."\\n"..news_textdb.actor:give_game_news(ts_news, texture, Frect():set( 0, 658, 83, 47), timeout*1000, showtime*1000)end--взято с OGSMfunction spawn_ammo_in_inv(section,number,npc)if npc==nil thennpc=db.actorend-- ts_log("spawn_ammo_in_inv","sect ["..tostring(section).."] npc ["..npc:name().."]" .."\n".."position [ x = "..tostring(npc:position().x)..", y = "..tostring(npc:position().y)..", z = "..tostring(npc:position().z).."]".."\n".." level_vertex_id ["..tostring(npc:level_vertex_id()).."]" .."\n".." game_vertex_id ["..tostring(npc:game_vertex_id()).."]" .."\n".." npc ID ["..tostring(npc:id()).."]" .."\n".." number ["..tostring(number).."]")if number > 0 thenreturn se_respawn.create_ammo(section,npc:position(),npc:level_vertex_id(),npc:game_vertex_id(),npc:id(),number)endendfunction ts_ammo_discharge(wpn)local name = wpn:name()local ammo_count = wpn:get_ammo_in_magazine()if ammo_count>0 thenlocal ammo_type = ts_get_weapon_ammo_type( alife():object(wpn:id()))-- ts_log("ts_ammo_discharge\t\t", name.." ammo_count = "..ammo_count.." ammo_type = "..ammo_type)local section_ammo = ts_ammo_by_num(wpn:section(),ammo_type)if section_ammo~=nil and string.find(section_ammo,"ammo") thenlocal str1 = string.format(" Боеприпас %s (%d шт.)",game.translate_string(string.gsub(section_ammo,"_","-").."_s"), ammo_count)-- ts_log("ts_ammo_discharge\t\t",str1)ts_tip("Патроны",str1)spawn_ammo_in_inv(section_ammo, ammo_count, nil)wpn:unload_magazine()elseif section_ammo == nil thensection_ammo = ""endts_log("ts_ammo_discharge\t\t", "Object = "..name.." Ammo section fail: "..section_ammo)endendendfunction parse_names_mod( s )local t = {}--отсечка коментарияlocal pos = string.find(s,";")local ps = ""if pos ~= nil and pos > 0 thenps = string.sub(s,1, pos - 1)elseps = sendfor name in string.gfind( ps, "([%w_.\\-]+)%p*" ) dotable.insert( t, name )endreturn tend--найти аммо по номеруfunction ts_ammo_by_num(section, num)local ammo_listif weapon_ammo[section] ~= nil and weapon_ammo[section] ~= "" thenammo_list = weapon_ammo[section]-- ts_log("ts_ammo_by_num",section.." => Found: "..ammo_list)elselocal ltx = system_ini()ammo_list = ltx:r_string(section,"ammo_class")weapon_ammo[section] = ammo_list-- ts_log("ts_ammo_by_num",section.." => Loaded: "..ammo_list)end-- for n,v in pairs(parse_names(ammo_list)) do ts_log("ts_ammo_by_num","....."..n.." -> "..v) endlocal t=parse_names_mod(ammo_list)local cnt = table.getn(t)if cnt == 0 thenreturn nilelseif num >= cnt thenreturn t[1]elsereturn t[num+1]endendfunction test_discharge_weapon(ItemObj)if ItemObj == nil thenreturn falseend-- ts_log("test_discharge_weapon\t",ItemObj:name())if notest_time == 0 thennotest_time = game.time()+6000elseif notest_time>game.time() thenreturn falseelseif is_weapon_w_ammo(ItemObj) thenlocal ItemId = ItemObj:id()local PistolSlot = db.actor:item_in_slot(1)if PistolSlot then-- ts_log("test_discharge_weapon\t", "item "..PistolSlot:name().." in slot 1")IdPistol = PistolSlot:id()endlocal AutomaticSlot = db.actor:item_in_slot(2)if AutomaticSlot then-- ts_log("test_discharge_weapon\t", "item "..AutomaticSlot:name().." in slot 2")IdAutomat = AutomaticSlot:id()endif ItemId ~= IdPistol and ItemId ~= IdAutomat thents_ammo_discharge(ItemObj)else-- ts_log("test_discharge_weapon\t", "item "..ItemObj:name().." in slot")endendendfunction ts_on_net_spawn()-- ts_log("ts_on_net_spawn","..")notest_time = 0endfunction ts_on_item_take(obj)if notest_time>game.time() thenreturn falseend-- ts_log("ts_on_item_take\t\t","...")if obj ~= nil then-- ts_log("ts_on_item_take\t\t", obj:name())test_discharge_weapon(obj)endendfunction ts_on_item_drop(obj)if not db.actor:has_info("ui_inventory") thenreturn falseendif notest_time>game.time() thenreturn falseend-- ts_log("ts_on_item_drop\t\t","...")if obj ~= nil then-- ts_log("ts_on_item_drop\t\t", obj:name())test_discharge_weapon(obj)endend Попытки перевести гравипушку и огнемет на классы из исключений в таблице не увенчались успехом. Может быть, возможно перевести скрипт на работу именно с названием оружия. Так сказать, пожертвовать универсальностью в пользу исключения неприятных моментов( в моде ТТ2 огнемет зарядить может только Шуруп). Изменено 11 Мая 2016 пользователем aromatizer Отношения между людьми- главная ценность в человеческом обществе.Любая полученная информация- это только повод для размышлений, а не побуждение к действию.Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAEНакопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти