ich habe es mal mit der freien kamera gemacht. Das programm meldet ein fehler und kann nicht ausgeführt werden. 
map1.x befindet sich im anhang
main.cpp:
Code:
#include <irrlicht.h>
#include <net.h>
#include <audiere.h>
using namespace irr;
using namespace video;
using namespace scene;
using namespace core;
int modellife=10;
int mylife=10;
int scounter=0;
int rcounter=0;
int i;
netSocket *sockr;
netSocket *socks;
char sbuffer[100];
char rbuffer[100];
bool shot=false;
IrrlichtDevice *device=0;
class MyEventReceiver : public IEventReceiver
{
public:
   virtual bool OnEvent(SEvent event)
   {
       if(mylife<0)
         return true;
       if(event.EventType==EET_MOUSE_INPUT_EVENT){
          if(event.MouseInput.Event==EMIE_LMOUSE_PRESSED_DOWN){
            shot=true;
           }
        }        
        if(device && device->getSceneManager()->getActiveCamera())
           device->getSceneManager()->getActiveCamera()->OnEvent(event);
        return true;
    }
};
void iamhit(){
    printf("you are hit! life:%d",mylife);
    if(mylife<0){
      printf("you lose\n");
      modellife=2;
    }    
    return;
}
int main()
{
    netInit ();
   sockr = new netSocket();
   socks = new netSocket();
   socks->open(false);
   sockr->open(false);
    socks->setBlocking(false);
    i=socks->connect("10.10.10.10",1111) ;
    sockr->setBlocking(false);
    i=sockr->bind("",1111) ;
   MyEventReceiver receiver;                                    // vollbild?
    device=createDevice(EDT_OPENGL,dimension2d<s32>(1024, 768),16,true,false,false,&receiver);
   IVideoDriver* driver=device->getVideoDriver();
   ISceneManager* smgr=device->getSceneManager();
   IAnimatedMesh* mapmesh=smgr->getMesh("maps/map1.x");
   ISceneNode* map = 0;
   
   map=smgr->addOctTreeSceneNode(mapmesh->getMesh(0));
   map->setMaterialFlag(EMF_LIGHTING,false);
   IAnimatedMesh* modelmesh=smgr->getMesh("models/tris.md2");
   IAnimatedMeshSceneNode* model=smgr->addAnimatedMeshSceneNode(modelmesh);
   model->setMaterialFlag(EMF_LIGHTING, false);
   model->setMaterialTexture( 0, driver->getTexture("models/@.pcx") );
   model->setPosition(vector3df(0,75,100));
   model->setScale(vector3df(3.2,3.2,3.2));
   model->setMD2Animation(EMAT_STAND);
   ICameraSceneNode* camera=smgr->addCameraSceneNodeFPS();
   camera->setPosition(vector3df(0,150,20));
   IMetaTriangleSelector* metaselector;
   metaselector=smgr->createMetaTriangleSelector();
   ITriangleSelector* mapselector=smgr->createOctTreeTriangleSelector(mapmesh->getMesh(0), map, 128);
   metaselector->addTriangleSelector(mapselector);
   mapselector->drop();
   ITriangleSelector* modelselector=smgr->createTriangleSelector(modelmesh->getMesh(0), model);
   metaselector->addTriangleSelector(modelselector);
   modelselector->drop();
   ISceneNodeAnimator* anim=smgr->createCollisionResponseAnimator(
//    metaselector, camera, vector3df(30,50,30),
//      vector3df(0,-100,0), 100.0f, vector3df(0,50,0));
      metaselector, camera, vector3df(0,0,0),
      vector3df(0,0,0), 100.0f, vector3df(0,0,0));
   camera->addAnimator(anim);
   anim->drop();
   device->getCursorControl()->setVisible(false);
   audiere::AudioDevicePtr audiodevice(audiere::OpenDevice());
   audiere::OutputStreamPtr sht1(audiere::OpenSound(audiodevice, "sound/sht1.wav", true));
   sht1->setRepeat(true);
   sht1->setVolume(1);
   sht1->play();
   while(device->run())
   {
      driver->beginScene(true, true, SColor(0,10,10,10));
      smgr->drawAll();
      driver->endScene();
      vector3d<f32> explosion;
      
      int frames=driver->getFPS();
      if (frames<30)
        frames=30;
        rcounter+=1;
      scounter+=1;
      if(scounter>float(frames)/5){
          scounter=0;
          vector3d<f32> pos=camera->getPosition();
          vector3d<f32> rot=camera->getRotation();
          int len=sprintf(sbuffer,"%.1f %.1f %.1f %.1f %d\n\0",pos.X,pos.Y,pos.Z,rot.Y,modellife);
            socks->send(sbuffer,len,0);
      }    
      if(sockr->recv(rbuffer,100,0)>=0){
          float x,y,z,rot;
          int life;
         sscanf(rbuffer,"%f %f %f %f %d",&x,&y,&z,&rot,&life);
         if(life==9999){
             mylife=life;
             break;
          }
         if(life<mylife){
             mylife=life;
             iamhit();
         }    
         int time=(float(rcounter)/frames)*1000;
        rcounter=0;
         ISceneNodeAnimator* runto=smgr->createFlyStraightAnimator(model->getPosition(),vector3df(x,y,z),time,0);
         model->setRotation(vector3df(0,rot,0));
         model->addAnimator(runto);
         runto->drop();
        }    
        if(shot){
            shot=false;
            vector3d<f32> direction=camera->getTarget()-camera->getPosition();
            direction.normalize();
            line3d<f32> bullet;
            bullet.start=camera->getPosition();
            bullet.end=camera->getPosition()+direction*1500;
            
            triangle3d<f32> dummy;
            vector3d<f32> mapcollision;
            vector3d<f32> modelcollision;
            
            bool gotmap=smgr->getSceneCollisionManager()->getCollisionPoint(bullet,mapselector,mapcollision,dummy);
            bool gotmodel=smgr->getSceneCollisionManager()->getCollisionPoint(bullet,modelselector,modelcollision,dummy);
            float mapdistance=0;
            float modeldistance=0;
            if(gotmap){
               mapdistance=camera->getPosition().getDistanceFromSQ(mapcollision);
            }
            if(gotmodel){
               modeldistance=camera->getPosition().getDistanceFromSQ(modelcollision);
            }
                
            if(gotmodel && gotmap){
                if(modeldistance<=mapdistance){
                    modellife-=1;
                    printf("you score!\n");
                    explosion=modelcollision;
                }
                else
                    explosion=mapcollision;                    
            }    
            if(gotmodel && !gotmap){
                modellife-=1;
                printf("you score!\n");
                explosion=modelcollision;
            }
            if(!gotmodel && gotmap){
                explosion=mapcollision;
            }        
        }    
   }
   if(mylife==2)
     printf("you win!\n");
    else
      printf("you lose!\n");
   device->drop();   
    sockr -> close ();
    socks -> close ();
   return 0;
}