When I drew a beam for one of my weapons I used the following:
pBeam->PointEntInit( endPos, this );
pBeam->SetEndAttachment( 1 );
pBeam->SetWidth( width / 4.0f );
pBeam->SetEndWidth( width );
However this was serverside code, But I did then have it also spark on the
muzzle, so I did:
CBaseViewModel *pViewModel = pOwner->GetViewModel();
pViewModel->GetAttachment(LookupAttachment("muzzle"),origin,angles);
g_pEffects->Sparks(origin);
Below is the entire drawBeam function I used:
CBasePlayer *pOwner = ToBasePlayer( GetOwner() );
CBaseViewModel *pViewModel = pOwner->GetViewModel();
if ( pOwner == NULL )
return;
//Check to store off our view model index
if ( pViewModel == NULL )
{
CBaseViewModel *vm = pOwner->GetViewModel();
if ( vm )
{
m_hViewModel.Set( vm );
}
}
#ifndef CLIENT_DLL
//Draw a tracer down the middle
UTIL_Tracer( startPos, endPos, 0, TRACER_DONT_USE_ATTACHMENT, 6500, true,
"GaussTracer" );
//Draw the main beam shaft
CBeam *pBeam = CBeam::BeamCreate( GAUSS_BEAM_SPRITE, width );
if ( useMuzzle )
{
pBeam->PointEntInit( endPos, this );
pBeam->SetEndAttachment( 1 );
pBeam->SetWidth( width / 4.0f );
pBeam->SetEndWidth( width );
}
else
{
pBeam->SetStartPos( startPos );
pBeam->SetEndPos( endPos );
pBeam->SetWidth( width );
pBeam->SetEndWidth( width / 4.0f );
}
pBeam->SetBrightness( 255 );
pBeam->SetColor( 255, 145+random->RandomInt( -16, 16 ), 0 );
pBeam->RelinkBeam();
pBeam->LiveForTime( 5.1f );
On Thu, Aug 18, 2011 at 11:11 PM, Ryan Sheffer <[email protected]> wrote:
> Hey coders!
>
> I came across a nasty little issue and I thought maybe somebody has come
> across this before.
> I am trying to create a client side beam from the muzzle of the players
> view model to where the bullet impacts, but I cannot get the attachment
> position for the muzzle on the view model.
>
> Here is the code I am using for getting the attachment:
>
> int attachment = pEntity->LookupAttachment( "muzzle" );
> pEntity->GetAttachment( attachment, vecAttachment, angAttachment );
>
> pEntity is the view model.
> This is the same way I saw it done on the physcannons client side code.
> The position it gets appears to be somewhere close to the origin of the map
> but the coordinates are not exactly 0, 0, 0. One way to fix the position is
> to give myself a weapon_physcannon and then when I switch back to my gun the
> attachment position is where it should be, from the muzzle. I don't see
> anything special in the weapon_physcannon's code so I am baffled.
>
> Some things to note:
> - This is a client side entity, client side code
> - The attachment on the model looks fine in the model viewer
>
> So any help would be wonderful, I am just digging away at the debugging
> trying to find the issue but nothing sticks out, only the fact that having a
> physcannon at the same time fixes the problem.
>
> Here is the full code for the beam just in case:
>
> void C_WeaponSonicRifle::CreateShotBeam(void)
> {
> CBasePlayer *pOwner = ToBasePlayer( GetOwner() );
>
> if ( pOwner == NULL )
> return;
>
> BeamInfo_t beamInfo;
> C_BaseAnimating *pEntity = NULL;
> trace_t tr;
>
> Vector vecAttachment, vecCrosshair, vecDir;
> QAngle angAttachment;
>
> if ( IsCarriedByLocalPlayer() && !::input->CAM_IsThirdPerson() )
> {
> pEntity = pOwner->GetViewModel();
> vecDir = pOwner->GetAutoaimVector(AUTOAIM_5DEGREES);
> }
> else
> {
> pEntity = this;
> vecDir = pOwner->GetAutoaimVector(AUTOAIM_5DEGREES);
> }
>
> pEntity->PushAllowBoneAccess( true, true, "sonic rifle" );
>
> int attachment = pEntity->LookupAttachment( "muzzle" );
> pEntity->GetAttachment( attachment, vecAttachment, angAttachment );
>
> pEntity->PopBoneAccess( "sonic rifle" );
>
> vecCrosshair = pOwner->Weapon_ShootPosition();
> UTIL_TraceLine(vecCrosshair, vecCrosshair + (vecDir *
> MAX_TRACE_LENGTH), MASK_SONICBEAMS, pOwner, COLLISION_GROUP_NONE, &tr);
>
> beamInfo.m_pStartEnt = NULL;
> beamInfo.m_pEndEnt = NULL;
>
> //beamInfo.m_nType = TE_BEAMPOINTS;
> beamInfo.m_vecStart = tr.endpos;
> beamInfo.m_vecEnd = vecAttachment;
>
> beamInfo.m_nStartAttachment = NULL;
> beamInfo.m_nEndAttachment = NULL;
>
> beamInfo.m_pszModelName = "sprites/laserbeam.vmt";
> beamInfo.m_flHaloScale = 0.0f;
> beamInfo.m_flLife = 2.5f;
>
> beamInfo.m_flWidth = 3.0f;
> beamInfo.m_flEndWidth = 3.0f;
>
> beamInfo.m_flFadeLength = 0.0f;
> beamInfo.m_flAmplitude = 0;
>
> beamInfo.m_flBrightness = 255.0;
>
> beamInfo.m_flSpeed = 1.0f;
> beamInfo.m_nStartFrame = 0.0;
> beamInfo.m_flFrameRate = 30.0;
>
> beamInfo.m_flRed = 255;
> beamInfo.m_flGreen = 255;
> beamInfo.m_flBlue = 255;
>
> beamInfo.m_nSegments = 4;
> beamInfo.m_bRenderable = true;
> beamInfo.m_nFlags = (FBEAM_SHADEIN | FBEAM_SHADEOUT | FBEAM_FADEOUT);
>
> beams->CreateBeamPoints( beamInfo );
> }
>
> Thanks guys :)
>
> --
> ~Ryan ( skidz )
>
> _______________________________________________
> To unsubscribe, edit your list preferences, or view the list archives,
> please visit:
> http://list.valvesoftware.com/mailman/listinfo/hlcoders
>
>
>
_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please
visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders