void CBeam::OnWriteToStream (IWriteStream *pStream) // OnWriteToStream // // Write the object's data to stream // // CString CWeaponFireDesc UNID // DWORD m_iBonus // DWORD m_iCause // DWORD m_iRotation // Vector m_vPaintTo // DWORD m_iTick // DWORD m_iLifeLeft // DWORD m_Source (CSpaceObject Ref) // DWORD m_pSovereign (UNID) // DWORD m_pHit (CSpaceObject Ref) // DWORD m_iHitDir { DWORD dwSave; m_pDesc->m_sUNID.WriteToStream(pStream); pStream->Write((char *)&m_iBonus, sizeof(DWORD)); dwSave = m_iCause; pStream->Write((char *)&dwSave, sizeof(DWORD)); pStream->Write((char *)&m_iRotation, sizeof(DWORD)); pStream->Write((char *)&m_vPaintTo, sizeof(m_vPaintTo)); pStream->Write((char *)&m_iTick, sizeof(DWORD)); pStream->Write((char *)&m_iLifeLeft, sizeof(m_iLifeLeft)); m_Source.WriteToStream(GetSystem(), pStream); GetSystem()->WriteSovereignRefToStream(m_pSovereign, pStream); WriteObjRefToStream(m_pHit, pStream); pStream->Write((char *)&m_iHitDir, sizeof(DWORD)); }
void CParticleDamage::OnWriteToStream (IWriteStream *pStream) // OnWriteToStream // // Write out to stream // // CString CWeaponFireDesc UNID // DWORD m_iLifeLeft // DWORD m_Source (CSpaceObject ref) // DWORD m_pSovereign (CSovereign ref) // DWORD m_iTick // DWORD m_iDamage // // CVector m_vEmitSourcePos // CVector m_vEmitSourceVel // DWORD m_iEmitDirection // DWORD m_iEmitTime // DWORD m_iParticleCount // IEffectPainter // CParticleArray // // CSpaceObject m_pTarget // // CItemEnhancementStack m_pEnhancements { DWORD dwSave; m_pDesc->m_sUNID.WriteToStream(pStream); dwSave = m_iCause; pStream->Write((char *)&dwSave, sizeof(DWORD)); pStream->Write((char *)&m_iLifeLeft, sizeof(m_iLifeLeft)); m_Source.WriteToStream(GetSystem(), pStream); GetSystem()->WriteSovereignRefToStream(m_pSovereign, pStream); pStream->Write((char *)&m_iTick, sizeof(m_iTick)); pStream->Write((char *)&m_iDamage, sizeof(m_iDamage)); pStream->Write((char *)&m_vEmitSourcePos, sizeof(CVector)); pStream->Write((char *)&m_vEmitSourceVel, sizeof(CVector)); pStream->Write((char *)&m_iEmitDirection, sizeof(DWORD)); pStream->Write((char *)&m_iEmitTime, sizeof(DWORD)); pStream->Write((char *)&m_iParticleCount, sizeof(DWORD)); CEffectCreator::WritePainterToStream(pStream, m_pPainter); m_Particles.WriteToStream(pStream); WriteObjRefToStream(m_pTarget, pStream); // Enhancements CItemEnhancementStack::WriteToStream(m_pEnhancements, pStream); }
void CMissile::OnWriteToStream (IWriteStream *pStream) // OnWriteToStream // // Write the object's data to stream // // CString CWeaponFireDesc UNID // DWORD m_iBonus // DWORD m_iCause // DWORD m_iHitPoints // DWORD m_iLifeLeft // DWORD m_Source (CSpaceObject ref) // DWORD m_pSovereign (CSovereign ref) // DWORD m_pHit (CSpaceObject ref) // Vector m_vHitPos // DWORD m_iHitDir // DWORD m_iRotation // DWORD m_pTarget (CSpaceObject ref) // DWORD m_iTick // // IEffectPainter m_pPainter // // DWORD Number of exhaust particles // Vector exhaust: vPos // Vector exhaust: vVel // // DWORD flags // DWORD Number of saved rotations // DWORD rotation[] { DWORD dwSave; m_pDesc->m_sUNID.WriteToStream(pStream); pStream->Write((char *)&m_iBonus, sizeof(m_iBonus)); dwSave = m_iCause; pStream->Write((char *)&dwSave, sizeof(DWORD)); pStream->Write((char *)&m_iHitPoints, sizeof(DWORD)); pStream->Write((char *)&m_iLifeLeft, sizeof(DWORD)); m_Source.WriteToStream(GetSystem(), pStream); GetSystem()->WriteSovereignRefToStream(m_pSovereign, pStream); WriteObjRefToStream(m_pHit, pStream); pStream->Write((char *)&m_vHitPos, sizeof(m_vHitPos)); pStream->Write((char *)&m_iHitDir, sizeof(DWORD)); pStream->Write((char *)&m_iRotation, sizeof(DWORD)); WriteObjRefToStream(m_pTarget, pStream); pStream->Write((char *)&m_iTick, sizeof(DWORD)); // Write effect CEffectCreator::WritePainterToStream(pStream, m_pPainter); // Exhaust if (m_pExhaust) { dwSave = m_pExhaust->GetCount(); pStream->Write((char *)&dwSave, sizeof(DWORD)); for (int i = 0; i < (int)dwSave; i++) { SExhaustParticle &Particle = m_pExhaust->GetAt(i); pStream->Write((char *)&Particle.vPos, sizeof(Particle.vPos)); pStream->Write((char *)&Particle.vVel, sizeof(Particle.vVel)); } } else { dwSave = 0; pStream->Write((char *)&dwSave, sizeof(DWORD)); } // Flags dwSave = 0; dwSave |= (m_fDestroyed ? 0x00000001 : 0); dwSave |= (m_fReflection ? 0x00000002 : 0); dwSave |= (m_fDetonate ? 0x00000004 : 0); dwSave |= (m_fPassthrough ? 0x00000008 : 0); pStream->Write((char *)&dwSave, sizeof(DWORD)); // Saved rotations pStream->Write((char *)&m_iSavedRotationsCount, sizeof(DWORD)); if (m_iSavedRotationsCount) pStream->Write((char *)m_pSavedRotations, sizeof(DWORD) * m_iSavedRotationsCount); }
void CParticleEffect::OnWriteToStream (IWriteStream *pStream) // OnWriteToStream // // Write the object's data to stream // // CString m_sName // DWORD m_pAnchor (CSpaceObject ref) // // DWORD type: iPaintStyle (or 0xffffffff if no more groups) // Image type: Image // DWORD type: wColor // DWORD type: iRegenerationTimer // DWORD type: iLifespan // Metric type: rAveSpeed // DWORD type: iDirection // DWORD type: iDirRange // Metric type: rRadius // Metric type: rHoleRadius // Metric type: rDampening // DamageDesc type: Damage // DWORD type: flags // // DWORD array: iAlive // // DWORD particle: iDestiny // DWORD particle: iLifeLeft // Vector particle: vPos // Vector particle: vVel { DWORD dwSave; m_sName.WriteToStream(pStream); WriteObjRefToStream(m_pAnchor, pStream); // Save each group SParticleArray *pGroup = m_pFirstGroup; while (pGroup) { SParticleType *pType = pGroup->pType; // Save the type information pStream->Write((char *)&pType->iPaintStyle, sizeof(DWORD)); pType->Image.WriteToStream(pStream); dwSave = pType->wColor; pStream->Write((char *)&dwSave, sizeof(DWORD)); pStream->Write((char *)&pType->iRegenerationTimer, sizeof(DWORD)); pStream->Write((char *)&pType->iLifespan, sizeof(DWORD)); pStream->Write((char *)&pType->rAveSpeed, sizeof(Metric)); pStream->Write((char *)&pType->iDirection, sizeof(DWORD)); pStream->Write((char *)&pType->iDirRange, sizeof(DWORD)); pStream->Write((char *)&pType->rRadius, sizeof(Metric)); pStream->Write((char *)&pType->rHoleRadius, sizeof(Metric)); pStream->Write((char *)&pType->rDampening, sizeof(Metric)); if (pType->pDamageDesc) pType->pDamageDesc->m_Damage.WriteToStream(pStream); else { DamageDesc Dummy; Dummy.WriteToStream(pStream); } DWORD dwSave = 0; dwSave |= (pType->m_fMaxRadius ? 0x00000001 : 0); dwSave |= (pType->m_fLifespan ? 0x00000002 : 0); dwSave |= (pType->m_fWake ? 0x00000004 : 0); dwSave |= (pType->m_fRegenerate ? 0x00000008 : 0); dwSave |= (pType->m_fDrag ? 0x00000010 : 0); dwSave |= (pType->pDamageDesc ? 0x00000020 : 0); pStream->Write((char *)&dwSave, sizeof(DWORD)); // Save the array of particles pStream->Write((char *)&pGroup->iAlive, sizeof(DWORD)); int iCount = pGroup->iAlive; SParticle *pParticle = pGroup->pParticles; SParticle *pEnd = pParticle + pGroup->iCount; while (pParticle < pEnd) { if (pParticle->IsValid()) { pStream->Write((char *)&pParticle->iDestiny, sizeof(DWORD)); pStream->Write((char *)&pParticle->iLifeLeft, sizeof(DWORD)); pStream->Write((char *)&pParticle->vPos, sizeof(CVector)); pStream->Write((char *)&pParticle->vVel, sizeof(CVector)); iCount--; } pParticle++; } // iAlive better match the actual count ASSERT(iCount == 0); pGroup = pGroup->pNext; } // Mark the end with 0xffffffff dwSave = 0xffffffff; pStream->Write((char *)&dwSave, sizeof(DWORD)); }