Перейти к контенту

Редактирование движка X-Ray


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

10 минут назад, Romann сказал:

давно пора в ТЧ заменить модели мобов на модели из ЗП, как минимум там даже анимации по лучше будут(надо только перегнать недостающие анимки ТЧ - не вижу проблемы)

А вот с этого момента можно поподробнее? Особенно про перегон анимок монстров. Если это так просто, то может расскажешь как это сделать?

Ссылка на комментарий
13 минут назад, Marafon6540 сказал:

Особенно про перегон анимок монстров.

А у монстров то зачем перегонять? Просто заменил модельку вместе с анимками и всё, если движок ТЧ без правок, т.е. не тот что упомянут выше, то чисто модельку прогнать через сдк, чтоб выставить шейдеры ТЧ, а анимки оставить как есть. Это уже в случае изменения размера - соответственно и анимки конвертить инструментами в максе от Дена Сташа.

Скрытый текст

Ох и нафлудили не по теме, ща нас от сюда попрут.:az1000106:

 

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

Мать: 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.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий
22 минуты назад, Romann сказал:

Просто заменил модельку вместе с анимками и всё,

Как оказывается все просто...

И почему я в своё время почти три месяца убил, но так и не смог химеру из ЗП на чистых "тенях" запустить?

Ссылка на комментарий
58 минут назад, Romann сказал:

Так что я не увидел ни одного весомого аргумента(ИМХО).

Основная суть в том, что разработчику своего мода придется переделывать половину всего своего мода. Накидать с ванили на ваниль - не проблема, но когда у тебя 35 лок, мощная качественная оружейка из пары сотен стволов, огромное кол-во уникальных нпс и другое, и все это сделано для ТЧ, - лучше удариться лицом об камень, чем браться за перехлабучивание всего содержимого своего мода из-за ничего.

 

Но да, замена моделей, локаций и рук - это все в плюс, но какой ценой?

Изменено пользователем Zagolski
  • Сомнительно 1
Ссылка на комментарий
1 минуту назад, Marafon6540 сказал:

почему я не смог химеру из ЗП на чистых "тенях" запустить?

Без понятия, лично я смог муравья из Фолаута, со всеми анимками от туда же без изменений, на чистом ТЧ запустить, какие же могут возникнуть проблемы при запуске мутанта из ЗП на ТЧ - это только вам знать...

 

Мать: 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.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий
7 часов назад, AndreySol сказал:

Муравьем поделишься ?

Не сейчас, надо его найти, давно было, напомни через пару дней в ЛС.

 

Мать: 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.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий

Камрады, прошу помощи, как сделать в ЗП, чтоб загрузочный экран "раскукожить" на весь экран горизонтально, без боковых фреймов? :az1000106: В хмл это не работает, следовательно надо движок править?

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

Оц тоц перевертоц, бабушка здорова,
Оц тоц перевертоц кушает компот.
Оц тоц перевертоц и мечтает снова
Оц тоц перевертоц пережить налет!

Ссылка на комментарий
В 29.12.2018 в 12:55, Demosfen сказал:

Есть тут люди которые смогут дебажить под студией и помогать найти причину вылета?

Вряд ли кто найдется. Тут со своего голова болит, а уж чужим и подавно никто заниматься не станет.

Ссылка на комментарий
Скрытый текст

 



