Перейти к содержанию

Рекомендуемые сообщения

 
 
Только что, Mass сказал:

Что функция is_day возвращает?

Возвращает на анимацию просто сиденья на стуле, а при схеме walker - анимация сна на стуле
(Возможно не так понял вопроса)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Drive ну у вас возможно в логике проверка на is_day где идет проверка

return db.actor ~= nil and level.get_time_hours() >= 6 and level.get_time_hours() < 21

В итоге ночью  после 21 работает секция walker@night и переключение на секцию animpoint@day не работает, где идет проверка на is_three_night

Изменено пользователем Mass
  • Спасибо 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Вопрос неопределённой степени глупизны: кто-нибудь знает мод на ЗП, где реализовали сцену с атакой кровососа на отряд как с ЧН (сначала шелест вокруг, потом он прыгает на одного из них, после рычит и упрыгивает с трупом в кусты)? Хочу попробовать сделать такое, но не уверен, что в ЗП есть всё необходимое для такого, а для сравнения с ЧН мне не хватает просмотра спавна в SDK (думаю, ни для кого не секрет, что в SDK 0.7 его не посмотреть, а отдельно для ЧН ставить не хочется).

Кстати... Есть ли смысл спрашивать, находятся ли тут люди, успешно добавившие новый класс мутанта в движок? На случай, если понадобится помощь по этому вопросу...

Изменено пользователем Prostomod

Мод в разработке - X-7: Эпицентр

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Как заставить работать команду jump_to_level?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Подскажите, можно ли в ящик заспавнить вещи через логику или еще как-то через level editor? То есть не lua скриптом. Ну или хотя бы через xr_effects

Изменено пользователем Mawrak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Hunter запустить движок в отладочном режиме или вынести из движка в обычный режим. (Так сделано в Лост альфе, коке и так далее).


Дополнено 4 минуты спустя

Mawrak spawn_object_in придет на помощь. У ящика должен быть Стори айди.


Дополнено 12 минуты спустя
4 часа назад, Prostomod сказал:

но не уверен, что в ЗП есть всё необходимое для такого,

Скажу больше, в зп появились новые инструменты для работы с катсценами. А в чем трудности возникают? 

  • Лайк 1
  • Спасибо 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
4 часа назад, Prostomod сказал:

Есть ли смысл спрашивать, находятся ли тут люди, успешно добавившие новый класс мутанта в движок?

в этом нет необходимости, все новые мутанты которые добавлялись в Сталкер делались на основе старых классов, даже если класс номинально по class id был новый по сути это был фейк-класс созданный на основе старого и зарегистрирован как новый в class registrator.script, по-настоящему новом классе монстра нет необходимости ,если тебе надо добавить только модельки, анимации, к тому же тут вряд ли найдутся специалисты, который смогут написать в движке полностью новую схему для класса АИ, новые повадки и прочее.

1 час назад, Mawrak сказал:

Подскажите, можно ли в ящик заспавнить вещи через логику

если ты имеешь ввиду логику рестрикторов то выше написали, если логика самого ящика, то есть старая схема через аллспавн ящика прописать ему файл конфига логики и в него внести параметр [spawn] что заспавнить в ящик, при заходе на уровень, начале новой игры или по инфопоршню, который тоже указывается в аллспавне.

  • Спасибо 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
3 часа назад, Mawrak сказал:

можно ли в ящик заспавнить вещи через логику

По схеме =spawn_object_in(предмет:story_id ящика)

  • Спасибо 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Всем доброго времени суток. Просу сразу не посылать если не по теме. Нужна помощь (не за спасибо), в адаптации нескольких модов в один-ничего глобального, немного геймплейных изменений, платформа ЗП. Может кто откликнется или даст координаты того кто может помочь. Сам в виду отсутствия времени не могу изучать модострой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

User22091995 можете попробовать тут оставить заявку, возможно, кто-то откликнется - https://ap-pro.ru/forums/topic/95-☏-doska-obayavleniy-nuzhny-modmeykery/

Изменено пользователем Mawrak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Благодарю!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

По окончанию катсцены должен удаляться нпс, делал несколько раз подобную логику - работало, но конкретно в этом случае после катсцены нпс не ремувается. В чем может быть причина?
 

Спойлер

[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)%

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
35 минут назад, vasyan54636 сказал:

В чем может быть причина?

НПС не обладает ID. А вообще, удаляй сквад, разницы ведь нет?
%=remove_squad(b1_watching_actor_squad)%

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Не думаю, что кто-то сможет помочь, но вдруг... Сразу скажу - работаю с 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. Предвидя вопрос "Зачем?": ради эксперимента (и дополнительного опыта работы с движком) решил попробовать сделать класс нового моба на основе существующих, включая боевую логику. Не факт, что у меня получится реализовать, но попробовать стоит. Если же получится - выйдет отличный моб для одной сцены в моём моде.

Изменено пользователем Prostomod

Мод в разработке - X-7: Эпицентр

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
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 как в примере.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
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<>())
	];
}

 

 

Изменено пользователем Prostomod
Добавил инфу по движковым классам
  • Хабар 1

Мод в разработке - X-7: Эпицентр

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Prostomod мне кажется тебе надо начать с того, что найти где в движке назначается - какая схема АИ используется в том или ином классе, именно эти значения, возможно меняя классы ты пропустил/не указал это, как вариант с чего начать копать)

  • Спасибо 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

A

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Подскажите как называется оружейный пак из  COC от стасона 6.03

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Здравствйте, можете привести пример что писать в скобках, чтоб использовать функцию "destroy_object()"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

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: Эпицентр

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
17 минут назад, Drive сказал:

Здравствйте, можете привести пример что писать в скобках, чтоб использовать функцию "destroy_object()"

destroy_object(actor, npc, {"story", "ОБЪЕКТ"})

  • Спасибо 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Prostomod 

\xrServerEntities\clsid_game.h
\xrServerEntities\object_factory_register.cpp
\xrServerEntities\xrServer_Objects_ALife_Monsters.cpp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Здравствуйте, может кто то сталкивался с подобным: неестественный блеск в оконных проёмах на дальних дистанциях. Стеклянные предметы и сетка рабица с синюшным оттенком. Как это лечится или хотя бы где искать причину?

Спойлер

4.jpg.0945173f14eea4d6d44e4114c41c000d.jpg3.jpg.42be92c494751aaaa8fee9996087ae70.jpg2.jpg.7b6880ba450e9c3959038bd882fa6f20.jpg

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Tolich   env_mod... Его лучше вообще удалить с НАземной локи...


DCM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   1 пользователь онлайн