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

Тема в разделе "Программирование / Скриптинг", создана пользователем iamdss, 26 июл 2015.

  1. iamdss

    iamdss

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

    Код:
    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);
    Но спрайты не двигаются. Вопрос - что я делаю не так?
     
  2. gibs

    gibs Фитиль народного волненья

    Сообщения:
    536
    Симпатии:
    133
    Мне кажется ты всё делаешь не так.
     
  3. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Яркий пример оффтопа. Вижу, у вас это хроническое. Не будете ли вы, любезный, столь снисходительны к человеку, который всё делает не так, и не объясните, в чём именно заключается моя ошибка?
     
  4. gibs

    gibs Фитиль народного волненья

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

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

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Я объясню. Постараюсь по пунктам и по существу. Вот мой код OnThink:

    Код:
    		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 гарантирует это.

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

    Код:
    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 минут
    Дополнение. С
    Код:
    TeleportEntity(trail, Position, NULL_VECTOR, NULL_VECTOR);
    в первом посте я действительно погорячился, однако с
    Код:
    TeleportEntity(glow, Position, NULL_VECTOR, NULL_VECTOR);
    проблема всё равно актуальна.
     
    Последнее редактирование: 28 июл 2015
  6. gibs

    gibs Фитиль народного волненья

    Сообщения:
    536
    Симпатии:
    133
    Так вот в чём дело. Сомнительный метод, если честно.
    Телепортация происходит в начало системы координат карты, и никак не относительно модели ентити, это вы уже сами себе придумали.
    Вот статья на официальном вики - ссылка.
    Стоит попробовать парент через "SetParentAttachmentMaintainOffset".
    Порядок действий примерно следующий: инпут "ClearParent" -> берём ориджин ентити -> fOrigin[2] += 9.0 ->
    PHP:
            TeleportEntity(entoriginNULL_VECTORNULL_VECTOR);
            
            
    SetVariantString("!activator");
            
    AcceptEntityInput(ent"SetParent"grenadeent0);
            
            
    SetVariantString("fuse");
            
    AcceptEntityInput(ent"SetParentAttachmentMaintainOffset"entent0);
    Ну или сделать новую модель с костью в нужном месте.
     
    iamdss нравится это.
  7. iamdss

    iamdss

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

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

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