void SBullet::Init(const Fvector& position,
				   const Fvector& direction,
				   float starting_speed,
				   float power,
				   float impulse,
				   u16	sender_id,
				   u16 sendersweapon_id,
				   ALife::EHitType e_hit_type,
				   float maximum_distance,
				   const CCartridge& cartridge,
				   bool SendHit,
				   CBulletManager* manager)
{
	flags._storage		= 0;
	pos 				= position;
	speed = max_speed	= starting_speed * cartridge.m_kSpeed;
	VERIFY				(speed>0);

	VERIFY(direction.magnitude()>0);
	dir.normalize		(direction);

	hit_power			= power		* cartridge.m_kHit;
	hit_impulse			= impulse	* cartridge.m_kImpulse;

	max_dist			= maximum_distance * cartridge.m_kDist;
	fly_dist			= 0;

	parent_id			= sender_id;
	flags.allow_sendhit	= SendHit;
	weapon_id			= sendersweapon_id;
	hit_type			= e_hit_type;

	pierce				= cartridge.m_kPierce;
	ap					= cartridge.m_kAP;
	air_resistance		= cartridge.m_kAirRes;
	wallmark_size		= cartridge.fWallmarkSize;
	m_u8ColorID			= cartridge.m_u8ColorID;

	bullet_material_idx = cartridge.bullet_material_idx;
	VERIFY			(u16(-1)!=bullet_material_idx);

	flags.allow_tracer					= !!cartridge.m_flags.test(CCartridge::cfTracer);
	flags.allow_ricochet				= !!cartridge.m_flags.test(CCartridge::cfRicochet);
	flags.explosive						= !!cartridge.m_flags.test(CCartridge::cfExplosive);
	flags.skipped_frame					= 0;

	targetID			= 0;
	//Новая баллистика!
	u8	type = manager.m_type_ballistic
	if (GameID()!=GAME_SINGLE || type==1){
		air_resistance /= max_speed;
		manager.m_type_ballistic = 1;
	}else if(type==0)
		air_resistance = manager.m_fAirResistanceK;
	else
		air_resistance *= 0.001f;
}

void CBulletManager::Load		()
{
	m_fTracerWidth			= pSettings->r_float(BULLET_MANAGER_SECTION, "tracer_width");
	m_fTracerLengthMax		= pSettings->r_float(BULLET_MANAGER_SECTION, "tracer_length_max");
	m_fTracerLengthMin		= pSettings->r_float(BULLET_MANAGER_SECTION, "tracer_length_min");

	m_fGravityConst			= pSettings->r_float(BULLET_MANAGER_SECTION, "gravity_const");
	m_fAirResistanceK		= pSettings->r_float(BULLET_MANAGER_SECTION, "air_resistance_k");

	m_dwStepTime			= pSettings->r_u32	(BULLET_MANAGER_SECTION, "time_step");
	m_fMinBulletSpeed		= pSettings->r_float(BULLET_MANAGER_SECTION, "min_bullet_speed");
	m_fCollisionEnergyMin	= pSettings->r_float(BULLET_MANAGER_SECTION, "collision_energy_min");
	m_fCollisionEnergyMax	= pSettings->r_float(BULLET_MANAGER_SECTION, "collision_energy_max");

	m_fHPMaxDist			= pSettings->r_float(BULLET_MANAGER_SECTION, "hit_probability_max_dist");

	LPCSTR whine_sounds		= pSettings->r_string(BULLET_MANAGER_SECTION, "whine_sounds");
	int cnt					= _GetItemCount(whine_sounds);
	xr_string tmp;
	for (int k=0; k<cnt; ++k){
		m_WhineSounds.push_back	(ref_sound());
		m_WhineSounds.back().create(_GetItem(whine_sounds,k,tmp),st_Effect,sg_SourceType);
	}

	LPCSTR explode_particles= pSettings->r_string(BULLET_MANAGER_SECTION, "explode_particles");
	cnt						= _GetItemCount(explode_particles);
	for (int k=0; k<cnt; ++k)
		m_ExplodeParticles.push_back	(_GetItem(explode_particles,k,tmp));
	m_type_ballistic		= READ_IF_EXISTS(pSettings, r_u8, BULLET_MANAGER_SECTION, "type_ballistic", 0);
}

