//----------------------------------------------------------------------------- // Purpose: Fire a flare //----------------------------------------------------------------------------- CBaseEntity *CTFWeaponBaseGun::FireFlare(CTFPlayer *pPlayer) { PlayWeaponShootSound(); #ifdef GAME_DLL Vector vecSrc; QAngle angForward; Vector vecOffset( 23.5f, 12.0f, -3.0f ); if ( pPlayer->GetFlags() & FL_DUCKING ) { vecOffset.z = 8.0f; } GetProjectileFireSetup( pPlayer, vecOffset, &vecSrc, &angForward, false ); CTFProjectile_Flare *pProjectile = CTFProjectile_Flare::Create( vecSrc, angForward, pPlayer, pPlayer ); if ( pProjectile ) { pProjectile->SetCritical( IsCurrentAttackACrit() ); pProjectile->SetDamage( GetProjectileDamage() ); } return pProjectile; #endif return NULL; }
//----------------------------------------------------------------------------- // Purpose: Fire a flare //----------------------------------------------------------------------------- CBaseEntity *CTFWeaponBaseGun::FireArrow( CTFPlayer *pPlayer, int iType ) { PlayWeaponShootSound(); #ifdef GAME_DLL Vector vecSrc; QAngle angForward; Vector vecOffset( 23.5f, 12.0f, -3.0f ); if ( pPlayer->GetFlags() & FL_DUCKING ) { vecOffset.z = 8.0f; } if ( IsWeapon( TF_WEAPON_COMPOUND_BOW ) ) { // Valve were apparently too lazy to fix the viewmodel and just flipped it through the code. vecOffset.y *= -1.0f; } GetProjectileFireSetup( pPlayer, vecOffset, &vecSrc, &angForward, false, true ); CTFProjectile_Arrow *pProjectile = CTFProjectile_Arrow::Create( this, vecSrc, angForward, GetProjectileSpeed(), GetProjectileGravity(), pPlayer, pPlayer, iType ); if ( pProjectile ) { pProjectile->SetCritical( IsCurrentAttackACrit() ); pProjectile->SetDamage( GetProjectileDamage() ); } return pProjectile; #endif return NULL; }
UINT32 Sprite::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx, const Vector2I& offset, const Rect2I& clipRect, bool clip) const { const auto& renderElem = mCachedRenderElements.at(renderElementIdx); UINT32 startVert = startingQuad * 4; UINT32 startIndex = startingQuad * 6; UINT32 maxVertIdx = maxNumQuads * 4; UINT32 maxIndexIdx = maxNumQuads * 6; UINT32 mNumVertices = renderElem.numQuads * 4; UINT32 mNumIndices = renderElem.numQuads * 6; assert((startVert + mNumVertices) <= maxVertIdx); assert((startIndex + mNumIndices) <= maxIndexIdx); UINT8* vertDst = vertices + startVert * vertexStride; UINT8* uvDst = uv + startVert * vertexStride; // TODO - I'm sure this can be done in a more cache friendly way. Profile it later. Vector2 vecOffset((float)offset.x, (float)offset.y); if(clip) { for(UINT32 i = 0; i < renderElem.numQuads; i++) { UINT8* vecStart = vertDst; UINT8* uvStart = uvDst; UINT32 vertIdx = i * 4; memcpy(vertDst, &renderElem.vertices[vertIdx + 0], sizeof(Vector2)); memcpy(uvDst, &renderElem.uvs[vertIdx + 0], sizeof(Vector2)); vertDst += vertexStride; uvDst += vertexStride; memcpy(vertDst, &renderElem.vertices[vertIdx + 1], sizeof(Vector2)); memcpy(uvDst, &renderElem.uvs[vertIdx + 1], sizeof(Vector2)); vertDst += vertexStride; uvDst += vertexStride; memcpy(vertDst, &renderElem.vertices[vertIdx + 2], sizeof(Vector2)); memcpy(uvDst, &renderElem.uvs[vertIdx + 2], sizeof(Vector2)); vertDst += vertexStride; uvDst += vertexStride; memcpy(vertDst, &renderElem.vertices[vertIdx + 3], sizeof(Vector2)); memcpy(uvDst, &renderElem.uvs[vertIdx + 3], sizeof(Vector2)); clipToRect(vecStart, uvStart, 1, vertexStride, clipRect); vertDst = vecStart; Vector2* curVec = (Vector2*)vertDst; *curVec += vecOffset; vertDst += vertexStride; curVec = (Vector2*)vertDst; *curVec += vecOffset; vertDst += vertexStride; curVec = (Vector2*)vertDst; *curVec += vecOffset; vertDst += vertexStride; curVec = (Vector2*)vertDst; *curVec += vecOffset; vertDst += vertexStride; uvDst += vertexStride; } } else { for(UINT32 i = 0; i < renderElem.numQuads; i++) { UINT8* vecStart = vertDst; UINT32 vertIdx = i * 4; memcpy(vertDst, &renderElem.vertices[vertIdx + 0], sizeof(Vector2)); memcpy(uvDst, &renderElem.uvs[vertIdx + 0], sizeof(Vector2)); vertDst += vertexStride; uvDst += vertexStride; memcpy(vertDst, &renderElem.vertices[vertIdx + 1], sizeof(Vector2)); memcpy(uvDst, &renderElem.uvs[vertIdx + 1], sizeof(Vector2)); vertDst += vertexStride; uvDst += vertexStride; memcpy(vertDst, &renderElem.vertices[vertIdx + 2], sizeof(Vector2)); memcpy(uvDst, &renderElem.uvs[vertIdx + 2], sizeof(Vector2)); vertDst += vertexStride; uvDst += vertexStride; memcpy(vertDst, &renderElem.vertices[vertIdx + 3], sizeof(Vector2)); memcpy(uvDst, &renderElem.uvs[vertIdx + 3], sizeof(Vector2)); vertDst = vecStart; Vector2* curVec = (Vector2*)vertDst; *curVec += vecOffset; vertDst += vertexStride; curVec = (Vector2*)vertDst; *curVec += vecOffset; vertDst += vertexStride; curVec = (Vector2*)vertDst; *curVec += vecOffset; vertDst += vertexStride; curVec = (Vector2*)vertDst; *curVec += vecOffset; vertDst += vertexStride; uvDst += vertexStride; } } if(indices != nullptr) memcpy(&indices[startIndex], renderElem.indexes, mNumIndices * sizeof(UINT32)); return renderElem.numQuads; }