void ForestWindEmitter::onDeleteNotify(SimObject *object) { AssertFatal( isServerObject(), "ForestWindEmitter::onDeleteNotify - This should never happen on the client!" ); safeDeleteObject(); }
void Projectile::explode(const Point3F& p, const Point3F& n, const U32 collideType) { // Make sure we don't explode twice... if (mHidden == true) return; mHidden = true; if (isServerObject()) { // Do what the server needs to do, damage the surrounding objects, etc. mExplosionPosition = p; mExplosionNormal = n; mCollideHitType = collideType; char buffer[128]; dSprintf(buffer, sizeof(buffer), "%g %g %g", mExplosionPosition.x, mExplosionPosition.y, mExplosionPosition.z); Con::executef(mDataBlock, "onExplode", scriptThis(), buffer, Con::getFloatArg(mFadeValue)); setMaskBits(ExplosionMask); safeDeleteObject(); } else { // Client just plays the explosion at the right place... // Explosion* pExplosion = NULL; if (mDataBlock->waterExplosion && pointInWater(p)) { pExplosion = new Explosion; pExplosion->onNewDataBlock(mDataBlock->waterExplosion); } else if (mDataBlock->explosion) { pExplosion = new Explosion; pExplosion->onNewDataBlock(mDataBlock->explosion); } if( pExplosion ) { MatrixF xform(true); xform.setPosition(p); pExplosion->setTransform(xform); pExplosion->setInitialState(p, n); pExplosion->setCollideType( collideType ); if (pExplosion->registerObject() == false) { Con::errorf(ConsoleLogEntry::General, "Projectile(%s)::explode: couldn't register explosion", mDataBlock->getName() ); delete pExplosion; pExplosion = NULL; } } // Client (impact) decal. if ( mDataBlock->decal ) gDecalManager->addDecal( p, n, 0.0f, mDataBlock->decal ); // Client object updateSound(); } /* // Client and Server both should apply forces to PhysicsWorld objects // within the explosion. if ( false && mPhysicsWorld ) { F32 force = 200.0f; mPhysicsWorld->explosion( p, 15.0f, force ); } */ }