void CDestructibleModel::SetSurfaceType( HSURFACE hSurfaceOverride ) { uint32 dwSurfUsrFlgs = 0; SurfaceType eSurfType = ST_UNKNOWN; // See if this object is a world model... if (GetObjectType(m_hObject) == OT_WORLDMODEL) { // See if we have a surface override... if( hSurfaceOverride && g_pSurfaceDB->GetSurfaceType(hSurfaceOverride) != ST_UNKNOWN) { eSurfType = g_pSurfaceDB->GetSurfaceType(hSurfaceOverride); } } dwSurfUsrFlgs = SurfaceToUserFlag(eSurfType); g_pCommonLT->SetObjectFlags(m_hObject, OFT_User, dwSurfUsrFlgs, USRFLG_SURFACEMASK); g_pCommonLT->GetObjectFlags(m_hObject, OFT_Flags, m_dwOriginalFlags); }
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); }
void CDestructibleModel::SetSurfaceType() { uint32 dwSurfUsrFlgs = 0; SurfaceType eSurfType = ST_UNKNOWN; // See if this object is a world model... if (GetObjectType(m_hObject) == OT_WORLDMODEL) { LTBOOL bDoBruteForce = LTTRUE; // See if we have a surface override... if (m_hstrSurfaceOverride) { const char* pSurfName = g_pLTServer->GetStringData(m_hstrSurfaceOverride); if (pSurfName) { SURFACE* pSurf = g_pSurfaceMgr->GetSurface(pSurfName); if (pSurf && pSurf->eType != ST_UNKNOWN) { eSurfType = pSurf->eType; bDoBruteForce = LTFALSE; } } } // Determine our surface...the hard way... if (bDoBruteForce) { IntersectQuery qInfo; IntersectInfo iInfo; LTVector vPos, vDims; LTRotation rRot; g_pLTServer->GetObjectPos(m_hObject, &vPos); g_pLTServer->GetObjectRotation(m_hObject, &rRot); g_pPhysicsLT->GetObjectDims(m_hObject, &vDims); LTFLOAT fMaxDims = vDims.x; fMaxDims = Max(fMaxDims, vDims.y); fMaxDims = Max(fMaxDims, vDims.z); qInfo.m_From = vPos + (rRot.Forward() * (fMaxDims + 1)); qInfo.m_To = vPos; qInfo.m_Flags = INTERSECT_OBJECTS | IGNORE_NONSOLID | INTERSECT_HPOLY; SurfaceType eType = ST_UNKNOWN; if (g_pLTServer->IntersectSegment(&qInfo, &iInfo)) { if (iInfo.m_hObject == m_hObject) { eSurfType = GetSurfaceType(iInfo); } } } } else { DEBRIS* pDebris = g_pDebrisMgr->GetDebris(m_nDebrisId); if (pDebris) { eSurfType = pDebris->eSurfaceType; } } dwSurfUsrFlgs = SurfaceToUserFlag(eSurfType); g_pCommonLT->SetObjectFlags(m_hObject, OFT_User, dwSurfUsrFlgs, dwSurfUsrFlgs); g_pCommonLT->GetObjectFlags(m_hObject, OFT_Flags, m_dwOriginalFlags); }
void AI_Helicopter::InitialUpdate() { CAIVehicle::InitialUpdate(); // Turn off gravity uint32 dwFlags = g_pLTServer->GetObjectFlags(m_hObject); if ( !(dwFlags & FLAG_GRAVITY) ) { m_dwFlags &= ~FLAG_GRAVITY; } m_damage.SetNeverDestroy(LTTRUE); g_pLTServer->SetObjectUserFlags(m_hObject, g_pLTServer->GetObjectUserFlags(m_hObject) | SurfaceToUserFlag((SurfaceType)20) ); }