Вращение выброшенного предмета

iamdss

Участник
Сообщения
126
Реакции
12
Делаю выбрасывание оружия по определённому условию. Код примерно следующий:

C-подобный:
decl Float:clienteyeangle[3], Float:anglevector[3], Float:clienteyeposition[3], Float:resultposition[3], entity;
GetClientEyeAngles(client, clienteyeangle);
GetClientEyePosition(client, clienteyeposition);
GetAngleVectors(clienteyeangle, anglevector, NULL_VECTOR, NULL_VECTOR);
NormalizeVector(anglevector, anglevector);
ScaleVector(anglevector, 10.0);
AddVectors(clienteyeposition, anglevector, resultposition);
NormalizeVector(anglevector, anglevector);
ScaleVector(anglevector, 1500.0);


entity = CreateEntityByName("prop_physics_override");
DispatchKeyValue(entity, "model", "models/weapons/w_pistol.mdl");
DispatchKeyValue(entity, "solid", "6");
DispatchSpawn(entity);
TeleportEntity(entity, resultposition, clienteyeangle, anglevector);

Предмет выбрасывается, что и понятно, в одном положении (модель пистолета тут для примера, в итоге бросать будем что-то другое). А хотелось бы, чтобы модель вела себя естественно, то есть, вращалась, как минимум, в одной плоскости, а также была подвержена тяготению.

Чтобы у нас сегодня не было пошаговых стратегий, озвучу вопрос. Возможно ли и как реализовать указанное выше желаемое? Буду рад и подсказкам, и примерам кода. Спасибо.
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
iamdss, R1KO вроде делал что-то подобное для CSS.

Добавлено через 53 минуты
Можно ведь сразу так:
entity = CreateEntityByName("weapon_*");
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #5
Саша Шеин, я кажется его удалил т.к. он создавал лаги.


iamdss, лови:

PHP:
new iEntity = CreateEntityByName("weapon_awp");
DispatchSpawn(iEntity);
/*
	Для гранат, бомбы и дефезуеров след. строка не нужна
*/
DispatchKeyValue(iEntity, "angles", "-90 0 0");

ActivateEntity(iEntity);
TeleportEntity(iEntity, Координаты, NULL_VECTOR, NULL_VECTOR);

Вот само вращение
PHP:
public OnGameFrame()
{
	static iSize;
	iSize = GetArraySize(g_hArrayWRWeapons);
	if (iSize)
	{
		for(new i=0; i < iSize; i++) CreateRotation(GetArrayCell(g_hArrayWRWeapons, i));
	}
}

stock CreateRotation(iWeapon)
{
	if(IsValidEntity(iWeapon))
	{
		decl Float:fRotate[3];
		GetEntPropVector(iWeapon, Prop_Send, "m_angRotation", fRotate);
		fRotate[1] += float(g_iWRRotSpeed);

		TeleportEntity(iWeapon, NULL_VECTOR, fRotate, NULL_VECTOR);
	}
}
Тоесть я вращал оружие каждый фрейм. Можно создать вращение так:
PHP:
new iEntity = CreateEntityByName("prop_physics_override");
...

new iRotating = CreateEntityByName("func_rotating");
				DispatchKeyValueVector(iRotating, "origin", fPos);
				DispatchKeyValue(iRotating, "targetname", sTargetName);
				DispatchKeyValue(iRotating, "maxspeed", "180");
				DispatchKeyValue(iRotating, "friction", "0");
				DispatchKeyValue(iRotating, "dmg", "0");
				DispatchKeyValue(iRotating, "solid", "0");
				DispatchKeyValue(iRotating, "spawnflags", "64");
				DispatchSpawn(iRotating);

				SetVariantString("!activator");
				AcceptEntityInput(iEntity, "SetParent", iRotating, iRotating);
				AcceptEntityInput(iRotating, "Start");
				
				SetVariantString(sBuffer);
				AcceptEntityInput(iRotating, "AddOutput");
				AcceptEntityInput(iRotating, "FireUser1");
				
				SetEntPropEnt(iEntity, Prop_Send, "m_hEffectEntity", iRotating);
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
Все решения плохие, даже моё, т.к. человеку нужен код для выбрасывания оружия. У R1KO вращение будет до тех пор, пока вручную не остановят, а это лишние хуки и отслеживание, коснулось ли земли. Мой путь чуть проще - у всех Projectile (и только у них) есть поле "m_vecAngVelocity", задающее вращение объекта, как раз угол скорости. Благодаря этому полю любой объект будет вращаться согласно Velocity. Но он требует потом отслеживания касания или преобразования объекта в оружие.
C-подобный:
public OnPluginStart() 
{
	RegConsoleCmd("sm_mydrop", Command_MyDrop);
}

public Action:Command_MyDrop(iClient, iArgc)
{
	decl Float:vOrigin[3], Float:vAngles[3];
	GetClientEyePosition(iClient, vOrigin);
	GetClientEyeAngles(iClient, vAngles);
	TR_TraceRayFilter(vOrigin, vAngles, MASK_SOLID, RayType_Infinite, TRDontHitSelf, client);
	if ( TR_DidHit() ) {
		new iEntity = CreateEntityByName("flashbang_projectile");
		DispatchSpawn(iEntity);
		SetEntityModel(iEntity, "models/items/healthkit.mdl");
		
		decl Float:vVelocity[3];
		GetAngleVectors(vAngles, vVelocity, NULL_VECTOR, NULL_VECTOR);
		ScaleVector(vVelocity, 1000.0);
		
		// Отодвинуть объект, чтобы не появлялся прямо над игроком.
		vOrigin[0] = vOrigin[0] + (vVelocity[0] * 0.1);
		vOrigin[1] = vOrigin[1] + (vVelocity[1] * 0.1); 
				
		TeleportEntity(iEntity, vOrigin, vAngles, vVelocity);
		SetEntPropVector(iEntity, Prop_Data, "m_vecAngVelocity", Float:{0.0, 0.0, 1000.0});
		SetEntPropFloat(iEntity, Prop_Send, "m_flElasticity", 1.0);
	}
	return Plugin_Handled;
}

m_flElasticity - эластичность скачков, что-то типа массы объекта. Чем меньше, тем больше будет скакать. Остается лишь подобрать значения угла вращения (Float:{1000.0, 0.0, 0.0}) и эластичность, чтобы получить то, что нужно.
 

iamdss

Участник
Сообщения
126
Реакции
12
Спасибо всем. Попробую метод Reiko1231.

Но он требует потом отслеживания касания или преобразования объекта в оружие.

Касание я и так буду отслеживать, так как надо будет реализовать урон по противнику (выкидывать будем лом/шокопалку, скорее всего). А вот как преобразовать объект в оружие, этого я не знаю, не подскажите? Хотелось бы потом иметь возможность поднять ломик, если промахнулся.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #10
iamdss, SDK Hooks SDKHook_StartTouch
SDKHook_StartTouchPost
SDKHook_Touch
 

iamdss

Участник
Сообщения
126
Реакции
12
Я вернулся к данной теме и у меня есть вопросы.

у всех Projectile (и только у них) есть поле "m_vecAngVelocity"

Я не знаю, какие есть проджектайлы в hl2dm, где посмотреть список? В валвовской вики нет такого в разделел hl2dm. Что это вообще такое - проджектайлы? Я использую prop_physics_multiplayer, чем указанный вами flashbang_projectile от него отличается? Простите за нубские вопросы.

Ещё один вопрос. Я вижу в дампах у prop_physics_multiplayer поля m_vecAngVelocity и m_flElasticity, но код

C-подобный:
SetEntPropVector(entity, Prop_Data, "m_vecAngVelocity", Float:{0.0, 0.0, 1000.0});
SetEntPropFloat(entity, Prop_Send, "m_flElasticity", 1.0);
TeleportEntity(entity, resultposition, clienteyeangle, anglevector);

не вращает мой prop_physics_multiplayer. Почему?
 
Сверху Снизу