Ejemplo n.º 1
0
DBOOL CShellCasingFX::CreateObject(CClientDE *pClientDE)
{
	if (!CSpecialFX::CreateObject(pClientDE)) return DFALSE;

	char* pModelName = DNULL;
	char* pSkinName = DNULL;
	if (!GetFileNames(&pModelName, &pSkinName))
		return DFALSE;

	if (!pModelName || !pSkinName) return DFALSE;

	// Setup the shell...

	ObjectCreateStruct createStruct;
	INIT_OBJECTCREATESTRUCT(createStruct);

	createStruct.m_ObjectType = OT_MODEL;
	createStruct.m_Flags = 0;
	_mbscpy((unsigned char*)createStruct.m_Filename, (const unsigned char*)pModelName);
	_mbscpy((unsigned char*)createStruct.m_SkinName, (const unsigned char*)pSkinName);
	VEC_COPY(createStruct.m_Pos, m_vStartPos);
	ROT_COPY(createStruct.m_Rotation, m_rRot);

	m_hObject = pClientDE->CreateObject(&createStruct);
	if (!m_hObject) return DFALSE;


	m_pClientDE->SetObjectScale(m_hObject, &m_vScale);

	DVector vU, vR, vF;
	pClientDE->GetRotationVectors(&m_rRot, &vU, &vR, &vF);

	DVector vVel;

	if(m_bLeftHanded)
		VEC_NEGATE(vR, vR);

	DFLOAT fUpVel = GetRandom(60.0f, 90.0f);
	VEC_MULSCALAR(vU, vU, fUpVel);
	DFLOAT fRightVel = GetRandom(50.0f, 70.0f);
	VEC_MULSCALAR(vR, vR, fRightVel);
	DFLOAT fForwardVel = GetRandom(10.0f, 25.0f);
	VEC_MULSCALAR(vF, vF, fForwardVel);

	VEC_ADD(vVel, vU, vR);
	VEC_ADD(vVel, vVel, vF);

	InitMovingObject(&m_movingObj, &m_vStartPos, &vVel);;
	m_movingObj.m_PhysicsFlags |= MO_HALFGRAVITY;

	m_fExpireTime = 20.0f + m_pClientDE->GetTime();

	// Set the pitch velocity
	m_fPitchVel = GetRandom(-MATH_CIRCLE * 2, MATH_CIRCLE * 2);
	m_fYawVel = GetRandom(-MATH_CIRCLE * 2, MATH_CIRCLE * 2);
	m_fPitch	= m_fYaw = 0.0f;

	return DTRUE;
}
Ejemplo n.º 2
0
LTBOOL CShellCasingFX::CreateObject(ILTClient *pClientDE)
{
    if (!CSpecialFX::CreateObject(pClientDE)) return LTFALSE;

	// Setup the shell...

	AMMO const *pAmmo = g_pWeaponMgr->GetAmmo(m_nAmmoId);
    if (!pAmmo || !pAmmo->pFireFX) return LTFALSE;

	ObjectCreateStruct createStruct;
	INIT_OBJECTCREATESTRUCT(createStruct);

	SAFE_STRCPY(createStruct.m_Filename, pAmmo->pFireFX->szShellModel);
	SAFE_STRCPY(createStruct.m_SkinName, pAmmo->pFireFX->szShellSkin);

	m_vInitialScale = pAmmo->pFireFX->vShellScale;
	m_vFinalScale = (m_vInitialScale * g_vtShellMaxScale.GetFloat());

	createStruct.m_ObjectType = OT_MODEL;
	createStruct.m_Flags = m_dwFlags;
	createStruct.m_Pos = m_vStartPos;
    createStruct.m_Rotation = m_rRot;

	m_hObject = m_pClientDE->CreateObject(&createStruct);
    if (!m_hObject) return LTFALSE;

	m_pClientDE->SetObjectScale(m_hObject, &m_vInitialScale);

	// User camera rotation if not 3rd person ;)

	if (!m_b3rdPerson)
	{
		g_pPlayerMgr->GetCameraRotation(m_rRot);
	}

	m_vStartVel += (m_rRot.Up() * GetRandom(g_vtShellMinUpVelocity.GetFloat(), g_vtShellMaxUpVelocity.GetFloat()));
	m_vStartVel += (m_rRot.Right() * GetRandom(g_vtShellMinRightVelocity.GetFloat(), g_vtShellMaxRightVelocity.GetFloat()));
	m_vStartVel += (m_rRot.Forward() * GetRandom(g_vtShellMinForwardVelocity.GetFloat(), g_vtShellMaxForwardVelocity.GetFloat()));

	InitMovingObject(&m_movingObj, m_vStartPos, m_vStartVel);;

	m_fElapsedTime = 0.0f;
	m_fDieTime = GetRandom(g_vtShellMinLifetime.GetFloat(), g_vtShellMaxLifetime.GetFloat());

	m_fPitchVel = GenerateRandomVelocity();
	m_fYawVel	= GenerateRandomVelocity();

    return LTTRUE;
}
Ejemplo n.º 3
0
LTBOOL CParticleExplosionFX::CreateObject(ILTClient *pClientDE)
{
    LTBOOL bRet = CBaseParticleSystemFX::CreateObject(pClientDE);
    if (!bRet) return bRet;

    // Initialize the emmitters velocity ranges based on our rotation...

    LTVector vVelMin, vVelMax, vTemp, vU, vR, vF;
    VEC_SET(vVelMin, 1.0f, 1.0f, 1.0f);
    VEC_SET(vVelMax, 1.0f, 1.0f, 1.0f);

    m_pClientDE->Common()->GetRotationVectors(m_rSurfaceRot, vU, vR, vF);

    if (vF.y <= -0.95f || vF.y >= 0.95f)
    {
        vF.y = vF.y > 0.0f ? 1.0f : -1.0f;
        VEC_SET(vR, 1.0f, 0.0f, 0.0f);
        VEC_SET(vU, 0.0f, 0.0f, 1.0f);
    }
    else if (vF.x <= -0.95f || vF.x >= 0.95f)
    {
        vF.x = vF.x > 0.0f ? 1.0f : -1.0f;
        VEC_SET(vR, 0.0f, 1.0f, 0.0f);
        VEC_SET(vU, 0.0f, 0.0f, 1.0f);
    }
    else if (vF.z <= -0.95f || vF.z >= 0.95f)
    {
        vF.z = vF.z > 0.0f ? 1.0f : -1.0f;
        VEC_SET(vR, 1.0f, 0.0f, 0.0f);
        VEC_SET(vU, 0.0f, 1.0f, 0.0f);
    }

    VEC_MULSCALAR(vVelMin, vF, m_vMinVel.y);
    VEC_MULSCALAR(vVelMax, vF, m_vMaxVel.y);

    VEC_MULSCALAR(vTemp, vR, m_vMinVel.x);
    VEC_ADD(vVelMin, vVelMin, vTemp);

    VEC_MULSCALAR(vTemp, vR, m_vMaxVel.x);
    VEC_ADD(vVelMax, vVelMax, vTemp);

    VEC_MULSCALAR(vTemp, vU, m_vMinVel.z);
    VEC_ADD(vVelMin, vVelMin, vTemp);

    VEC_MULSCALAR(vTemp, vU, m_vMaxVel.z);
    VEC_ADD(vVelMax, vVelMax, vTemp);


    // Initialize our emmitters...

    LTVector vStartVel;
    for (int i=0; i < m_nNumEmmitters; i++)
    {
        if (m_bCreateDebris)
        {
            m_hDebris[i] = CreateDebris();
        }

        m_ActiveEmmitters[i] = LTTRUE;
        m_BounceCount[i] = 2;

        VEC_SET(vStartVel, GetRandom(vVelMin.x, vVelMax.x),
                GetRandom(vVelMin.y, vVelMax.y),
                GetRandom(vVelMin.z, vVelMax.z));

        InitMovingObject(&(m_Emmitters[i]), &m_vPos, &vStartVel);
        m_Emmitters[i].m_PhysicsFlags |= m_nEmmitterFlags;
    }

    return bRet;
}
Ejemplo n.º 4
0
LTBOOL CGibFX::CreateObject(ILTClient *pClientDE)
{
    LTBOOL bRet = CSpecialFX::CreateObject(pClientDE);
	if (!bRet) return bRet;

	// Initialize the Gib velocity ranges based on our rotation...

    LTVector vVelMin, vVelMax, vTemp, vU, vR, vF;
	VEC_SET(vVelMin, 1.0f, 1.0f, 1.0f);
	VEC_SET(vVelMax, 1.0f, 1.0f, 1.0f);

	m_pClientDE->GetRotationVectors(&m_rRot, &vU, &vR, &vF);

	if (vF.y <= -0.95f || vF.y >= 0.95f)
	{
		vF.y = vF.y > 0.0f ? 1.0f : -1.0f;
		VEC_SET(vR, 1.0f, 0.0f, 0.0f);
		VEC_SET(vU, 0.0f, 0.0f, 1.0f);
	}
	else if (vF.x <= -0.95f || vF.x >= 0.95f)
	{
		vF.x = vF.x > 0.0f ? 1.0f : -1.0f;
		VEC_SET(vR, 0.0f, 1.0f, 0.0f);
		VEC_SET(vU, 0.0f, 0.0f, 1.0f);
	}
	else if (vF.z <= -0.95f || vF.z >= 0.95f)
	{
		vF.z = vF.z > 0.0f ? 1.0f : -1.0f;
		VEC_SET(vR, 1.0f, 0.0f, 0.0f);
		VEC_SET(vU, 0.0f, 1.0f, 0.0f);
	}

	VEC_MULSCALAR(vVelMin, vF, m_vMinVel.y);
	VEC_MULSCALAR(vVelMax, vF, m_vMaxVel.y);

	VEC_MULSCALAR(vTemp, vR, m_vMinVel.x);
	VEC_ADD(vVelMin, vVelMin, vTemp);

	VEC_MULSCALAR(vTemp, vR, m_vMaxVel.x);
	VEC_ADD(vVelMax, vVelMax, vTemp);

	VEC_MULSCALAR(vTemp, vU, m_vMinVel.z);
	VEC_ADD(vVelMin, vVelMin, vTemp);

	VEC_MULSCALAR(vTemp, vU, m_vMaxVel.z);
	VEC_ADD(vVelMax, vVelMax, vTemp);


	// Initialize our emitters...

    LTVector vVel;
	for (int i=0; i < m_nNumGibs; i++)
	{
		if (i < m_nNumGibs - m_nNumRandomGibs)
		{
			m_hGib[i] = CreateGib(m_eGibTypes[i]);
		}
		else
		{
			m_hGib[i] = CreateRandomGib();
		}

		m_fGibLife[i] = GetRandom(m_fLifeTime, m_fLifeTime * 2.0f);

		m_pGibTrail[i] = CreateGibTrail(m_hGib[i]);

        m_ActiveEmitters[i] = LTTRUE;
		m_BounceCount[i]	 = GetRandom(2, 5);

		VEC_SET(vVel, GetRandom(vVelMin.x, vVelMax.x),
					  50.0f + GetRandom(vVelMin.y, vVelMax.y),
					  GetRandom(vVelMin.z, vVelMax.z));

		InitMovingObject(&(m_Emitters[i]), &m_vPos, &vVel);
		m_Emitters[i].m_dwPhysicsFlags |= m_nGibFlags;
	}


	// Create a big burst of blood...

	if ( m_eModelType == eModelTypeHuman )
	{
		//CreateBloodSpray();
	}


	// Play die sound...

	char* pSound = GetGibDieSound();
	if (pSound)
	{
		g_pClientSoundMgr->PlaySoundFromPos(m_vPos, pSound, 1000.0f,
			SOUNDPRIORITY_MISC_LOW);
	}


	return bRet;
}