void Explosion::CreateExplosion(DVector *pvPos) { if (!g_pServerDE) return; ObjectCreateStruct ocStruct; INIT_OBJECTCREATESTRUCT(ocStruct); ocStruct.m_Flags = FLAG_VISIBLE; VEC_COPY(ocStruct.m_Pos, *pvPos); // DRotation rRot; // g_pServerDE->GetObjectRotation(m_hObject, &rRot); // ROT_COPY(ocStruct.m_Rotation, rRot); DFLOAT fPitch = g_pServerDE->Random(-MATH_PI, MATH_PI); DFLOAT fYaw = g_pServerDE->Random(-MATH_PI, MATH_PI); DFLOAT fRoll = g_pServerDE->Random(-MATH_PI, MATH_PI); g_pServerDE->SetupEuler(&ocStruct.m_Rotation, fPitch, fYaw, fRoll); if (m_hstrModelName) _mbscpy((unsigned char*)ocStruct.m_Filename, (const unsigned char*)g_pServerDE->GetStringData(m_hstrModelName)); else _mbscpy((unsigned char*)ocStruct.m_Filename, (const unsigned char*)szDefExplosionModel ); if (m_hstrSkinName) _mbscpy((unsigned char*)ocStruct.m_SkinName, (const unsigned char*)g_pServerDE->GetStringData(m_hstrSkinName)); else _mbscpy((unsigned char*)ocStruct.m_SkinName, (const unsigned char*)szDefExplosionSkin ); // Create the explosion model HCLASS hClass = g_pServerDE->GetClass("CModelObject"); if (!hClass) return; CModelObject* pImpact = (CModelObject*)g_pServerDE->CreateObject(hClass, &ocStruct); if (!pImpact) return; // Initialize the object... pImpact->Setup(m_fDuration, &m_vRotation, DFALSE, DTRUE); m_hModel = pImpact->m_hObject; // Gouraud shade and make full bright... DDWORD dwFlags = g_pServerDE->GetObjectFlags(m_hModel); g_pServerDE->SetObjectFlags(m_hModel, dwFlags | FLAG_MODELGOURAUDSHADE | FLAG_NOLIGHT); g_pServerDE->SetObjectColor(m_hModel, 1.0f, 1.0f, 1.0f, 1.0f); if (m_bCreateLight) CreateLight(pvPos); if (m_bCreateShockwave) AddShockwave(pvPos); if (m_bCreateMark) CreateMark(pvPos); if (m_bCreateSmoke) CreateSmoke(pvPos); // CreateFX(pvPos); // Play sound DVector vPos; g_pServerDE->GetObjectPos(m_hObject, &vPos); if ( m_hstrSound ) { char* pSound = g_pServerDE->GetStringData(m_hstrSound); if (pSound) PlaySoundFromPos(&vPos, pSound, m_fSoundRadius, SOUNDPRIORITY_MISC_HIGH ); } }