Well, im a noob at this, but Im busy with an FPS and my bullets work well and I dont have dark physics.
For rockets and projectile kind of weapons:
When the player shoots, I create the rocket(3d Object)at the player's coordinates and then set it to the player's orientation.
then I simply use dbMoveObject(with a high felocity). Or I make a timer and keep moving the rocket while the timer is running.
While it is moving I check if it is colliding with anything. If it is then I remove the rocket and creat an explosion (3d Object) at its coordinates. The Explosion is then what causes the damage if it collides with an enemy
For hand guns and chaingun's:
With this kind of thing you dont need to see the bullet.
I've downloaded the SC_Collision thing, it is very helpful. I use a ray colistion thing.
Basically, When the player shoots, I send out an invisible sphere,
again, using dbMoveObject(). This sphere then some how checks if it is hitting anything (a wall or person) along the way. It then projects another object to the point where it hit something. THAT Object can be the spark or "dust hit" where your bullet hits.
so, lets say my bullet spark is object 501, Object 4 is my invisible checker, and Object 2 is the player / camera. then the code is something like this:
dbHideObject( 501 );
if ( dbMouseClick() == 1 )
{
dbPositionObject( 4,dbObjectPositionX(2),dbObjectPositionY(2),dbObjectPositionZ(2));
dbSetObjectToObjectOrientation ( 4, 2 );
//get our collision vector
float oldx = dbObjectPositionX(4);
float oldy = dbObjectPositionY(4);
float oldz = dbObjectPositionZ(4);
dbMoveObject(4, 200 );
float x = dbObjectPositionX(4);
float y = dbObjectPositionY(4);
float z = dbObjectPositionZ(4);
collider = SC_RayCast( 0, oldx,oldy,oldz, x,y,z, 0 );
if ( collider > 0 )
{
//get the collision point
float newx = SC_GetStaticCollisionX();
float newy = SC_GetStaticCollisionY();
float newz = SC_GetStaticCollisionZ();
//get collision normal
float normx = SC_GetCollisionNormalX();
float normy = SC_GetCollisionNormalY();
float normz = SC_GetCollisionNormalZ();
//position and point a marker in the right direction
dbPositionObject( 501, newx + normx/100.0f, newy + normy/100.0f, newz + normz/100.0f );
dbPointObject( 501, newx + normx, newy + normy, newz + normz );
dbShowObject( 501 );
}
}
I did not write all this code, I just copied it from the demo and put my object numbers in and it works great. .
Dunno if this is making any sense, probably sounds stupid and not the best way to do it, but im even willing to give you a little demo just to prove how well it works