LTBOOL CPropTypeMgr::Init(const char* szAttributeFile) { if (g_pPropTypeMgr || !szAttributeFile) return LTFALSE; if (!Parse(szAttributeFile)) return LTFALSE; g_pPropTypeMgr = this; // Read in the properties for each prop type record... int nNum = 0; sprintf(s_aTagName, "%s%d", PTMGR_TAG, nNum); while (m_buteMgr.Exist(s_aTagName)) { PROPTYPE* pPropType = debug_new(PROPTYPE); if (pPropType && pPropType->Init(m_buteMgr, s_aTagName, nNum)) { pPropType->nId = nNum; m_PropTypeList.AddTail(pPropType); } else { debug_delete(pPropType); return LTFALSE; } nNum++; sprintf(s_aTagName, "%s%d", PTMGR_TAG, nNum); } return LTTRUE; }
bool PropType::ReadProp(ObjectCreateStruct *pData) { if (!pData) return false; // Type GenericProp genProp; if (g_pLTServer->GetPropGeneric("Type", &genProp) == LT_OK) { if (genProp.m_String[0]) { m_sPropType = genProp.m_String; } } // Model PROPTYPE* pPropType = g_pPropTypeMgr->GetPropType(( char* )m_sPropType.c_str( )); if (!pPropType || pPropType->sFilename.empty( )) return false; pPropType->SetupModel( pData ); return true; }
void PickupItem::CheckForOverrideModel(ObjectCreateStruct *pStruct) { // See if we have an override model prop-type, if so get the model // information and set it in pStruct if (!m_hstrModelOverride) return; const char* pName = g_pLTServer->GetStringData(m_hstrModelOverride); if (pName) { PROPTYPE* pPropType = g_pPropTypeMgr->GetPropType((char*)pName); if (pPropType && !pPropType->sFilename.empty()) { pPropType->SetupModel(pStruct); } } }
bool PropType::Setup( ) { PROPTYPE* pPropType = g_pPropTypeMgr->GetPropType(( char* )m_sPropType.c_str( )); if( !pPropType ) return false; ObjectCreateStruct ocs; pPropType->SetupModel( &ocs ); // Disturbance PROP_DISTURB* pDisturb = pPropType->pDisturb; if(pDisturb != LTNULL) { if(m_pDisturb == LTNULL) { m_pDisturb = debug_new(PropDisturbStruct); m_dwFlags |= FLAG_TOUCH_NOTIFY; } if ( !pDisturb->sTouchSound.empty( )) { m_pDisturb->sTouchSoundName = pDisturb->sTouchSound; } m_pDisturb->pPD = pDisturb; m_damage.SetDestroyedStimulus(pDisturb->fStimRadius, pDisturb->nDestroyAlarmLevel); } m_vObjectColor = pPropType->vObjectColor; m_bMoveToFloor = pPropType->bMoveToFloor; m_fAlpha = pPropType->fAlpha; // Only use the prop type scale if the scale wasn't set in DEdit... if (m_vScale.x == 1.0 && m_vScale.y == 1.0 && m_vScale.z == 1.0) { m_vScale = pPropType->vScale; } m_dwFlags = (pPropType->bVisible ? (m_dwFlags | FLAG_VISIBLE) : (m_dwFlags & ~FLAG_VISIBLE)); m_dwFlags = (pPropType->bSolid ? (m_dwFlags | FLAG_SOLID) : (m_dwFlags & ~FLAG_SOLID)); m_dwFlags = (pPropType->bGravity ? (m_dwFlags | FLAG_GRAVITY) : (m_dwFlags & ~FLAG_GRAVITY)); m_dwFlags = (pPropType->bShadow ? (m_dwFlags | FLAG_SHADOW) : (m_dwFlags & ~FLAG_SHADOW)); if (pPropType->bRayHit) { // Set touch notify so projectiles can impact with us... m_dwFlags |= FLAG_TOUCH_NOTIFY; m_dwFlags |= FLAG_RAYHIT; } else { m_dwFlags &= ~FLAG_TOUCH_NOTIFY; m_dwFlags &= ~FLAG_RAYHIT; } if(pPropType->bActivateable) { m_dwUsrFlgs |= USRFLG_CAN_ACTIVATE; // Since we are activateable try and set our activate type... if( !pPropType->sActivateType.empty() ) { m_ActivateTypeHandler.SetActivateType( pPropType->sActivateType.c_str() ); } } m_bTouchable = pPropType->bTouchable; m_damage.SetArmorPoints(0.0f); m_damage.SetMaxArmorPoints(0.0f); m_damage.SetCanHeal(LTFALSE); m_damage.SetCanRepair(LTFALSE); m_damage.SetApplyDamagePhysics(LTFALSE); m_damage.m_bRemoveOnDeath = LTFALSE; if (pPropType->nHitPoints >= 0) { m_damage.SetMaxHitPoints((LTFLOAT)pPropType->nHitPoints); m_damage.SetHitPoints((LTFLOAT)pPropType->nHitPoints); } else { m_damage.SetMaxHitPoints(1.0f); m_damage.SetHitPoints(1.0f); m_damage.SetNeverDestroy( LTTRUE ); } // Set the debris type... if (!pPropType->sDebrisType.empty( )) { DEBRIS* pDebris = g_pDebrisMgr->GetDebris(pPropType->sDebrisType.c_str( )); if (pDebris) { m_damage.m_nDebrisId = pDebris->nId; } } if( LT_OK != g_pCommonLT->SetObjectFilenames(m_hObject, &ocs)) return false; // Let the prop do some setup. if( !Prop::Setup( )) return false; return true; }