karonbaron 1 Опубликовано 10 Июня 2012 Ребята, такой вопрос: кто-нибудь создавал новые укрытия от выбросов? Я тут наковырял кое-что. Значит, в распакованном all.spawn создается спейс-рестриктор с именем zat_surge_hide_b42 (это из имеющихся). Вот его [227] ; cse_abstract properties section_name = space_restrictor name = zat_surge_hide_b42 position = 26.2803802490234,5.27456712722778,367.865234375 direction = -0.0748270004987717,0.522725999355316,0.00596300000324845 ; cse_alife_object properties game_vertex_id = 0 distance = 0 level_vertex_id = 293223 object_flags = 0xffffff3e ; cse_shape properties shapes = shape0 shape0:type = box shape0:axis_x = 15.4629888534546,0,0 shape0:axis_y = 0,6.51879787445068,0 shape0:axis_z = 0,0,15.4629888534546 shape0:offset = 0,0,0 ; cse_alife_space_restrictor properties restrictor_type = 3 Далее, регистрируем это укрытие в файле configs\misc\surge_manager.ltx. И все, будет работать? Или где-то еще что-то нужно прописать?.. Есть мысли по этому вопросу? Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 13 Июня 2012 (изменено) karonbaron, об этом уже много раз писалось и статья на вики есть. Нужно зарегить смарт в simulation_objects_props. ltx с параметром surge = 1 и создать работы (way points типа смарт_surge_1_walk (look)), чтобы нпс юзали укрытие. Да? Что-то я там нормальной статьи не нашел, где-бы пошагово все доходчиво объяснялось. Если нетрудно, скинь, пожалуйста, ссылку на эту статью в личку мне. Спасибо. Изменено 13 Июня 2012 пользователем karonbaron Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 30 Июня 2012 (изменено) Ребята, подскажите, как сделать ремкомплект для ЗП? Нашел в инете Создание ремонт комплекта Я опишу пример создания ремонт комплекта для костюмов, а для оружия в конце статьи сделаю пару заметок. Дело в том, что различия в создании ремонт комплектов почти нет. 1. Для начала нам нужно создать сам ремонт комплект, то есть предмет, а уже потом вешать на него функцию при использование. Для этого в config\misc\items.ltx в конец добавляем конфиг нашего предмета: [repair_kit_outfit]:identity_immunities GroupControlSection = spawn_group discovery_dependency = $spawn = "food and drugs\repair kit outfit" $prefetch = 32 class = II_ANTIR ;класс не трогаем! cform = skeleton visual = equipments\item_merger.ogf ;модель description = enc_equipment_repair_kit_outfit ;ссылка на описание в config\text\rus\....xml inv_name = repair_kit_outfit_name ;ссылка на название в config\text\rus\....xml inv_name_short = repair_kit_outfit_name ;тоже самое, что и inv_name inv_weight = 6.0 ;вес inv_grid_width = 2 ;ширина иконки inv_grid_height = 1 ;высота иконки inv_grid_x = 8 ;координата x иконки inv_grid_y = 18 ;координата y иконки cost = 10000 ;цена ;всё ниже написанное не трогаем, оно нам и не нужно eat_health = 0 eat_satiety = 0 eat_power = 0 eat_radiation = 0 wounds_heal_perc = 0 eat_portions_num = 1 animation_slot = 4 hud = wpn_vodka_hud 2. Теперь добавим название и описание. Для этого в файле config\text\rus\string_table_enc_equipment.xml в конец между </string> и </string_table> добавляем строки по аналогии с уже написсанными: <string id="repair_kit_outfit_name"> <text>Ремонт комплект ДПК</text> </string> <string id="enc_equipment_repair_kit_outfit"> <text>Новинка от Вани Болта - ремонт комплект ДПК для быстрой и эффективной починки костюмов. При его создании были учтены все недочёты и, следовательно, удалены. Благодаря улучшенным инструментам и деталям, а также облегченному весу весьма ценен. С его помощью можно увеличить состояние костюма до 100%, если он повреждён не больше 30%. Незаменимая вещь во время вылазки.</text> </string> Отлично, с предметом закончили. Теперь приступим к самому главному - скриптам. Работа со скриптами 1.Вешаем функцию починки при использовании нашего ремонт комплекта. Для этого в файле scripts\bind_stalker.script находим функцию: function actor_binder:reinit() и после строки self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) пишем: self.object:set_callback(callback.use_object, self.repair_outfit_start, self) Теперь в папке scripts создаёте свой скриптовой фаил ваше_название_скрипта.script. Но! Название должно быть написано на английском языке и вместо пробелов должен стоять знак "_". Опять открываем bind_stalker.script и в самый конец добавляем эту функцию: function actor_binder:repair_outfit_start(obj, who) if obj then if obj:section() == "repair_kit_outfit" then --здесь указываем предмет, при использование которого будет срабатывать функция ниже ваше_название_скрипта.repair_outfit() --здесь указываем ссылку на функцию. Сначала скрипт, в котором она написана, потом название самой функции end end end 2. Добавляем саму функцию ремонта. Для этого в файле ваше_название_скрипта.script пишем: -- Ремонт комплект для костюмов function repair_outfit() local item_s6 = db.actor:item_in_slot(6) --объявляем переменную (item_s6) if item_s6 ~= nil and item_s6:condition() >=0.30 and item_s6:condition() ~=1 then --когда костюм можно чинить (состояние больше или равно 30%) item_s6:set_condition(1) local snd_obj = xr_sound.get_safe_sound_object([[interface\inv_detach_addon]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,0,255,0]Ремонт костюма завершен." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) elseif item_s6 == nil then --когда костюма нет local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: нужно одеть коcтюм." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) alife():create("repair_kit_outfit", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id()) elseif item_s6:condition() <0.30 then --когда костюм нельзя чинить (состояние меньше 30%) local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: костюм слишком сильно повреждён." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) alife():create("repair_kit_outfit", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id()) elseif item_s6:condition() ==1 then --когда костюм в отличном состояние local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: %c[255,0,255,0]костюм в отличном состояние." db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000) alife():create("repair_kit_outfit", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id()) end end Всё! Теперь заходим в игру и наслаждаемся. Небольшая заметка 1. Чтобы сделать ремонт комплект для оружия проделываем тоже самое, только переименовываем всё вместо outfit на weapon и в функцие починки ставим слот 1 или 2 (оружейные слота) вместо 6 (слот костюмов). Ещё нужно заменить переменную item_s6 например на item_s1 или item_s2. 2. Число 0.30 - минимальное состояние костюма, следовательно его можно менять на любое вам угодное. Простите за такое оформление, это моя вторая статья. В будущем, если будет больше свободного времени, постораюсь расписать все моменты подробно. Автор статьи: Бага. Но у меня ГГ съедает ремкомплект. Понимаю, что это для "Теней...", но все таки, как подправить скрипты, чтобы работало для ЗП? Изменено 30 Июня 2012 пользователем karonbaron Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 30 Июня 2012 Все равно не работает. Он его просто съедает, и все. Никакого сообщения, даже если броник поврежден. Правда, я функцию actor_binder:repair_outfit_start немного переделал: function actor_binder:repair_outfit_start(obj) if (obj) then local s_obj = alife():object(obj:id()) if(s_obj) and (s_obj:section()=="repair_kit_outfit") then rkomplekt.repair_outfit() end end end Толку нет. Скрипт не срабатывает... Поделитесь, пожалуйста, кто-нибудь рабочими кодами... Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 1 Июля 2012 И так не срабатывает тоже. И если функцию поменять, не реагирует. Я кучу вариантов испробовал уже, без толку... Ну ладно, ремкоплект рабочий я выдернул из мизери мода. У меня такой, более сложный вопрос. Как восстановить выпадение частей монстров в ЗП? А то какой смысл их убивать, только патроны тратить... Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 5 Июля 2012 Хоть уже и не важно, но подозреваю, что ты кое что пропустил: 1.Вешаем функцию починки при использовании нашего ремонт комплекта. Для этого в файле scripts\bind_stalker.script находим функцию: function actor_binder:reinit() и после строки self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) пишем: self.object:set_callback(callback.use_object, self.repair_outfit_start, self) Я первоначально все коды из той (см. выше мои посты) статьи вставлял в игру вообще без изменений. Не работало. Ну, ладно. Так что там с частями монстров? Выпадение их как в SGM моде не предлагать, меня это не устраивает. Видел в ARS-моде мутантера, когда можно через спецменю отрезать части тела, вот его бы в чистом виде. Может, есть у кого? Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 2 Августа 2012 Ребята, возникла проблема. Кто может, помогите советом! Суть дела вот в чем. Заселяю новую локу, создаю торговца (модель Борова из ЧН) с [logic] active = camper level_spot = trader trade = misc\trade\trade_mil_freedom_trader.ltx trader_flags = 0 inv_max_weight = 10000 meet = meet [camper] path_walk = mil_freedom_trader_walk path_look = mil_freedom_trader_look [meet] close_snd_hello = gar_bandit_barman_meet close_snd_bye = gar_bandit_barman_meet_bye close_snd_distance = 3 При этом звуки в нужную папку закинуты, также их зарегистрировал в файле script_sound_military.ltx с [list_script_sound_military] gar_bandit_barman_meet gar_bandit_barman_meet_bye [gar_bandit_barman_meet] type = npc path = scenario\military\gar_bandit_barman_meet_greet_ shuffle = rnd play_always = true idle = 0,0,100 [gar_bandit_barman_meet_bye] type = npc path = scenario\military\gar_bandit_barman_meet_bye_ shuffle = rnd idle = 1,1,100 Сам файл script_sound_military.ltx зарегистрировал в script_sounds.ltx. Когда подхожу к торговцу на расстояние ближе 3 метров, ловлю Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....r. - cop shoker\gamedata\scripts\sound_theme.script:256: bad argument #2 to 'random' (interval is empty) В чем проблема может быть? Я не все зарегистрировал, или логика не до конца прописана? На всякий случай, кусок кода с 256 строкой из скрипта sound_theme Кусок кода из sound_theme function npc_sound:select_next_sound(npc_id) local npc_data = self.npc[npc_id] if self.shuffle == "rnd" then if npc_data.max == 0 then return 0 end if self.played_id ~= nil then local played_id = math.random(0,npc_data.max - 1) -- 256-я строка if played_id >= self.played_id then return played_id + 1 end return played_id end return math.random(0,npc_data.max) end Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 3 Августа 2012 Ребята, у кого-нибудь есть рабочий скрипт на проверку наличия экзоскелета, чтобы взять в руки оружие (например, пулемет)? А то на wiki есть упоминание, но корявое, я не понял, как правильно его привести в рабочее состояние. Нельзя взять оружие без брони Пишем функцию в любом скрипе: function ваше_название_функции() local armor = db.actor:item_in_slot(6) --слот брони (НЕ ТРОГАТЬ!) local weapon = db.actor:item_in_slot(2) --слот оружия (для пистолетов в оригинале слот 1) if db.actor:active_slot()==2 and weapon then -- за место 2 пишем слот оружия еще раз local tmp if armor then tmp = armor:section() else tmp = "none" end if (not string.find(tmp, "пишем_название_брони" )) and (weapon:section()=="пишем_название_оружия1" or weapon:section()=="пишем_название_оружия2" or weapon:section()=="пишем_название_оружия3") then --если необходима проверка одного оружия то надо писать так: if (not string.find(tmp, "exo" )) and weapon:section()=="wpn_pkm" then db.actor:drop_item(weapon) local tmpw = amk.spawn_item_in_inv(weapon:section()) db.actor:transfer_item(weapon,db.actor) alife():release(tmpw) news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000) end end Далее идем по этому пути gamedata/script/bind_stalker.script Функция function actor_binder:update(delta) Сразу ниже неё пиши вызов в формате : название_файла.название_функции. Можешь написать эту функцию в любом файле из папки scripts, а можешь создать свой файл и назвать скажем my_script и написать там. Должно быть так : Код function actor_binder:update(delta) my_script.check_armor() Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 6 Сентября 2012 Ребята, кто-нибудь знает, как через скрипт (не через логику!!!) добавить репутацию у группировки? Я вот один набросал, но он не пашет, пишет, что неверные параметры у функции. function increase_hunter_goodwill_to_actor(first_speaker, second_speaker) local actor = dialogs.who_is_actor(first_speaker, second_speaker) local community == "hunter" local delta == 2000 if actor and community and delta then game_relations.change_factions_community_num(community,actor:id(), tonumber(delta)) else abort("Wrong parameters in function 'increase_hunter_goodwill_to_actor'") end end Функция вызывается через диалог. Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 26 Сентября 2012 (изменено) Есть такая задача. Нужно заспавнить на локации БТР и чтобы она стреляла в ГГ. Взял логику из ТЧ, для БТР на ЧАЭС. То есть: active = ph_car [ph_car] path_walk = mil_btr_walk target = actor Модельку взял ту, что есть в ресурсах Зова Припяти, ltx'шный файл для этой модели из мода автокоп. Также зарегил схему ph_car в modules.script, скинул скрипты ph_car.script и car.script из тч в папку со скриптами. В результате вылет FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...l.k.e.r. - cop shoker\gamedata\scripts\ph_car.script:87: attempt to index field 'car' (a nil value) stack trace: Что может быть причиной? 87-строка в скрипте ph_car выглядит так (выделена жирным): if self.usable == nil then [b]self.car:SetExplodeTime(0) -- (-1)[/b] if self.car:HasWeapon() then printf("car <fire>: car has weapon.") self.car:Action(CCar.eWpnActivate,1) self.hasWeapon = true else printf("car <fire>: car hasn't weapon.") self.hasWeapon = false end Кто-нибудь адаптировал скрипты car и ph_car под ЗП? Поделитесь опытом, пожалуйста... Изменено 26 Сентября 2012 пользователем karonbaron Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 27 Сентября 2012 (изменено) С БТР'ом разобрался, оказывается еще нужно было класс CCar зарегистрировать. Вопрос следующий. В логике вертолета можно прописать параметр enemy. На вики говорится, что enemy может быть равно actor, sid непися, или nil. В логике ЧН'овского верталя я видел еще параметр all. А если нужно, чтобы вертолет атаковал не какого-то одного противника, а например, группировку. То есть прилетает поддержка во время атаки на базу бандитов и вертушка атакует только врагов, а друзей и ГГ не трогает, даже если они в поле зрения вертолета. Есть у кого какие идеи? Может, так? enemy = {=check_enemy_name(sim_default_bandit)} all, nil Изменено 27 Сентября 2012 пользователем karonbaron Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 27 Сентября 2012 и реализовывались... Например? Есть в природе правленные моддерами скрипты heli_move? Назовите адрес, пожалуйста... Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 27 Сентября 2012 да и сам можешь на вертушке по группировкам поупражняться из ракетницы, и т.д. За советы спасибо, тему AI вертолетов я знаю, просто предпочитаю для моддинга ЗП смотреть и искать в темах ЗП. А что означает эта цитата? На вертушке в смысле управлять ей? :ny_blink: Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 3 Декабря 2012 Кто-нибудь, подскажите, пожалуйста. Если в ЗП в секции level_changer в логике я поставлю [spawner] cond = {+info_1_test} Он заработает только тогда, когда я получу инфопорцию info_1_test? Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 5 Декабря 2012 (изменено) Зато добавили методы для включения и выключения level changers. А конкретнее? Задача такая - переход должен заработать после получения определенной инфопорции. До этого ломиться бесполезно, никуда не кидает... Изменено 5 Декабря 2012 пользователем karonbaron Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 25 Марта 2013 (изменено) При заселении локации столкнулся с такой проблемой. Есть база группировки, открытая (не такая, как Скадовск или Янов). Если ГГ начинает с ней (базой) войну, то нужно, чтобы прилетел вертолет и высадил (условно) сквад поддержки. В ЧН скриптах есть хорошая функция для логики is_smart_in_combat. В ЗП я ее не нашел. Вот ее function is_smart_in_combat (actor, npc, p) if p == nil then abort("Wrong parameter!!!") endlocal sim_board = sim_board.get_sim_board()for k,v in pairs (p) dolocal smart = sim_board:get_smart_by_name(v)local squads = sim_board.smarts[smart.id].squadsfor kk,vv in pairs (squads) dolocal squad_stage = smart.combat_manager:get_squad_stage(vv)if squad_stage == "combat" or squad_stage == "defence" thenreturn trueendendendreturn falseend Я бы хотел с дополнениями вызывать эту функцию для смарта базы из логики спейс-рестриктора. Проблема в том, что для ее регистрации нужно вносить правки в множество файлов. Саму функцию в xr_conditions, а вспомогательные элементы (например, главный get_squad_stage зарегистрирован в sim_combat, которого в ЗП тоже нет) в другие, _g.script и т.п.. Попробовать можно все это прописать, но я боюсь, что будут конфликты с другими функциями и классами. Посоветуйте, пожалуйста, что делать? Изменено 25 Марта 2013 пользователем karonbaron Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 26 Марта 2013 Старлей, благодарю, что откликнулся. Не стал я связываться со скриптами, тем более что в этом случае они сильно переплетаются. Проблему решил по-другому: завел счетчик на смерть неписей, прописал его в работе, т.е. если гасим определенное количество, прилетает вертоль и высаживает десант. Вроде как база несет потери, нужна подмога... Сработало. Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 16 Июля 2013 Большая просьба ответить на вопрос: в чем разница между функцией hit_by_actor и hitted_by(actor) ? Поделиться этим сообщением Ссылка на сообщение
karonbaron 1 Опубликовано 17 Июля 2013 (изменено) Сталкер Лом, я это понимаю, во втором случае можно даже через двоеточие несколько sid прописать. Но для чего ее (hit_by_actor) вынесли в отдельную функцию? Вряд ли имелись какие-то практические цели. Просто для удобства, дабы не проверять таблицу, а сразу сравнивать id того, кто нанёс хит и id актора. Одним словом - оптимизация. ColR_iT Изменено 17 Июля 2013 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение