Перемещение env_sprite + env_spritetrail

iamdss

Участник
Сообщения
126
Реакции
12
Здравствуйте. Пытаюсь в HL2DM сместить запал гранаты и его хвост с нижней части на верхнюю. В OnThink делаю примерно так:

C-подобный:
new glow = GetEntPropEnt(entity,Prop_Data,"m_pMainGlow");
new trail = GetEntPropEnt(entity,Prop_Data,"m_pGlowTrail");
// ...
new Float:Position[3] = {0.0, 0.0, 9.0};
TeleportEntity(glow, Position, NULL_VECTOR, NULL_VECTOR);
TeleportEntity(trail, Position, NULL_VECTOR, NULL_VECTOR);

Но спрайты не двигаются. Вопрос - что я делаю не так?
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Мне кажется ты всё делаешь не так.
 

iamdss

Участник
Сообщения
126
Реакции
12
Яркий пример оффтопа. Вижу, у вас это хроническое. Не будете ли вы, любезный, столь снисходительны к человеку, который всё делает не так, и не объясните, в чём именно заключается моя ошибка?
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Яркий пример оффтопа. Вижу, у вас это хроническое. Не будете ли вы, любезный, столь снисходительны к человеку, который всё делает не так, и не объясните, в чём именно заключается моя ошибка?

Я не совсем понимаю что именно вы хотели сделать, любезный. Но зачем вы делаете то, что вы делаете?
Первое, что смущает - вы пытаетесь телепортировать нечто в почти начало системы координат карты. Если вы хотите изменить поворот, то почитайте внимательней параметры функции телепортации. Ну а второе - вероятно вы нашли не ту ентити, что вам надо.

Вообще, просто скачайте hl2sdk с АМ. От всего стандартного для хл2 оружия есть доступный исходный код. С ним вы будете уверены в том что и как работает, и в какие пропы что сохраняется. Ну и, естественной, это избавит вас от множества лишних вопросов. Просто, чтобы вы знали, некоторые вещи могут происходить не только через стандартные ентити. Так же имеется Temp Ents и info_particle_system.
 

iamdss

Участник
Сообщения
126
Реакции
12
Я объясню. Постараюсь по пунктам и по существу. Вот мой код OnThink:

C-подобный:
		new glow  = GetEntPropEnt(entity, Prop_Data, "m_pMainGlow");
		new trail = GetEntPropEnt(entity, Prop_Data, "m_pGlowTrail");
		if ((glow == -1) || (trail == -1))
		{
			return;
		}

		new r = GetRandomInt(0, 255);
		new g = GetRandomInt(0, 255);
		new b = GetRandomInt(0, 255);

		DispatchKeyValue(glow,"model","sprites/glow03.vmt");
		DispatchSpawn(glow);
		SetEntityRenderColor(glow,r,g,b,255);
		SetEntPropEnt(entity,Prop_Data,"m_pMainGlow",-1);
		spriteOther(entity,glow);

		DispatchKeyValue(trail, "model", "sprites/laser.vmt");
		DispatchSpawn(trail);
		SetEntityRenderColor(trail,r,g,b,255);
		SetEntPropEnt(entity,Prop_Data,"m_pGlowTrail",-1);
		trailOther(entity,trail);

entity в данном случае - граната npc_grenade_frag. У гранаты есть свет запала и хвост запала, оригинально они красные. Здесь я получаю энтити запала и хвоста, перекрашиваю их в произвольный цвет, а также убиваю повторно созданные энтити в spriteOther и trailOther (известный баг, приводящий к краху сервера). Но запал находится не на своём месте, не в верху, как ожидается, а в нижней части модели. Мне необходимо его переместить вверх, приблизительно на 9 юнитов, я пытался сделать это кодом выше (был взят из реально работающего плагина), но телепортации не происходит.

вы пытаетесь телепортировать нечто в почти начало системы координат карты

Неверно. Трейлы привязаны к гранате, следовательно, координаты относительные.

Если вы хотите изменить поворот, то почитайте внимательней параметры функции телепортации

Читал, понимаю её в полной мере, но мне не нужен поворот, мне нужно просто переместить запал выше.

вероятно вы нашли не ту ентити, что вам надо.

Снова неверно. Если бы я нашёл не ту энтити, я бы не мог менять её цвет. Но я успешно это делаю.

некоторые вещи могут происходить не только через стандартные ентити

Это на 146% env_sprite и env_spritetrail, PrintToChatAll гарантирует это.

Вообще, просто скачайте hl2sdk

Скачан, распакован, более того, вот вам функция создания гранаты:

C-подобный:
void CGrenadeFrag::CreateEffects( void )
{
	// Start up the eye glow
	m_pMainGlow = CSprite::SpriteCreate( "sprites/redglow1.vmt", GetLocalOrigin(), false );

	int	nAttachment = LookupAttachment( "fuse" );

	if ( m_pMainGlow != NULL )
	{
		m_pMainGlow->FollowEntity( this );
		m_pMainGlow->SetAttachment( this, nAttachment );
		m_pMainGlow->SetTransparency( kRenderGlow, 255, 255, 255, 200, kRenderFxNoDissipation );
		m_pMainGlow->SetScale( 0.2f );
		m_pMainGlow->SetGlowProxySize( 4.0f );
	}

	// Start up the eye trail
	m_pGlowTrail	= CSpriteTrail::SpriteTrailCreate( "sprites/bluelaser1.vmt", GetLocalOrigin(), false );

	if ( m_pGlowTrail != NULL )
	{
		m_pGlowTrail->FollowEntity( this );
		m_pGlowTrail->SetAttachment( this, nAttachment );
		m_pGlowTrail->SetTransparency( kRenderTransAdd, 255, 0, 0, 255, kRenderFxNone );
		m_pGlowTrail->SetStartWidth( 8.0f );
		m_pGlowTrail->SetEndWidth( 1.0f );
		m_pGlowTrail->SetLifeTime( 0.5f );
	}
}

Как видите, запал является дочерним по отношению к энтити гранаты и установка координат 0-0-9 вполне оправданна и способна привести к цели. Единственный мой вопрос в том, почему этого не происходит. О чём я и спросил.

Cогласитесь, вопрос не так глуп, как вам показалось. Вчера, гугля здесь по моей проблеме, я видел куда более глупые темы. В моих темах всегда присутствует чёткая постановка вопроса, а также определённая информация по проблеме, чего у массы вопросов здесь я не наблюдаю. Мало информации? Спросите и я расскажу ещё. А принимать собеседника за школяра или профана в программировании априори - имхо, не комильфо. Бьюсь об заклад, что в среде RAD Studio я мог бы дать вам фору, но, к сожалению, я не сишник, а SM для меня и вовсе изысканное извращение. Давайте договоримся, что в будущем этот ваш моветон не будет мешать мне задавать вопросы, а вам отвечать на них.

Добавлено через 20 минут
Дополнение. С
C-подобный:
TeleportEntity(trail, Position, NULL_VECTOR, NULL_VECTOR);
в первом посте я действительно погорячился, однако с
C-подобный:
TeleportEntity(glow, Position, NULL_VECTOR, NULL_VECTOR);
проблема всё равно актуальна.
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Так вот в чём дело. Сомнительный метод, если честно.
Телепортация происходит в начало системы координат карты, и никак не относительно модели ентити, это вы уже сами себе придумали.
Вот статья на официальном вики - ссылка.
Стоит попробовать парент через "SetParentAttachmentMaintainOffset".
Порядок действий примерно следующий: инпут "ClearParent" -> берём ориджин ентити -> fOrigin[2] += 9.0 ->
PHP:
        TeleportEntity(ent, origin, NULL_VECTOR, NULL_VECTOR);
		
		SetVariantString("!activator");
		AcceptEntityInput(ent, "SetParent", grenade, ent, 0);
		
		SetVariantString("fuse");
		AcceptEntityInput(ent, "SetParentAttachmentMaintainOffset", ent, ent, 0);
Ну или сделать новую модель с костью в нужном месте.
 

iamdss

Участник
Сообщения
126
Реакции
12
Телепортация происходит в начало системы координат карты, и никак не относительно модели ентити

Ну так энтити на месте остаётся. Если б хотя бы в начало телепортировалась, но впечатление, что она игнорирует это.

Стоит попробовать парент через "SetParentAttachmentMaintainOffset".

Попробую, спасибо.

сделать новую модель с костью в нужном месте.

В принципе, это была первая идея. Но не хочу захламлять сервер лишними файлами, стараюсь оставить стандарт по возможности. Да и интерес есть сделать именно плагином.
 
Сверху Снизу