示例#1
0
LTBOOL SecurityCamera::InitialUpdate()
{
    SetNextUpdate(UPDATE_NEXT_FRAME);

	g_pLTServer->GetObjectPos(m_hObject, &m_vPos);

	// Create the light...

	CreateLight();
	
	// Setup the damage types that affect us...

	DamageFlags nCanDamageFlags = 0;
	m_damage.SetCantDamageFlags( ~nCanDamageFlags );

	nCanDamageFlags = DamageTypeToFlag( DT_BULLET ) | DamageTypeToFlag( DT_EXPLODE );
	m_damage.ClearCantDamageFlags( nCanDamageFlags );

    return LTTRUE;
}
CProjectile::CProjectile() : GameBase(OT_MODEL)
{
	AddAggregate(&m_damage);

    m_hObject               = LTNULL;
	m_fVelocity				= 0.0f;
	m_fInstDamage			= 0.0f;
	m_fProgDamage			= 0.0f;
	m_fMass					= INFINITE_MASS; //0.0f;
	m_fLifeTime				= 5.0f;
	m_fRange				= 10000.0f;
    m_bSilenced             = LTFALSE;

	m_vDims.Init(1.0f, 1.0f, 1.0f);
	m_vFirePos.Init();
	m_vFlashPos.Init();

    m_hFiredFrom            = LTNULL;
	m_eInstDamageType		= DT_BULLET;
	m_eProgDamageType		= DT_UNSPECIFIED;
	m_nWeaponId				= 0;
	m_nAmmoId				= 0;

	m_fStartTime			= 0.0f;
    m_bObjectRemoved        = LTFALSE;

    m_bDetonated            = LTFALSE;

	m_dwFlags = FLAG_FORCECLIENTUPDATE | FLAG_POINTCOLLIDE | FLAG_NOSLIDING |
		FLAG_TOUCH_NOTIFY | FLAG_NOLIGHT | FLAG_RAYHIT;

	// Make sure we can't be damaged by any of the progressive/volumebrush
	// damage types...
	m_dwCantDamageTypes		= (DamageTypeToFlag(DT_STUN) | DamageTypeToFlag(DT_SLEEPING) |
		DamageTypeToFlag(DT_BURN) | DamageTypeToFlag(DT_FREEZE) | DamageTypeToFlag(DT_ELECTROCUTE) |
		DamageTypeToFlag(DT_POISON) | DamageTypeToFlag(DT_ENDLESS_FALL));

    m_pAmmoData         = LTNULL;
    m_pWeaponData       = LTNULL;

	m_bProcessInvImpact = LTFALSE;
	m_vInvisVel.Init();
	m_vInvisNewPos.Init();

	m_bNumCallsToAddImpact = 0;
}
void Body::Init(const BODYINITSTRUCT& bi)
{
	if (!bi.pCharacter || !bi.pCharacter->m_hObject) return;

	// Get the death type etc

	m_eDeathType		= bi.pCharacter->GetDeathType();
	m_eModelId			= bi.pCharacter->GetModelId();
	m_eModelSkeleton    = bi.pCharacter->GetModelSkeleton();
	m_eModelStyle		= bi.pCharacter->GetModelStyle();

	// Get the body lifetime

	m_fLifetime		= bi.fLifetime;

	// Create the SFX

	BODYCREATESTRUCT bcs;
	bcs.eBodyState = bi.eBodyState;
	if (IsPlayer(bi.pCharacter->m_hObject))
	{
		CPlayerObj* pPlayer = (CPlayerObj*) bi.pCharacter;
		bcs.nClientId = (uint8) g_pLTServer->GetClientID(pPlayer->GetClient());
	}

    HMESSAGEWRITE hMessage = g_pLTServer->StartSpecialEffectMessage(this);
    g_pLTServer->WriteToMessageByte(hMessage, SFX_BODY_ID);
    bcs.Write(g_pLTServer, hMessage);
    g_pLTServer->EndMessage(hMessage);


	// Create the death scene

	CreateDeathScene(bi.pCharacter);

	// We'll handle creating the necessary debris...

	m_damage.m_bCreatedDebris = LTTRUE;

	m_damage.SetCanDamage(LTFALSE);//bi.pCharacter->CanDamageBody());
	m_damage.SetApplyDamagePhysics(LTFALSE);//bi.pCharacter->CanDamageBody());
	m_damage.SetMass(g_pModelButeMgr->GetModelMass(m_eModelId));

	// Let us get hit by decay powder

	m_damage.ClearCantDamageTypes(DamageTypeToFlag(DT_GADGET_DECAYPOWDER));

	switch ( g_pModelButeMgr->GetModelType(m_eModelId) )
	{
		case eModelTypeVehicle:
		{
			m_eDeathType = CD_GIB;
		}
		break;
	}

	CDestructible* pDest = bi.pCharacter->GetDestructible();
	if (pDest)
	{
		m_eDamageType = pDest->GetDeathType();
		VEC_COPY(m_vDeathDir, pDest->GetDeathDir());
		VEC_NORM(m_vDeathDir);
		VEC_MULSCALAR(m_vDeathDir, m_vDeathDir, 1.0f + (pDest->GetDeathDamage() / pDest->GetMaxHitPoints()));
	}

	LTFLOAT fHitPts = pDest->GetMaxHitPoints();
	m_damage.Reset(fHitPts, 0.0f);
	m_damage.SetHitPoints(fHitPts);
	m_damage.SetMaxHitPoints(fHitPts);
	m_damage.SetArmorPoints(0.0f);
	m_damage.SetMaxArmorPoints(0.0f);

	// Copy our user flags over, setting our surface type to flesh

    uint32 dwUsrFlags = g_pLTServer->GetObjectUserFlags(m_hObject) | USRFLG_NIGHT_INFRARED;
	dwUsrFlags |= SurfaceToUserFlag(ST_FLESH);
    g_pLTServer->SetObjectUserFlags(m_hObject, dwUsrFlags);

	// Make sure model doesn't slide all over the place...

    g_pLTServer->SetFrictionCoefficient(m_hObject, 500.0f);

	LTVector vDims;
    g_pLTServer->GetObjectDims(bi.pCharacter->m_hObject, &vDims);

	// Set the dims.  If we can't set the dims that big, set them
	// as big as possible...

    if (g_pLTServer->SetObjectDims2(m_hObject, &vDims) == LT_ERROR)
	{
        g_pLTServer->SetObjectDims2(m_hObject, &vDims);
	}


	// Create the box used for weapon impact detection...

	CreateHitBox(bi);


	LTFLOAT r, g, b, a;
    g_pLTServer->GetObjectColor(bi.pCharacter->m_hObject, &r, &g, &b, &a);
    g_pLTServer->SetObjectColor(m_hObject, r, g, b, a);

	LTVector vScale;
    g_pLTServer->GetObjectScale(bi.pCharacter->m_hObject, &vScale);
    g_pLTServer->ScaleObject(m_hObject, &vScale);

	// Copy our animation over

    HMODELANIM hAni = g_pLTServer->GetModelAnimation(bi.pCharacter->m_hObject);
    g_pLTServer->SetModelAnimation(m_hObject, hAni);
    g_pLTServer->SetModelLooping(m_hObject, LTFALSE);

	// Copy the flags from the character to us

	uint32 dwFlags = g_pLTServer->GetObjectFlags(bi.pCharacter->m_hObject);
	m_dwFlags |= FLAG_REMOVEIFOUTSIDE;
    g_pLTServer->SetObjectFlags(m_hObject, dwFlags);

	// Move the attachments aggregate from the char to us...

	if (!m_pAttachments && bi.eBodyState != eBodyStateLaser)
	{
		m_hWeaponItem = bi.pCharacter->TransferWeapon(m_hObject);

		// Make sure we're playing the correct ani...

		if (m_hWeaponItem)
		{
			uint32 dwAni = g_pLTServer->GetAnimIndex(m_hWeaponItem, "Hand");
		 	if (dwAni != INVALID_ANI)
			{
				g_pLTServer->SetModelAnimation(m_hWeaponItem, dwAni);
				g_pLTServer->SetModelLooping(m_hWeaponItem, LTFALSE);
			}
		}
	}

	if (!m_pAttachments)
	{
		m_pAttachments = bi.pCharacter->TransferAttachments();

		if (m_pAttachments)
		{
			AddAggregate(m_pAttachments);
			m_pAttachments->ReInit(m_hObject);
		}
	}

	// Set up the spears

	bi.pCharacter->TransferSpears(this);

	// Set our state

	SetState(bi.eBodyState);
}
示例#4
0
文件: Lock.cpp 项目: Arc0re/lithtech
LTBOOL Lock::InitialUpdate()
{
    SetNextUpdate(0.0);

	// Setup up our destructible object...

	m_damage.SetHitPoints(m_fUnlockHitPts);

    uint32 dwCanDamageTypes = 0;

	// Set it up so nothing can damage us...

	m_damage.SetCantDamageTypes(~dwCanDamageTypes);

	// See if we are affected by the welder or the lockpick...

	if (m_bWeldable)
	{
		m_dwUsrFlgs	|= USRFLG_GADGET_WELDER;

		dwCanDamageTypes = (DamageTypeToFlag(DT_GADGET_WELDER) |
			DamageTypeToFlag(DT_EXPLODE) | DamageTypeToFlag(DT_BULLET) |
			DamageTypeToFlag(DT_BURN));
	}
	else if (m_bLightable)
	{
		m_dwUsrFlgs	|= USRFLG_GADGET_LIGHTER;

		dwCanDamageTypes |= (DamageTypeToFlag(DT_GADGET_LIGHTER) |
			DamageTypeToFlag(DT_EXPLODE) | DamageTypeToFlag(DT_BULLET) |
			DamageTypeToFlag(DT_BURN));
	}
	else // Lockpick
	{
		m_dwUsrFlgs	|= USRFLG_GADGET_LOCK_PICK;

		dwCanDamageTypes |= (DamageTypeToFlag(DT_GADGET_LOCK_PICK) |
			DamageTypeToFlag(DT_EXPLODE) | DamageTypeToFlag(DT_BULLET) |
			DamageTypeToFlag(DT_BURN));
	}

	// Okay, now clear the types we want to damage us...

	m_damage.ClearCantDamageTypes(dwCanDamageTypes);


	// Make sure we can be activated even if we are non-solid...

    uint32 dwFlags = g_pLTServer->GetObjectFlags(m_hObject);
    g_pLTServer->SetObjectFlags(m_hObject, dwFlags | FLAG_RAYHIT);

    return LTTRUE;
}