bool CBulletManager::CalcBullet(collide::rq_results& rq_storage, xr_vector<ISpatial*>& rq_spatial, SBullet* bullet, u32 delta_time)
{
	float delta_time_sec	= float(delta_time)/1000.f;
	float range				= bullet->speed*delta_time_sec;
	
	float max_range			= bullet->max_dist - bullet->fly_dist;
	range	= _min(range, max_range);

	//запомнить текущую скорость пули, т.к. в
	//RayQuery() она может поменяться из-за рикошетов
	//и столкновений с объектами
	Fvector cur_dir				= bullet->dir;
	bullet_test_callback_data	bullet_data;
	bullet_data.pBullet			= bullet;
	bullet_data.bStopTracing	= true;

	bullet->flags.ricochet_was	= 0;
	collide::ray_defs 		RD(bullet->pos, bullet->dir, range, CDB::OPT_CULL, collide::rqtBoth);
	
	BOOL result					= Level().ObjectSpace.RayQuery(rq_storage, RD, firetrace_callback, &bullet_data, test_callback, NULL);
	
	if (result & bullet_data.bStopTracing) {
		range					= (rq_storage.r_begin()+rq_storage.r_count()-1)->range;
	}
	bullet->flags.skipped_frame = (Device.dwFrame >= bullet->frame_num);
	if(!bullet->flags.ricochet_was)	{
		range = _max(EPS_L, range);
		//изменить положение пули
		bullet->pos.mad(bullet->pos, cur_dir, range);
		bullet->fly_dist += range;
		if(bullet->fly_dist>=bullet->max_dist)
			return false;
		//определим вылет за уровень
		//if(!Fbox4::point_in_box(m_BoundingVolume, bullet->pos))
		if(!m_BoundingVolume.point_in_box(bullet->pos))
			return false;
		//изменить скорость и направление ее полета и с учетом гравитации
		float	k_speed = bullet->air_resistance*delta_time_sec;
		if (m_type_ballistic != 0)
			k_speed *= bullet->speed;
		bullet->dir.mul(bullet->speed*(1.0-k_speed));		//получим вектор скорости 
		bullet->dir.y -= m_fGravityConst*delta_time_sec;
		bullet->speed = bullet->dir.magnitude();
		bullet->dir.mul(1.0/bullet->speed);	//в место normalize()
	}
	return (m_fMinBulletSpeed < bullet->speed);
}

В 15-ой ревизии сделал правку "Новая баллистика".
Вот исходник этой правки.

Требуется самостоятельно определить метод point_in_box, точка_в_боксе возвращает тру если точка внутри бокса.

ЗЫ

Забыл указать.
Параметр type_ballistic в секции bullet_manager: 0 - оригинальная баллистика, 1 - из мультиплеера, 2 - немного изменённый вариант №1.

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

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Ссылка на комментарий

Приветствую.

Товарищи двигоправы, подскажите пожалуйста: почему при одновременно работающих двух и более классах CUIScriptWnd методы Update и OnKeyboard работают всегда только у одного - первого запущенного? И можно ли это как-то обойти?

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

@naxac, ты имеешь ввиду те, что бы запущены через start_stop_menu()? Странное поведение. Если судить по

https://github.com/OGSR/OGSR-Engine/blob/271c01063ffed1416f88ea433fc185cf95d8cf9c/ogsr_engine/xrGame/UIDialogHolder.cpp#L227

то Update() вызывается у всех диалогов из списка, которые не сказали, что они не Enabled().

 

А если судить вот по этому

https://github.com/OGSR/OGSR-Engine/blob/271c01063ffed1416f88ea433fc185cf95d8cf9c/ogsr_engine/xrGame/UIDialogHolder.cpp#L168

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

 

  • Полезно 1
Ссылка на комментарий

@dsh, у меня немного другая ситуация: в одном, основном классе вызываются несколько ещё и присваиваются переменным основного (self.var = CUIScriptWnd_my()). Вот в этих классах ни апдейт, ни он-кейбоард не работают, а в основном классе всё нормально...

Вот тут: https://github.com/naxac/CP2_AddOn/blob/master/gamedata/scripts/ui_spin_new.script - тот самый дополнительный класс. Каллбэки работают.

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

@naxac, что-то я не понял. Ну хорошо, сделали


self.var = CUIScriptWnd_my()

а кто будет у них Update() вызывать? Для оконной системы движка они пока-что не существуют.

 

  • Спасибо 1
  • Полезно 1
Ссылка на комментарий

@dsh, да, точно, разобрался, надо было его просто приаттачить и показать, спасибо, заработало.

  • Нравится 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

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

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...