Overf1rst 1 499 Опубликовано 1 июля, 2020 Тема посвящена моддингу на платформе Зов Припяти. Правила темы: Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском, ответ на него, вероятно, уже есть. Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода. Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа). Благодарность выражаем в личке или же ставим реакцию. Посты с благодарностями в теме будут удаляться. 19 9 1 1 2 6 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hunter 2 509 Опубликовано 16 июля, 2023 Как заставить работать команду jump_to_level? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mawrak 629 Опубликовано 17 июля, 2023 (изменено) Подскажите, можно ли в ящик заспавнить вещи через логику или еще как-то через level editor? То есть не lua скриптом. Ну или хотя бы через xr_effects Изменено 17 июля, 2023 пользователем Mawrak Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
AfterGlow 565 Опубликовано 17 июля, 2023 Hunter запустить движок в отладочном режиме или вынести из движка в обычный режим. (Так сделано в Лост альфе, коке и так далее). Дополнено 4 минуты спустя Mawrak spawn_object_in придет на помощь. У ящика должен быть Стори айди. Дополнено 12 минуты спустя 4 часа назад, Prostomod сказал: но не уверен, что в ЗП есть всё необходимое для такого, Скажу больше, в зп появились новые инструменты для работы с катсценами. А в чем трудности возникают? 1 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
CiberZold 853 Опубликовано 17 июля, 2023 4 часа назад, Prostomod сказал: Есть ли смысл спрашивать, находятся ли тут люди, успешно добавившие новый класс мутанта в движок? в этом нет необходимости, все новые мутанты которые добавлялись в Сталкер делались на основе старых классов, даже если класс номинально по class id был новый по сути это был фейк-класс созданный на основе старого и зарегистрирован как новый в class registrator.script, по-настоящему новом классе монстра нет необходимости ,если тебе надо добавить только модельки, анимации, к тому же тут вряд ли найдутся специалисты, который смогут написать в движке полностью новую схему для класса АИ, новые повадки и прочее. 1 час назад, Mawrak сказал: Подскажите, можно ли в ящик заспавнить вещи через логику если ты имеешь ввиду логику рестрикторов то выше написали, если логика самого ящика, то есть старая схема через аллспавн ящика прописать ему файл конфига логики и в него внести параметр [spawn] что заспавнить в ящик, при заходе на уровень, начале новой игры или по инфопоршню, который тоже указывается в аллспавне. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Boomer 465 Опубликовано 17 июля, 2023 3 часа назад, Mawrak сказал: можно ли в ящик заспавнить вещи через логику По схеме =spawn_object_in(предмет:story_id ящика) 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
User22091995 0 Опубликовано 17 июля, 2023 Всем доброго времени суток. Просу сразу не посылать если не по теме. Нужна помощь (не за спасибо), в адаптации нескольких модов в один-ничего глобального, немного геймплейных изменений, платформа ЗП. Может кто откликнется или даст координаты того кто может помочь. Сам в виду отсутствия времени не могу изучать модострой. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mawrak 629 Опубликовано 17 июля, 2023 (изменено) User22091995 можете попробовать тут оставить заявку, возможно, кто-то откликнется - https://ap-pro.ru/forums/topic/95-☏-doska-obayavleniy-nuzhny-modmeykery/ Изменено 17 июля, 2023 пользователем Mawrak Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
User22091995 0 Опубликовано 17 июля, 2023 Благодарю! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vasyan54636 128 Опубликовано 17 июля, 2023 По окончанию катсцены должен удаляться нпс, делал несколько раз подобную логику - работало, но конкретно в этом случае после катсцены нпс не ремувается. В чем может быть причина? Спойлер [logic] active = sr_idle@1 [sr_idle@1] on_info = {+a2_scient_corp_hited} sr_cutscene@cam %=create_squad(b1_watching_actor_squad:b1_scient_smart_cut_scene) =run_postprocess(fade_in:2371) =disable_ui% [sr_cutscene@cam] on_info = %=add_cs_text(a1_desc_watching)% point = a2_watching_cut_1_walk look = a2_watching_cut_1_look cam_effector = scenario_cam\tar\a2_actor_watching_scient global_cameffect = true on_signal = cameff_end | sr_idle@2 [sr_idle@2] on_info = sr_idle@nil %=stop_postprocess(2371) =enable_ui =remove_npc(b1_watching_actor)% [sr_idle@nil] on_game_timer = 50 | %=del_cs_text(a1_desc_watching)% Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Neptun 884 Опубликовано 17 июля, 2023 35 минут назад, vasyan54636 сказал: В чем может быть причина? НПС не обладает ID. А вообще, удаляй сквад, разницы ведь нет? %=remove_squad(b1_watching_actor_squad)% 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Prostomod 1 313 Опубликовано 17 июля, 2023 (изменено) Не думаю, что кто-то сможет помочь, но вдруг... Сразу скажу - работаю с Advanced X-Ray 1.9.26 со своими правками, не оригинальным движком. В идеале - хочу получить наводку "что у меня не так", а минимум - правильно ли я зарегистрировал новый класс в class_registrator и других скриптах для использования в конфигах. Пытаюсь зарегистрировать класс в class_registrator: Спойлер ... cs_register (object_factory, "CAnomalPseudoGigant", "se_monster.se_monster", "SM_GIG_A", "anom_gigant_s") ... И да, класс CAnomalPseudoGigant в движке есть, сам добавил. Мб где-то там накосячил, не спорю, но хочу хотя бы убедиться, что сделал всё ОК по части скриптов. Спойлер Класс CAnomalPseudoGigant базируется на классе псевдыча (в процессе работы пришлось вынести оригинального гига тоже в отдельный класс-наследник). Движок успешно компилируется. В самом класс в конце приписал макрос DECLARE_SCRIPT_REGISTER_FUNCTION, дополнил после класса кодом: add_to_type_list(CAnomalPseudoGigant) #undef script_type_list #define script_type_list save_type_list(CAnomalPseudoGigant) и сделал метод для регистрации Lua класса: void CAnomalPseudoGigant::script_register(lua_State *L) { module(L) [ class_<CAnomalPseudoGigant,CGameObject>("CAnomalPseudoGigant") .def(constructor<>()) ]; } Так-же, в object_factory_register.cpp добавил строку ADD(CAnomalPseudoGigant ,CSE_ALifeMonsterBase ,CLSID_AI_ANOMAL_GIANT ,"anomal_pseudo_gigant"); где CLSID_AI_ANOMAL_GIANT: #define CLSID_AI_ANOMAL_GIANT MK_CLSID('A','I','_','G','I','G','_','A') если кому-то нужен полный код движка - в ЛС. Спойлер monster_classes = { ... [clsid.anom_gigant_s] = "anom_gigant", ... } Спойлер monster_classes = { ... [clsid.anom_gigant_s] = true, ... } В конфигах пока нигде класс не применял от слова совсем, не знаю, насколько это влияет. Проблема такова, что класс вообще не регистрируется, потому что в логе встречается запись ! [LUA] Cannot register class CAnomalPseudoGigant Ну и потом вылетает с ошибкой "! [LUA] ...ommon\stalker call of pripyat\gamedata\scripts\_g.script:551: table index is nil", которая, как я понял, является следствием невозможности зарегистрировать класс. P.S. Предвидя вопрос "Зачем?": ради эксперимента (и дополнительного опыта работы с движком) решил попробовать сделать класс нового моба на основе существующих, включая боевую логику. Не факт, что у меня получится реализовать, но попробовать стоит. Если же получится - выйдет отличный моб для одной сцены в моём моде. Изменено 17 июля, 2023 пользователем Prostomod Мод в разработке - X-7: Эпицентр Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
CiberZold 853 Опубликовано 17 июля, 2023 51 минуту назад, Prostomod сказал: И да, класс CAnomalPseudoGigant в движке есть, сам добавил. Мб где-то там накосячил скорее всего) какой класс и АИ в новом монстре используется как основной? я так понимаю обычного гиганта, но я не вижу в коде наследование новому монстру от старого класса, плюс не знаю как там в Advanced X-Ray, я глянул исходники Open X-Ray, там каждый монстр имеет набор файлов в xrGame\ai\monsters и там в файле pseudogigant_script.cpp конкретно гигант зареган так класс так #include "pch_script.h" #include "pseudo_gigant.h" #include "xrScriptEngine/ScriptExporter.hpp" SCRIPT_EXPORT(CPseudoGigant, (CGameObject), { using namespace luabind; module(luaState) [ class_<CPseudoGigant, CGameObject>("CPseudoGigant") .def(constructor<>()) ]; }); ну и так далее, возможно ты ещё упустил какие-то места где новый класс надо прописывать, возможно на том движке также надо создавать отдельные файлы на новый класс и потом их подключать через ScriptExport как в примере. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Prostomod 1 313 Опубликовано 18 июля, 2023 (изменено) 1 час назад, CiberZold сказал: какой класс и АИ в новом монстре используется как основной? За основу взял CPseudoGigant, однако его пришлось модифицировать чуть-чуть и создать ещё один класс (назвал CPseudoGigant_orig) чтобы и мой псевдыч, и оригинальный были экспортированы в Lua (по идее, просто иначе вообще не компилилось). В новом я пытаюсь скомбинировать некоторые способности других мутантов, такие как щит бюрера, атаки от огненного и электрического полтера, хочу ещё добавить фичу с прыжком снорка (и да, я ничего не курил, когда это придумывал, хотя мб попробовать...?:)). Сейчас вряд-ли заработает всё это, но хочу хотя бы заспавнить его как обычного псевдыча, чтобы дальше дорабатывать. Если что, я для всех своих правок сделал публичный форк из оригинального Advanced X-Ray (по этой ссылке находится ветка с новым псевдычем), можешь там поглядеть. Свои последние изменения загрузил в ветку. Предупреждаю - рефакторинга не делал ещё. Ну и, на всякий случай, вот частично исходный код семейки гигантов. Спойлер class CPseudoGigant : public CBaseMonster, public CControlledEntity<CPseudoGigant> { typedef CBaseMonster inherited; typedef CControlledEntity<CPseudoGigant> CControlled; private: xr_vector<CObject*> m_nearest_pseudogig_kick; // step_effector struct { float time; float amplitude; float period_number; } step_effector; SAttackEffector m_threaten_effector; ref_sound m_sound_threaten_hit; // звук, который играется в голове у актера ref_sound m_sound_start_threaten; // звук, который играется в голове у актера u32 m_time_next_threaten; u32 m_threaten_delay_min; u32 m_threaten_delay_max; float m_threaten_dist_min; float m_threaten_dist_max; float m_kick_damage; u32 m_time_kick_actor_slow_down; SVelocityParam m_fsVelocityJumpPrepare; SVelocityParam m_fsVelocityJumpGround; LPCSTR m_kick_particles; public: CPseudoGigant (); virtual ~CPseudoGigant (); virtual void Load (LPCSTR section); virtual void reinit (); virtual bool ability_earthquake () {return true;} virtual void event_on_step (); virtual bool check_start_conditions (ControlCom::EControlType type); virtual void on_activate_control (ControlCom::EControlType); virtual void on_threaten_execute (); virtual void HitEntityInJump (const CEntity *pEntity); virtual void TranslateActionToPathParams (); virtual char* get_monster_class_name () { return "pseudogigant"; } //DECLARE_SCRIPT_REGISTER_FUNCTION // убрано чтобы забиндить потомков }; //add_to_type_list(CPseudoGigant) // убрано чтобы забиндить потомков //#undef script_type_list //#define script_type_list save_type_list(CPseudoGigant) Спойлер class CPseudoGigant_orig : public CPseudoGigant { virtual char* get_monster_class_name () { return "pseudogigant"; } DECLARE_SCRIPT_REGISTER_FUNCTION }; add_to_type_list(CPseudoGigant_orig) #undef script_type_list #define script_type_list save_type_list(CPseudoGigant_orig) Спойлер class CAnomalGigPolterSpecialAbility; class CAnomalPseudoGigant : public CPseudoGigant, public CTelekinesis { // { typedef CPseudoGigant inherited; bool m_actor_ignore; float m_current_detection_level; float m_detection_success_level; float m_detection_max_level; public: CAnomalPseudoGigant(); virtual ~CAnomalPseudoGigant(); virtual void Load(LPCSTR section); virtual void UpdateCL(); virtual void shedule_Update(u32 dt); virtual char* get_monster_class_name() { return "anomalpseudogigant"; } void set_actor_ignore(bool const actor_ignore) { m_actor_ignore = actor_ignore; } bool get_actor_ignore() const { return m_actor_ignore; } // snork jump virtual void jump(const Fvector& position, float factor); virtual bool ability_jump_over_physics() { return true; } // Poltergeist ability private: CAnomalGigPolterSpecialAbility* m_flame = nullptr; CAnomalGigPolterSpecialAbility* m_tele = nullptr; public: void PhysicalImpulse(const Fvector& position); void StrangeSounds(const Fvector& position); float get_current_detection_level() const { return m_current_detection_level; } float get_detection_success_level(); //IC CAnomalGigPolterSpecialAbility* ability() { return (m_flame ? m_flame : m_tele); } // remake: tele on 66% hp, flame +tele on 33% hp IC bool use_tele_ability() { return true; } IC bool use_fire_ability() { return true; } // burer shield void ActivateShield(); void DeactivateShield(); TTime m_shield_cooldown; TTime m_shield_time; bool m_shield_active; LPCSTR m_shield_keep_particle; TTime m_shield_keep_particle_period; ref_sound m_strange_sound; DECLARE_SCRIPT_REGISTER_FUNCTION }; bool actor_is_reloading_weapon(); add_to_type_list(CAnomalPseudoGigant) #undef script_type_list #define script_type_list save_type_list(CAnomalPseudoGigant) ////////////////////////////////////////////////////////////////////////// // Interface ////////////////////////////////////////////////////////////////////////// class CAnomalGigPolterSpecialAbility { CParticlesObject* m_particles_object; CParticlesObject* m_particles_object_electro; LPCSTR m_particles_hidden; LPCSTR m_particles_damage; LPCSTR m_particles_death; LPCSTR m_particles_idle; ref_sound m_sound_base; u32 m_last_hit_frame; protected: CAnomalPseudoGigant* m_object; public: CAnomalGigPolterSpecialAbility(CAnomalPseudoGigant* gigant); virtual ~CAnomalGigPolterSpecialAbility(); virtual void load(LPCSTR section); virtual void update_schedule(); virtual void update_frame(); virtual void on_hide(); virtual void on_show(); virtual void on_destroy() {} //virtual void on_die(); virtual void on_hit(SHit* pHDS); }; ////////////////////////////////////////////////////////////////////////// // Flame ////////////////////////////////////////////////////////////////////////// class CAnomalGigPolterFlame : public CAnomalGigPolterSpecialAbility { typedef CAnomalGigPolterSpecialAbility inherited; ref_sound m_sound; LPCSTR m_particles_prepare; LPCSTR m_particles_fire; LPCSTR m_particles_stop; u32 m_time_fire_delay; u32 m_time_fire_play; float m_length; float m_hit_value; u32 m_hit_delay; u32 m_count; u32 m_delay; // between 2 flames u32 m_time_flame_started; float m_min_flame_dist; float m_max_flame_dist; float m_min_flame_height; float m_max_flame_height; float m_pmt_aura_radius; // Scanner float m_scan_radius; u32 m_scan_delay_min; u32 m_scan_delay_max; SPPInfo m_scan_effector_info; float m_scan_effector_time; float m_scan_effector_time_attack; float m_scan_effector_time_release; ref_sound m_scan_sound; bool m_state_scanning; u32 m_scan_next_time; enum EFlameState { ePrepare, eFire, eStop }; public: struct SFlameElement { const CObject* target_object; Fvector position; Fvector target_dir; u32 time_started; ref_sound sound; CParticlesObject* particles_object; EFlameState state; u32 time_last_hit; }; private: DEFINE_VECTOR(SFlameElement*, FLAME_ELEMS_VEC, FLAME_ELEMS_IT); FLAME_ELEMS_VEC m_flames; public: CAnomalGigPolterFlame(CAnomalPseudoGigant* gigant); virtual ~CAnomalGigPolterFlame(); virtual void load(LPCSTR section); virtual void update_schedule(); virtual void on_destroy(); //virtual void on_die(); private: void select_state(SFlameElement* elem, EFlameState state); bool get_valid_flame_position(const CObject* target_object, Fvector& res_pos); void create_flame(const CObject* target_object); }; ////////////////////////////////////////////////////////////////////////// // TELE ////////////////////////////////////////////////////////////////////////// class CAnomalGigPolterTele : public CAnomalGigPolterSpecialAbility { typedef CAnomalGigPolterSpecialAbility inherited; xr_vector<CObject*> m_nearest; // external params float m_pmt_radius; float m_pmt_object_min_mass; float m_pmt_object_max_mass; u32 m_pmt_object_count; u32 m_pmt_time_to_hold; u32 m_pmt_time_to_wait; u32 m_pmt_time_to_wait_in_objects; u32 m_pmt_raise_time_to_wait_in_objects; float m_pmt_distance; float m_pmt_object_height; u32 m_pmt_time_object_keep; float m_pmt_raise_speed; float m_pmt_fly_velocity; float m_pmt_object_collision_damage; ref_sound m_sound_tele_hold; ref_sound m_sound_tele_throw; enum ETeleState { eStartRaiseObjects, eRaisingObjects, eFireObjects, eWait } m_state; u32 m_time; u32 m_time_next; public: CAnomalGigPolterTele(CAnomalPseudoGigant* gigant); virtual ~CAnomalGigPolterTele(); virtual void load(LPCSTR section); virtual void update_schedule(); virtual void update_frame(); private: void tele_find_objects(xr_vector<CObject*>& objects, const Fvector& pos); bool tele_raise_objects(); void tele_fire_objects(); bool trace_object(CObject* obj, const Fvector& target); }; Спойлер #include "stdafx.h" #include "pch_script.h" #include "anomal_pseudo_gigant.h" using namespace luabind; #pragma optimize("s",on) void CAnomalPseudoGigant::script_register(lua_State *L) { module(L) [ class_<CAnomalPseudoGigant,CGameObject>("CAnomalPseudoGigant") .def(constructor<>()) ]; } Спойлер #include "pch_script.h" #include "pseudo_gigant_orig.h" using namespace luabind; #pragma optimize("s",on) void CPseudoGigant_orig::script_register(lua_State *L) { module(L) [ class_<CPseudoGigant_orig,CGameObject>("CPseudoGigant") .def(constructor<>()) ]; } Изменено 18 июля, 2023 пользователем Prostomod Добавил инфу по движковым классам 1 Мод в разработке - X-7: Эпицентр Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
CiberZold 853 Опубликовано 18 июля, 2023 Prostomod мне кажется тебе надо начать с того, что найти где в движке назначается - какая схема АИ используется в том или ином классе, именно эти значения, возможно меняя классы ты пропустил/не указал это, как вариант с чего начать копать) 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
The Nakezz 24 Опубликовано 18 июля, 2023 A Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Shew_Power 2 Опубликовано 18 июля, 2023 Подскажите как называется оружейный пак из COC от стасона 6.03 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Drive 13 Опубликовано 18 июля, 2023 Здравствйте, можете привести пример что писать в скобках, чтоб использовать функцию "destroy_object()" Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Prostomod 1 313 Опубликовано 18 июля, 2023 Drive Ну, как я понял: если писать без параметров, то удалится тот объект, из логики которого вызвана функция если писать с параметрами story:pri_a28_earth_helli_1, то удалится объект по story_id Спойлер [sr_idle@cut_2_start] on_info = {=squad_exist(pri_a16_military_squad)} %=remove_squad(pri_a16_military_squad)% on_info2 = {=squad_exist(pri_a28_evac_squad)} %=remove_squad(pri_a28_evac_squad)% on_game_timer = 18 | {+pri_a28_helis_added} sr_cutscene@cut_2 %=destroy_object(story:pri_a28_earth_helli_1) =destroy_object(story:pri_a28_earth_helli_2)%, sr_cutscene@cut_2 есть ещё вариант с вызовом 3 аргументов, но его использование в логике я не увидел. Если судить по скрипту, то это что-то связанное с работами в смартах (удаление НПС по работе?). 1 Мод в разработке - X-7: Эпицентр Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Neptun 884 Опубликовано 18 июля, 2023 17 минут назад, Drive сказал: Здравствйте, можете привести пример что писать в скобках, чтоб использовать функцию "destroy_object()" destroy_object(actor, npc, {"story", "ОБЪЕКТ"}) 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Yara 117 Опубликовано 18 июля, 2023 Prostomod \xrServerEntities\clsid_game.h \xrServerEntities\object_factory_register.cpp \xrServerEntities\xrServer_Objects_ALife_Monsters.cpp https://sites.google.com/view/xray-sdk-0-4-smg Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Tolich 14 Опубликовано 18 июля, 2023 Здравствуйте, может кто то сталкивался с подобным: неестественный блеск в оконных проёмах на дальних дистанциях. Стеклянные предметы и сетка рабица с синюшным оттенком. Как это лечится или хотя бы где искать причину? Спойлер Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Policai 1 323 Опубликовано 18 июля, 2023 Tolich env_mod... Его лучше вообще удалить с НАземной локи... Группа мода в VK Мод делался и тестировался на железе i5-11400, 32Гб ОЗУ, Radeon RX580 Разрешение 2560 х 1440. ВСЕ на максималке Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Shew_Power 2 Опубликовано 18 июля, 2023 Подскажите чем отличается pm_actor и actor в SDK Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Prostomod 1 313 Опубликовано 18 июля, 2023 (изменено) Shew_Power Ну... даже не знаю... наверно тем, что второе - это сам игрок (его спавн в НИ), а первое - пистолет Макарова уникальный. Изменено 18 июля, 2023 пользователем Prostomod 1 Мод в разработке - X-7: Эпицентр Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Shew_Power 2 Опубликовано 18 июля, 2023 36 минут назад, Prostomod сказал: Shew_Power Ну... даже не знаю... наверно тем, что второе - это сам игрок (его спавн в НИ), а первое - пистолет Макарова уникальный. А почему в SDK pm_actor выглядит как модель дегтярева Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты