void CDeathFX::CreateHumanDeathFX() { CSFXMgr* psfxMgr = g_pGameClientShell->GetSFXMgr(); if (!psfxMgr) return; CGameSettings* pSettings = g_pInterfaceMgr->GetSettings(); if (!pSettings || !pSettings->Gore()) return; GIBCREATESTRUCT gib; m_pClientDE->AlignRotation(&(gib.rRot), &m_vDir, LTNULL); LTFLOAT fDamage = VEC_MAG(m_vDir); VEC_COPY(gib.vPos, m_vPos); VEC_SET(gib.vMinVel, 50.0f, 100.0f, 50.0f); VEC_MULSCALAR(gib.vMinVel, gib.vMinVel, fDamage); VEC_SET(gib.vMaxVel, 100.0f, 200.0f, 100.0f); VEC_MULSCALAR(gib.vMaxVel, gib.vMaxVel, fDamage); gib.fLifeTime = 20.0f; gib.fFadeTime = 7.0f; gib.nGibFlags = 0; gib.bRotate = LTTRUE; gib.nCode = m_eCode; gib.eModelId = m_eModelId; gib.eModelStyle = m_eModelStyle; gib.bSubGibs = LTTRUE; gib.bBloodSplats = LTTRUE; SetupGibTypes(gib); psfxMgr->CreateSFX(SFX_GIB_ID, &gib); }
void CFolderGame::OnFocus(LTBOOL bFocus) { CGameSettings *pSettings = g_pInterfaceMgr->GetSettings(); if (bFocus) { m_bGore = pSettings->Gore(); m_nDifficulty = g_pGameClientShell->GetDifficulty(); m_bFadeBodies = g_pGameClientShell->GetFadeBodies(); m_nSubtitles = (int)g_vtSubtitles.GetFloat(); m_bAlwaysRun = pSettings->RunLock(); m_nLayout = (int)g_vtHUDLayout.GetFloat(); m_nHeadBob = (int)(10.0f * GetConsoleFloat("HeadBob",1.0f)); m_nWeaponSway = (int)(10.0f * GetConsoleFloat("WeaponSway",1.0f)); m_nPickupMsgDur = (int)(2.0f * GetConsoleFloat("PickupMessageDuration",5.0f)); m_bObjMessages = ( GetConsoleInt("ObjectiveMessages",1) > 0 ); UpdateData(LTFALSE); } else { UpdateData(); pSettings->SetBoolVar("Gore",m_bGore); g_vtSubtitles.WriteFloat((LTFLOAT)m_nSubtitles); g_vtHUDLayout.WriteFloat((LTFLOAT)m_nLayout); WriteConsoleInt("Difficulty",m_nDifficulty); g_pGameClientShell->SetDifficulty((GameDifficulty)m_nDifficulty); WriteConsoleInt("FadeBodies",(int)m_bFadeBodies); g_pGameClientShell->SetFadeBodies(m_bFadeBodies); pSettings->SetBoolVar("RunLock",m_bAlwaysRun); WriteConsoleFloat("HeadBob",((LTFLOAT)m_nHeadBob / 10.0f)); WriteConsoleFloat("WeaponSway",((LTFLOAT)m_nWeaponSway / 10.0f)); WriteConsoleFloat("PickupMessageDuration",((LTFLOAT)m_nPickupMsgDur / 2.0f)); WriteConsoleInt("ObjectiveMessages",m_bObjMessages); g_pLTClient->WriteConfigFile("autoexec.cfg"); } CBaseFolder::OnFocus(bFocus); }
void CWeaponFX::CreateSurfaceSpecificFX() { CGameSettings* pSettings = g_pInterfaceMgr->GetSettings(); if (!pSettings) return; // Don't do gore fx... if (m_eSurfaceType == ST_FLESH) { if (!pSettings->Gore()) { return; } if (m_pAmmo->eType == VECTOR && m_pAmmo->eInstDamageType == DT_BULLET) { CreateBloodSplatFX(); } } if ((m_wFireFX & WFX_EXITMARK) && ShowsMark(m_eExitSurface)) { CreateExitMark(); } if (m_wFireFX & WFX_EXITDEBRIS) { CreateExitDebris(); } if (!m_pAmmo || !m_pAmmo->pImpactFX) return; if (!m_pAmmo->pImpactFX->bDoSurfaceFX) return; // Create the surface specific fx... int i; SURFACE* pSurf = g_pSurfaceMgr->GetSurface(m_eSurfaceType); if (pSurf) { if (IsLiquid(m_eCode)) { // Create underwater fx... // Create any impact particle shower fx associated with this surface... for (i=0; i < pSurf->nNumUWImpactPShowerFX; i++) { CPShowerFX* pPShowerFX = g_pSurfaceMgr->GetPShowerFX(pSurf->aUWImpactPShowerFXIds[i]); g_pFXButeMgr->CreatePShowerFX(pPShowerFX, m_vPos, m_vDir, m_vSurfaceNormal); } } else { // Create normal fx... // Create any impact scale fx associated with this surface... for (i=0; i < pSurf->nNumImpactScaleFX; i++) { CScaleFX* pScaleFX = g_pSurfaceMgr->GetScaleFX(pSurf->aImpactScaleFXIds[i]); g_pFXButeMgr->CreateScaleFX(pScaleFX, m_vPos, m_vDir, &m_vSurfaceNormal, &m_rSurfaceRot); } // Create any impact particle shower fx associated with this surface... for (i=0; i < pSurf->nNumImpactPShowerFX; i++) { CPShowerFX* pPShowerFX = g_pSurfaceMgr->GetPShowerFX(pSurf->aImpactPShowerFXIds[i]); g_pFXButeMgr->CreatePShowerFX(pPShowerFX, m_vPos, m_vDir, m_vSurfaceNormal); } // Create any impact poly debris fx associated with this surface... if (g_vtCreatePolyDebris.GetFloat()) { for (i=0; i < pSurf->nNumImpactPolyDebrisFX; i++) { CPolyDebrisFX* pPolyDebrisFX = g_pSurfaceMgr->GetPolyDebrisFX(pSurf->aImpactPolyDebrisFXIds[i]); g_pFXButeMgr->CreatePolyDebrisFX(pPolyDebrisFX, m_vPos, m_vDir, m_vSurfaceNormal); } } } } }
void CWeaponFX::CreateBloodSplatFX() { CGameSettings* pSettings = g_pInterfaceMgr->GetSettings(); if (!pSettings || !pSettings->Gore()) return; CSFXMgr* psfxMgr = g_pGameClientShell->GetSFXMgr(); if (!psfxMgr) return; CSpecialFX* pFX = LTNULL; LTFLOAT fRange = g_vtBloodSplatsRange.GetFloat(); // See if we should make some blood splats... ClientIntersectQuery iQuery; IntersectInfo iInfo; iQuery.m_From = m_vPos; LTVector vDir = m_vDir; // Create some blood splats... int nNumSplats = GetRandom((int)g_vtBloodSplatsMinNum.GetFloat(), (int)g_vtBloodSplatsMaxNum.GetFloat()); LTVector vU, vR, vF; g_pLTClient->GetRotationVectors(&m_rDirRot, &vU, &vR, &vF); for (int i=0; i < nNumSplats; i++) { LTVector vDir = m_vDir; // Perturb direction after first splat... if (i > 0) { float fPerturb = g_vtBloodSplatsPerturb.GetFloat(); float fRPerturb = (GetRandom(-fPerturb, fPerturb))/1000.0f; float fUPerturb = (GetRandom(-fPerturb, fPerturb))/1000.0f; vDir += (vR * fRPerturb); vDir += (vU * fUPerturb); } iQuery.m_To = vDir * fRange; iQuery.m_To += m_vPos; iQuery.m_Flags = IGNORE_NONSOLID | INTERSECT_HPOLY; if (g_pLTClient->IntersectSegment(&iQuery, &iInfo) && IsMainWorld(iInfo.m_hObject)) { SurfaceType eType = GetSurfaceType(iInfo); if (eType == ST_SKY || eType == ST_INVISIBLE) { return; // Don't leave blood on the sky } LTBOOL bBigBlood = (LTBOOL)GetConsoleInt("BigBlood", 0); // Create a blood splat... BSCREATESTRUCT sc; g_pLTClient->AlignRotation(&(sc.rRot), &(iInfo.m_Plane.m_Normal), LTNULL); // Randomly rotate the blood splat g_pLTClient->RotateAroundAxis(&(sc.rRot), &(iInfo.m_Plane.m_Normal), GetRandom(0.0f, MATH_CIRCLE)); LTVector vTemp = vDir * -2.0f; sc.vPos = iInfo.m_Point + vTemp; // Off the wall a bit sc.vVel.Init(0.0f, 0.0f, 0.0f); sc.vInitialScale.Init(1.0f, 1.0f, 1.0f); sc.vInitialScale.x = GetRandom(g_vtBloodSplatsMinScale.GetFloat(), g_vtBloodSplatsMaxScale.GetFloat()); if (bBigBlood) sc.vInitialScale.x *= g_vtBigBloodSizeScale.GetFloat(); sc.vInitialScale.y = sc.vInitialScale.x; sc.vFinalScale = sc.vInitialScale; sc.dwFlags = FLAG_VISIBLE | FLAG_ROTATEABLESPRITE | FLAG_NOLIGHT; sc.fLifeTime = GetRandom(g_vtBloodSplatsMinLifetime.GetFloat(), g_vtBloodSplatsMaxLifetime.GetFloat()); if (bBigBlood) sc.fLifeTime *= g_vtBigBloodLifeScale.GetFloat(); sc.fInitialAlpha = 1.0f; sc.fFinalAlpha = 0.0f; sc.nType = OT_SPRITE; sc.bMultiply = LTTRUE; char* pBloodFiles[] = { "Sfx\\Test\\Spr\\BloodL1.spr", "Sfx\\Test\\Spr\\BloodL2.spr", "Sfx\\Test\\Spr\\BloodL3.spr", "Sfx\\Test\\Spr\\BloodL4.spr" }; sc.pFilename = pBloodFiles[GetRandom(0,3)]; pFX = psfxMgr->CreateSFX(SFX_SCALE_ID, &sc); if (pFX) pFX->Update(); } else if (i==0) { // Didn't hit anything straight back, do don't bother to // do anymore... return; } } }