LTBOOL CProjectile::TestInsideObject(HOBJECT hTestObj, AmmoType eAmmoType) { if (!hTestObj) return LTFALSE; // TO DO??? // NOTE: This code may need to be updated to use test the dims // of the CharacterHitBox instead of the dims of the object... // TO DO??? // See if we are inside the test object... LTVector vTestPos, vTestDims; g_pLTServer->GetObjectPos(hTestObj, &vTestPos); g_pLTServer->GetObjectDims(hTestObj, &vTestDims); if (m_vFirePos.x < vTestPos.x - vTestDims.x || m_vFirePos.x > vTestPos.x + vTestDims.x || m_vFirePos.y < vTestPos.y - vTestDims.y || m_vFirePos.y > vTestPos.y + vTestDims.y || m_vFirePos.z < vTestPos.z - vTestDims.z || m_vFirePos.z > vTestPos.z + vTestDims.z) { return LTFALSE; } // We're inside the object, so we automatically hit the object... if (eAmmoType == PROJECTILE) { Detonate(hTestObj); } else { if (eAmmoType == VECTOR) { if (IsCharacter(hTestObj)) { CCharacter *pChar = (CCharacter*) g_pLTServer->HandleToObject(hTestObj); if (!pChar) return LTFALSE; ModelNode eModelNode = g_pModelButeMgr->GetSkeletonDefaultHitNode(pChar->GetModelSkeleton()); pChar->SetModelNodeLastHit(eModelNode); m_fInstDamage *= pChar->ComputeDamageModifier(eModelNode); } ImpactDamageObject(m_hFiredFrom, hTestObj); } LTVector vNormal(0, 1, 0); AddImpact(hTestObj, m_vFlashPos, vTestPos, vNormal, GetSurfaceType(hTestObj)); } RemoveObject(); return LTTRUE; }
void CProjectile::ImpactDamageObject(HOBJECT hDamager, HOBJECT hObj) { DamageStruct damage; damage.hDamager = hDamager; damage.vDir = m_vDir; // Do Instant damage... if (m_fInstDamage > 0.0f) { damage.eType = m_eInstDamageType; damage.fDamage = m_fInstDamage; damage.DoDamage(this, hObj); } // Do Progressive damage...(if the progressive damage is supposed to // happen over time, it will be done in the explosion object).... if (m_fProgDamage > 0.0f && m_pAmmoData->fProgDamageLifetime <= 0.0f) { damage.eType = m_eProgDamageType; damage.fDamage = m_fProgDamage; damage.fDuration = m_pAmmoData->fProgDamageDuration; damage.DoDamage(this, hObj); } // Update player summary info... CPlayerObj* pPlayer; if (IsPlayer(hDamager) && IsCharacter(hObj) && IsAccuracyType(m_eInstDamageType)) { CCharacter* pChar = (CCharacter*) g_pLTServer->HandleToObject(hObj); pPlayer = (CPlayerObj*) g_pLTServer->HandleToObject(hDamager); if (pPlayer) { ModelNode eModelNode = pChar->GetModelNodeLastHit(); if (eModelNode != eModelNodeInvalid) { HitLocation eLoc = g_pModelButeMgr->GetSkeletonNodeLocation(pChar->GetModelSkeleton(),eModelNode); pPlayer->GetPlayerSummaryMgr()->IncNumHits(eLoc); } else { pPlayer->GetPlayerSummaryMgr()->IncNumHits(HL_UNKNOWN); } } } if (IsPlayer(hObj)) { pPlayer = (CPlayerObj*) g_pLTServer->HandleToObject(hObj); if (pPlayer) { pPlayer->GetPlayerSummaryMgr()->IncNumTimesHit(); } } }