void GetAttachment(CBaseEntity *pEntity, int iBone, Vector *pVecOrigin, Vector *pVecAngles) { Vector vecOrigin, vecAngles; edict_t *pEdict = pEntity->edict(); // force to update frame StudioFrameAdvanceEnt(pEdict); GET_ATTACHMENT(pEdict, iBone, vecOrigin, vecAngles); if (!pEntity->IsPlayer()) { FixupAngles(pEdict, vecOrigin); } if (pVecOrigin) { *pVecOrigin = vecOrigin; } if (pVecAngles) { *pVecAngles = vecAngles; } }
/* <10984> ../cstrike/dlls/animating.cpp:208 */ NOXREF void CBaseAnimating::GetAttachment(int iAttachment, Vector &origin, Vector &angles) { GET_ATTACHMENT(ENT(pev), iAttachment, origin, angles); }
bool ParticleSystem::UpdateParticle( particle *part, float frametime ) { if( frametime == 0 ) return true; part->age += frametime; edict_t *source = GetEntityByIndex( m_iEntIndex ); if( !source ) return false; // total paranoia :) // is this particle bound to an entity? if( part->m_iEntIndex ) { if ( enable ) { if( m_iEntAttachment ) { Vector pos = Vector( 0, 0, 0 ); GET_ATTACHMENT( source, m_iEntAttachment, pos, NULL ); if( pos == Vector( 0, 0, 0 )) pos = source->v.origin; // missed attachment part->velocity = (pos - part->origin ) / frametime; part->origin = pos; } else { part->velocity = ( source->v.origin - part->origin ) / frametime; part->origin = source->v.origin; } } else { // entity is switched off, die return false; } } else { // not tied to an entity, check whether it's time to die if( part->age_death >= 0 && part->age > part->age_death ) return false; // apply acceleration and velocity Vector vecOldPos = part->origin; if ( part->m_fDrag ) part->velocity = part->velocity + (-part->m_fDrag * frametime) * ( part->velocity - part->m_vecWind ); part->velocity = part->velocity + frametime * part->accel; part->origin = part->origin + frametime * part->velocity; if( part->pType->m_bBouncing ) { Vector vecTarget = part->origin + frametime * part->velocity; TraceResult tr; TRACE_LINE( part->origin, vecTarget, true, source, &tr ); if( tr.flFraction < 1.0f ) { part->origin = tr.vecEndPos; float bounceforce = DotProduct( tr.vecPlaneNormal, part->velocity ); float newspeed = (1.0f - part->pType->m_BounceFriction.GetInstance()); part->velocity = part->velocity * newspeed; part->velocity = part->velocity + (-bounceforce * ( newspeed + part->pType->m_Bounce.GetInstance())) * tr.vecPlaneNormal; } } } // spray children if ( part->age_spray && part->age > part->age_spray ) { part->age_spray = part->age + 1/part->pType->m_SprayRate.GetInstance(); // particle *pChild = ActivateParticle(); if (part->pType->m_pSprayType) { particle *pChild = part->pType->m_pSprayType->CreateParticle(this); if (pChild) { pChild->origin = part->origin; float fSprayForce = part->pType->m_SprayForce.GetInstance(); pChild->velocity = part->velocity; if (fSprayForce) { float fSprayPitch = part->pType->m_SprayPitch.GetInstance() - source->v.angles.x; float fSprayYaw = part->pType->m_SprayYaw.GetInstance() - source->v.angles.y; float fSprayRoll = source->v.angles.z; float fForceCosPitch = fSprayForce*CosLookup(fSprayPitch); pChild->velocity.x += CosLookup(fSprayYaw) * fForceCosPitch; pChild->velocity.y += SinLookup(fSprayYaw) * fForceCosPitch + SinLookup(fSprayYaw) * fSprayForce * SinLookup(fSprayRoll); pChild->velocity.z -= SinLookup(fSprayPitch) * fSprayForce * CosLookup(fSprayRoll); } } } } part->m_fSize += part->m_fSizeStep * frametime; part->m_fAlpha += part->m_fAlphaStep * frametime; part->m_fRed += part->m_fRedStep * frametime; part->m_fGreen += part->m_fGreenStep * frametime; part->m_fBlue += part->m_fBlueStep * frametime; part->frame += part->m_fFrameStep * frametime; if ( part->m_fAngleStep ) { part->m_fAngle += part->m_fAngleStep * frametime; while ( part->m_fAngle < 0 ) part->m_fAngle += 360; while ( part->m_fAngle > 360 ) part->m_fAngle -= 360; } return true; }
//========================================================= //========================================================= void CBaseAnimating :: GetAttachment ( int iAttachment, Vector &origin ) { Vector vecTemp; GET_ATTACHMENT( ENT(pev), iAttachment, origin, vecTemp ); }