Jan,

I wrote code to attach models to the play as part of the Ham and Jam mod.
We use it to put random helmet models on the players as a means of trying
to not make them all look the same. I use bone merging as the general
method rather than attachments but it seems to work fine for me.

I'm afraid I haven't opened Visual Studio for over a year but the basics
are thus.

Set-up your player models and create the bones where you want your models
to be attached. You need to then define them as used for bone merging with
the $bonemerge directive in your QC file.

In the models you want to attach to the player, you need to have a bone in
the model with the same name as the bone you will attach to. The general
technique I used is to place the actual prop model on the player model so
it's how you want it to appear on the player model and then create a new
bone in the same position and orientation and the bone I will attach too,
call it something different and weight the attachment model to the new
bone. I then move the new bone and the model down so that it's origin is
0,0,0 and export the SMD. In the QC file I use $renamebone to rename the
extra bone to the same as the bone it will attach to.

So, at this point you should have a player model with named and defined
attachment bones and models you will attach to it with named bones that
match the attachment points.

Codewise what I did was this.

I created a new client and server sidee class called C_PlayerHelmet baed on
on C_PhysicsProp:

class C_PlayerHelmet: public C_PhysicsProp
{
    typedef C_PhysicsProp BaseClass;
public:
    DECLARE_CLIENTCLASS();

    C_PlayerHelmet();
    ~C_PlayerHelmet();

    virtual bool    ShouldDraw( void );
};

It's only function, ShouldDraw, basically just does checks to see if it
should draw the helmet, based on if we're the local player or not and such.

bool C_PlayerHelmet::ShouldDraw( void )
{
    // TODO: This needs some refinement...

    // if we don't have an owner entity...
    if ( !GetOwnerEntity() )
        return BaseClass::ShouldDraw();

    if( GetOwnerEntity() == C_HajPlayer::GetLocalHajPlayer() )
        return input->CAM_IsThirdPerson();
}

On the server side I have the same class with basically a Spawn function
which calls PreCache and then BaseClass::Spawn();

That's it - that just the entity to handle the helmet model for the player.

As for actually getting it onto the player model. Well I have a whole bunch
of player class functions to handle that but basically in my player model
class I create an instance for the helmet as:

CHandle<CBaseEntity>    m_hHelmetEnt

When I actually want to attach a helmet to the player:

// create the helmet entity
    if ( !m_hHelmetEnt )
    {
        m_hHelmetEnt = (CBaseEntity*)CreateEntityByName( "player_helmet" );

        // failure!
        if ( !m_hHelmetEnt )
        {
            DevMsg(1, "Could not create player helmet entity!");
            m_bHasHelmet = false;
            return;
        }

        // get the helmet index
        unsigned int n = ChooseHelmet();

        if ( n > HELMET_NONE )
        {
            m_hHelmetEnt->SetOwnerEntity( this );
            m_hHelmetEnt->SetModel( g_pszHelmetModels[n] );

            // must spawn before attaching.
            m_hHelmetEnt->Spawn();

            m_hHelmetEnt->FollowEntity( this, true );
            m_hHelmetEnt->AddEffects( EF_BONEMERGE_FASTCULL );
            m_hHelmetEnt->AddEffects( EF_PARENT_ANIMATES );
            m_hHelmetEnt->RemoveEFlags( EFL_USE_PARTITION_WHEN_NOT_SOLID );

            SetHelmet( n );
            m_bHasHelmet = true;
        }
    }

To take the helmet off:

    if ( m_hHelmetEnt )
    {
        UTIL_RemoveImmediate( m_hHelmetEnt );
        m_hHelmetEnt = NULL;
    }

That's pretty much the basics. What it does is short is create the
attachment model as it's own entity and have it bonemerge and follow the
player around.

I had a bunch of other stuff which handles the helmet getting shot or blown
off and just spawning it into the world as a non solid gib that vanishes
after a while.

// Jed




On 30 November 2012 18:32, Jan Hartung <jan.hart...@gmx.de> wrote:

> Thanks Nick, the page you linked to might help. I'll check it in detail
> later.
>
> Jan
>
> -----Ursprüngliche Nachricht-----
> Von: hlcoders-boun...@list.valvesoftware.com
> [mailto:hlcoders-boun...@list.valvesoftware.com] Im Auftrag von Nick
> Gesendet: Freitag, 30. November 2012 17:50
> An: Discussion of Half-Life Programming
> Betreff: Re: [hlcoders] Show a model on the player
>
> i am not sure... but someone did a mod where weapons were added on the
> player back.
>
> Also, I knew of amodeler named Flare and who was able to set the
> attachment point on the prop.. And that attachment point on the prop
> determined where the model was attached to the player.
>
> If the prop is setup correctly, it should be perfectly setup when
> attached to a player with HLMV, no code would be required.
> http://www.halfwit-2.com/?page=resources&action=view&item=14
>
> On Sat, Nov 24, 2012 at 11:19 AM, Jan Hartung <jan.hart...@gmx.de>
> wrote:
> > I’ve been trying different things now, but none of them work as they
> > are supposed to.
> >
> >
> >
> > A combination of LookupAttachment and GetAttachment and setting the
> > origin and angles of the entity I want to attach to the player to what
>
> > GetAttachment returned followed by a call to FollowEntity does not
> > help. The entity seems to be glued to the players feet then.
> >
> > Calling SetParent and afterwards SetParentAttachment yields better
> results.
> > The entity is shown on the attachment point and moves completely
> > relative to the player. The problem here is, that the weapon is no
> > longer in the player’s hands and the whole player model jerks around.
> > Additionally the console prints the error message “*** ERROR: Bone
> > access not allowed (entity 1:player)”. I tried to solve that by
> > calling PushAllowBoneAccess on the player (client side). Doesn’t help,
>
> > the error message does not disappear and the player keeps on jerking
> around.
> >
> >
> >
> > Any ideas?
> >
> >
> >
> > Jan
> >
> >
> >
> >
> >
> > Von: hlcoders-boun...@list.valvesoftware.com
> > [mailto:hlcoders-boun...@list.valvesoftware.com] Im Auftrag von Cale
> > Dunlap
> > Gesendet: Mittwoch, 3. Oktober 2012 20:21
> > An: Discussion of Half-Life Programming
> > Betreff: Re: [hlcoders] Show a model on the player
> >
> >
> >
> > I haven't personally done what you're trying to do, but perhaps
> > looking at bone followers would provide some insight. I'm not sure if
> > they'll address what you're asking. Other members of the list can
> correct me if I'm wrong.
> > I've actually been curious about this myself.
> >
> >
> >
> > Cale
> >
> > On Thursday, September 27, 2012, Jan Hartung wrote:
> >
> > Hi,
> >
> >
> >
> > I’m trying to render different items (models) on the player model. The
>
> > player model has been set up with various attachments where I could
> > render the items. My problem is that I couldn’t find a way to attach
> > an item to any of the attachment points. The net doesn’t really help
> > with this and I couldn’t find the code used to show the weapons on the
>
> > player models. Any hints on how to render models on attachment points?
> >
> >
> >
> > Jan
> >
> >
> >
> >
> > _______________________________________________
> > To unsubscribe, edit your list preferences, or view the list archives,
>
> > please visit:
> > https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders
> >
> >
>
> _______________________________________________
> To unsubscribe, edit your list preferences, or view the list archives,
> please visit:
> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders
>
>
> _______________________________________________
> To unsubscribe, edit your list preferences, or view the list archives,
> please visit:
> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders
>
>
_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please 
visit:
https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders

Reply via email to