|
From: <spo...@us...> - 2007-04-30 17:59:30
|
Revision: 425
http://svn.sourceforge.net/opengate/?rev=425&view=rev
Author: spom_spom
Date: 2007-04-30 10:59:31 -0700 (Mon, 30 Apr 2007)
Log Message:
-----------
Improved spawn synchronisation and fixed some net issues. Removed unused libgrapple.
Modified Paths:
--------------
branches/ogsector/configure.ac
branches/ogsector/externals/genExternals.sh
branches/ogsector/src/LogManager.cpp
branches/ogsector/src/LogManager.h
branches/ogsector/src/Sector.cpp
branches/ogsector/src/Sector.h
branches/ogsector/src/SectorClient.cpp
branches/ogsector/src/SectorClient.h
branches/ogsector/src/SectorClientFrameListener.cpp
branches/ogsector/src/SectorObjects.cpp
branches/ogsector/src/SectorObjects.h
branches/ogsector/src/VesselManager.cpp
branches/ogsector/src/VesselManager.h
branches/ogsector/src/networkClient.cpp
branches/ogsector/src/networkClient.h
branches/ogsector/src/networkProtocol.h
branches/ogsector/src/networkServer.cpp
branches/ogsector/src/networkServer.h
branches/ogsector/src/networkServerUser.cpp
branches/ogsector/src/networkServerUser.h
branches/ogsector/src/ogconsole.cpp
branches/ogsector/src/ogsectorclient.cpp
Removed Paths:
-------------
branches/ogsector/externals/libgrapple
branches/ogsector/externals/libgrapple-0.9.1/
Modified: branches/ogsector/configure.ac
===================================================================
--- branches/ogsector/configure.ac 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/configure.ac 2007-04-30 17:59:31 UTC (rev 425)
@@ -29,7 +29,7 @@
dnl asio: http://sourceforge.net/projects/asio/
AC_CHECK_HEADER([asio.hpp],,
[
- echo "Can't find asio headers. Pleas install the asio development packages."
+ echo "Can't find asio headers. Please install the asio development packages."
echo "You can get them from http://sourceforge.net/projects/asio/"
exit 1
],[])
Modified: branches/ogsector/externals/genExternals.sh
===================================================================
--- branches/ogsector/externals/genExternals.sh 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/externals/genExternals.sh 2007-04-30 17:59:31 UTC (rev 425)
@@ -5,7 +5,6 @@
INSTALLPATH=$(pwd)
OISPATH='ois'
-GRAPPLEPATH='libgrapple'
OGREOPCODE='ogreopcode'
help(){
@@ -17,13 +16,11 @@
slotAll(){
slotOIS
- slotGrapple
slotOgreOpcode
}
slotClean(){
slotOIS clean
- slotGrapple clean
slotOgreOpcode clean
[ -d "$INSTALLPATH/lib/" ] && rm -r $INSTALLPATH/lib/
[ -d "$INSTALLPATH/include/" ] && rm -r $INSTALLPATH/include/
@@ -52,28 +49,6 @@
fi
}
-slotGrapple(){
- ARG=$1
-
- if [ -d "$GRAPPLEPATH" ]
- then
- cd $GRAPPLEPATH
- if [ "$ARG" = "clean" ]
- then
- [ -f "Makefile" ] && make distclean
- rm -rf configure aclocal.m4 autom4te.cache/ ltmain.sh
- else
- sh autogen.sh
- ./configure --prefix=$INSTALLPATH
- make
- make install
- fi
- cd ..
- else
- echo "Cannot find grapple path: $GRAPPLEPATH"
- fi
-}
-
slotOgreOpcode(){
ARG=$1
@@ -109,8 +84,6 @@
slotClean;;
ois)
slotOIS;;
- grapple)
- slotGrapple;;
ogreopcode)
slotOgreOpcode;;
help) help;;
Deleted: branches/ogsector/externals/libgrapple
===================================================================
--- branches/ogsector/externals/libgrapple 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/externals/libgrapple 2007-04-30 17:59:31 UTC (rev 425)
@@ -1 +0,0 @@
-link libgrapple-0.9.1/
\ No newline at end of file
Modified: branches/ogsector/src/LogManager.cpp
===================================================================
--- branches/ogsector/src/LogManager.cpp 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/LogManager.cpp 2007-04-30 17:59:31 UTC (rev 425)
@@ -29,8 +29,12 @@
}
void LogManager::setConsole( OGConsole * console ){
- console_ = console;
- haveConsole_ = true;
+ if ( console ){
+ console_ = console;
+ haveConsole_ = true;
+ } else {
+ haveConsole_ = false;
+ }
}
std::string LogManager::timeStamp() {
@@ -65,6 +69,11 @@
write_( logMsg );
}
+void LogManager::warn( const std::string & msg ){
+ std::string logMsg( "WARNING: " + msg );
+ write_( logMsg );
+}
+
void LogManager::fatal( const std::string & msg ){
std::string logMsg( "FATAL: " + msg );
Modified: branches/ogsector/src/LogManager.h
===================================================================
--- branches/ogsector/src/LogManager.h 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/LogManager.h 2007-04-30 17:59:31 UTC (rev 425)
@@ -34,6 +34,8 @@
void debug( const std::string & msg );
+ void warn( const std::string & msg );
+
void fatal( const std::string & msg );
void cout( const std::string & msg );
Modified: branches/ogsector/src/Sector.cpp
===================================================================
--- branches/ogsector/src/Sector.cpp 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/Sector.cpp 2007-04-30 17:59:31 UTC (rev 425)
@@ -33,7 +33,7 @@
starsNode_ = NULL;
avatar_ = NULL;
- avatarDeathSequenceTime_ = 0.0;
+ avatarRespawnTime_ = 0.0;
sceneMgr_->setAmbientLight( Ogre::ColourValue(0.5, 0.5, 0.5) );
//** Create a light;
@@ -253,95 +253,92 @@
planetNode_->setPosition( Ogre::Vector3( 20000.0, 10000.0, 50000 ) + avatar_->mainNode()->getPosition() );
planetNode_->rotate( rot, Ogre::Node::TS_PARENT );
if ( starsNode_ ) starsNode_->setPosition( avatar_->mainNode()->getPosition() );
- }
+
-
- Ogre::Overlay * radar = Ogre::OverlayManager::getSingleton().getByName( "Radar" );
- Ogre::OverlayContainer * radarMap = radar->getChild( "Radar/Map" );
-
- int dotAWidth = 4;
- int dotAHeight = 2;
- float radarRange = 5000;
- float radarWidth = radarMap->getWidth() * Ogre::OverlayManager::getSingleton().getViewportWidth();
- float radarHeight = radarMap->getHeight() * Ogre::OverlayManager::getSingleton().getViewportHeight();
- float xScale = radarRange / ( radarWidth / 2.0 );
- float yScale = radarRange / ( radarHeight / 2.0 );
-
- for ( std::set< SectorObject * >::iterator it = sectorObjects_.begin(); it != sectorObjects_.end(); it++){
-
- Ogre::Vector3 relativPosition( (*it)->mainNode()->getPosition( ) - avatar_->mainNode()->getPosition( ) );
-
- if ( relativPosition.length() < radarRange ){
- Ogre::OverlayElement * dotA, * dotB;
+ Ogre::Overlay * radar = Ogre::OverlayManager::getSingleton().getByName( "Radar" );
+ Ogre::OverlayContainer * radarMap = radar->getChild( "Radar/Map" );
+
+ int dotAWidth = 4;
+ int dotAHeight = 2;
+ float radarRange = 5000;
+ float radarWidth = radarMap->getWidth() * Ogre::OverlayManager::getSingleton().getViewportWidth();
+ float radarHeight = radarMap->getHeight() * Ogre::OverlayManager::getSingleton().getViewportHeight();
+ float xScale = radarRange / ( radarWidth / 2.0 );
+ float yScale = radarRange / ( radarHeight / 2.0 );
+
+ for ( std::set< SectorObject * >::iterator it = sectorObjects_.begin(); it != sectorObjects_.end(); it++){
- if ( !(*it)->isOnRadar() ) {
- dotA = Ogre::OverlayManager::getSingleton().createOverlayElement( "Panel", "Radar/Map/DotA" + (*it)->name() );
- dotA->setMaterialName( "BaseWhite" );
- dotA->setMetricsMode( Ogre::GMM_PIXELS );
- dotA->setWidth( dotAWidth );
- dotA->setHeight( dotAHeight );
- radarMap->addChild( dotA );
+ Ogre::Vector3 relativPosition( (*it)->mainNode()->getPosition( ) - avatar_->mainNode()->getPosition( ) );
+
+ if ( relativPosition.length() < radarRange ){
+ Ogre::OverlayElement * dotA, * dotB;
- dotB = Ogre::OverlayManager::getSingleton().createOverlayElement( "Panel", "Radar/Map/DotB" + (*it)->name() );
- dotB->setMaterialName( "BaseWhite" );
- dotB->setMetricsMode( Ogre::GMM_PIXELS );
- dotB->setWidth( 1 );
- dotB->setHeight( 1 );
- dotB->setColour( Ogre::ColourValue( 1.0f, 0.0f, 0.0f ) );
- radarMap->addChild( dotB );
+ if ( !(*it)->isOnRadar() ) {
+ dotA = Ogre::OverlayManager::getSingleton().createOverlayElement( "Panel", "Radar/Map/DotA" + (*it)->name() );
+ dotA->setMaterialName( "BaseWhite" );
+ dotA->setMetricsMode( Ogre::GMM_PIXELS );
+ dotA->setWidth( dotAWidth );
+ dotA->setHeight( dotAHeight );
+ radarMap->addChild( dotA );
+
+ dotB = Ogre::OverlayManager::getSingleton().createOverlayElement( "Panel", "Radar/Map/DotB" + (*it)->name() );
+ dotB->setMaterialName( "BaseWhite" );
+ dotB->setMetricsMode( Ogre::GMM_PIXELS );
+ dotB->setWidth( 1 );
+ dotB->setHeight( 1 );
+ dotB->setColour( Ogre::ColourValue( 1.0f, 0.0f, 0.0f ) );
+ radarMap->addChild( dotB );
+
+ (*it)->onRadar( true );
+ } else {
+ dotA = radarMap->getChild( "Radar/Map/DotA" + (*it)->name() );
+ dotB = radarMap->getChild( "Radar/Map/DotB" + (*it)->name() );
+ }
+
+ Ogre::Quaternion q;
+ q.FromAngleAxis( -avatar_->mainNode()->getOrientation( ).getYaw(), Ogre::Vector3::UNIT_Y);
+ relativPosition = q * relativPosition;
- (*it)->onRadar( true );
- } else {
- dotA = radarMap->getChild( "Radar/Map/DotA" + (*it)->name() );
- dotB = radarMap->getChild( "Radar/Map/DotB" + (*it)->name() );
+ Ogre::Plane viewPlane( avatar_->mainNode()->getOrientation().yAxis().normalisedCopy(),
+ avatar_->mainNode()->getPosition() );
+
+ float distToPlane = viewPlane.getDistance( (*it)->mainNode()->getPosition( ) ) / yScale;
+
+ dotB->setHeight( fabs( distToPlane ) );
+
+ dotA->setPosition( radarWidth / 2.0 + relativPosition[ 0 ] / xScale - dotAWidth / 2,
+ - distToPlane - dotAHeight / 2 + radarHeight / 2.0 + relativPosition[ 2 ] / yScale );
+
+ if ( distToPlane < 0 ) distToPlane = 0;
+
+ dotB->setPosition( radarWidth / 2.0 + relativPosition[ 0 ] / xScale,
+ - distToPlane + radarHeight / 2.0 + relativPosition[ 2 ] / yScale );
+
}
-
- Ogre::Quaternion q;
- q.FromAngleAxis( -avatar_->mainNode()->getOrientation( ).getYaw(), Ogre::Vector3::UNIT_Y);
- relativPosition = q * relativPosition;
-
- Ogre::Plane viewPlane( avatar_->mainNode()->getOrientation().yAxis().normalisedCopy(),
- avatar_->mainNode()->getPosition() );
-
- float distToPlane = viewPlane.getDistance( (*it)->mainNode()->getPosition( ) ) / yScale;
-
- dotB->setHeight( fabs( distToPlane ) );
-
- dotA->setPosition( radarWidth / 2.0 + relativPosition[ 0 ] / xScale - dotAWidth / 2,
- - distToPlane - dotAHeight / 2 + radarHeight / 2.0 + relativPosition[ 2 ] / yScale );
-
- if ( distToPlane < 0 ) distToPlane = 0;
-
- dotB->setPosition( radarWidth / 2.0 + relativPosition[ 0 ] / xScale,
- - distToPlane + radarHeight / 2.0 + relativPosition[ 2 ] / yScale );
-
- }
- } // if in radarrange
+ } // if in radarrange
+ }
+ for ( std::map< long, SectorObjectMoveable * >::iterator it = movableObjects_.begin(); it != movableObjects_.end();){
+ if ( !it->second->update( elapsedTime ) ) { //** object died;
- //bool tmpsegfaultDebug = false;
- for ( std::map< long, SectorObjectMoveable * >::iterator it = movableObjects_.begin(); it != movableObjects_.end();){
- if ( !it->second->update( elapsedTime ) ) {
- // tmpsegfaultDebug = true;
- log_->info( "Destructing: " + it->second->name() );
- SectorObjectMoveable * obj = it->second;
- // movableObjects_.erase( it++ );
- destructMoveableObject( (it++)->second );
- log_->info( "... done." );
+ if ( it->second == avatar_ ) {
+ if ( avatarRespawnTime_ == 0.0 ){
+ sendVesselDeRegister( avatar_ );
+ avatarRespawnTime_ = 5.0;
+ } else {
+ avatarRespawnTime_ -= elapsedTime;
+ if ( avatarRespawnTime_ < 0 ){
+ spawnAvatar();
+ }
+ }
+ it++;
+ } else { //** died object is not avatar;
+ log_->info( "Destructing: " + it->second->name() );
+ destructMoveableObject( (it++)->second );
+ log_->info( "done: " );
+ }
} else ++it;
}
-
-// if ( tmpsegfaultDebug) {
-// log_->debug( " tmpsegfaultDebug done." );
-// tmpsegfaultDebug = false;
-// }
-
- if ( avatarDeathSequenceTime_ > 0 ){
- avatarDeathSequenceTime_ -= elapsedTime;
- } else if ( avatarDeathSequenceTime_ > -1 ) {
- spawnAvatar();
- }
-
}
SectorObjectMoveable * Sector::createMoveableObject( const Ogre::String & name, int userID, int childID,
@@ -357,22 +354,36 @@
selectNextTarget( obj );
sectorObjects_.erase( obj );
- Ogre::Overlay * radar = Ogre::OverlayManager::getSingleton().getByName( "Radar" );
- Ogre::OverlayContainer * radarMap = radar->getChild( "Radar/Map" );
- radarMap->removeChild( "Radar/Map/DotA" + obj->name() );
- radarMap->removeChild( "Radar/Map/DotB" + obj->name() );
- Ogre::OverlayManager::getSingleton().destroyOverlayElement( "Radar/Map/DotA" + obj->name() );
- Ogre::OverlayManager::getSingleton().destroyOverlayElement( "Radar/Map/DotB" + obj->name() );
+ if ( obj->isOnRadar() ){
+ Ogre::Overlay * radar = Ogre::OverlayManager::getSingleton().getByName( "Radar" );
+ Ogre::OverlayContainer * radarMap = radar->getChild( "Radar/Map" );
+ radarMap->removeChild( "Radar/Map/DotA" + obj->name() );
+ radarMap->removeChild( "Radar/Map/DotB" + obj->name() );
+ Ogre::OverlayManager::getSingleton().destroyOverlayElement( "Radar/Map/DotA" + obj->name() );
+ Ogre::OverlayManager::getSingleton().destroyOverlayElement( "Radar/Map/DotB" + obj->name() );
+ }
+ for ( std::map< long, SectorObjectMoveableAi * >::iterator it = localAiObjects_.begin();
+ it != localAiObjects_.end(); it ++ ){
+ if ( it->second->target() == obj ){
+ log_->warn( std::string( "ai object target: " ) + it->second->name() + " loose target." );
+ it->second->setTarget( NULL );
+ }
+ }
+
switch ( obj->getTypeID() ){
case SECTOROBJECTMOVABLE_RTTI:
movableObjects_.erase( obj->globalID() );
delete obj;
+ obj = NULL;
+
break;
case SECTOROBJECTMOVABLE_AI_RTTI: {
+ if ( dynamic_cast< SectorObjectMoveableAi *>( obj )->target() == avatar_ ) sendVesselDeRegister( obj );
movableObjects_.erase( obj->globalID() );
- localAiObjects_.erase( dynamic_cast< SectorObjectMoveableAi *>(obj)->childID() );
+ localAiObjects_.erase( dynamic_cast< SectorObjectMoveableAi *>(obj)->globalID() );
delete obj;
+ obj = NULL;
} break;
default:
std::cerr << "object type unknown. this should not happen." << obj->getTypeID() << std::endl;
@@ -391,17 +402,15 @@
obj->mainNode()->setPosition( pos );
sectorObjects_.insert( obj );
-
- // insertCollisionSectorObject( obj );
}
-SectorObjectMoveableAi * Sector::createAiMoveableObject( const Ogre::String & name, int childID,
+SectorObjectMoveableAi * Sector::createAiMoveableObject( const Ogre::String & name, int userID, int childID,
Vessel & vessel ){
- SectorObjectMoveableAi * obj = new SectorObjectMoveableAi( name, this, network_->userID(), childID, vessel );
+ SectorObjectMoveableAi * obj = new SectorObjectMoveableAi( name, this, userID, childID, vessel );
sectorObjects_.insert( obj );
movableObjects_[ obj->globalID() ] = obj ;
- localAiObjects_[ obj->childID() ] = obj;
+ localAiObjects_[ obj->globalID() ] = obj;
return obj;
}
@@ -409,11 +418,14 @@
void Sector::spawnAiObject( ){
int childID = 1;
- while ( localAiObjects_.count( childID ) ){ childID ++; }
+ while ( localAiObjects_.count( createGlobalID( network_->userID(), childID ) ) ){ childID ++; }
- SectorObjectMoveableAi *obj = createAiMoveableObject( avatar_->name() + "_Spawn" + Ogre::StringConverter::toString( childID ), childID, *VesselManager::getSingleton().vessel( "squid" ) );
+ SectorObjectMoveableAi *obj = createAiMoveableObject( network_->userName() + "_Spawn" + toStr( childID ),
+ network_->userID(), childID,
+ *VesselManager::getSingleton().vessel( "squid" ) );
- obj->setTarget( avatar_ );
+ if ( avatar_ ) obj->setTarget( avatar_ );
+ log_->info( std::string( "Create ai object: ") + obj->name() );
Ogre::Real xmin = -5000.0, xmax = -4000.0;
Ogre::Real ymin = -5000.0, ymax = -4000.0;
@@ -426,12 +438,12 @@
// obj->mainNode()->setPosition( 0.0f, 0.0f, 200.0f);
- MessageBodyShipRegister msg( 0, obj->childID(), obj->name(), obj->mainNode()->getPosition(),
- true, obj->vesselBluePrint()->vesselID() );
- network_->send( msg );
+ sendVesselRegister( obj );
+ sendVesselMovement( obj );
}
void Sector::createAvatar( const Ogre::String & playername ){
+ log_->info( std::string( "Create avatar: " ) + playername );
avatar_ = new SectorObjectAvatar( playername, this, network_->userID(),
*VesselManager::getSingleton().vessel( "apteryx" ) );
//sectorObjects_.insert( obj );
@@ -440,33 +452,30 @@
void Sector::destructAvatar( ){
// sectorObjects_.erase( avatar_ );
+ sendVesselDeRegister( avatar_ );
movableObjects_.erase( avatar_->globalID() );
- if ( avatar_ != NULL ) delete avatar_;
+ if ( avatar_ ) delete avatar_;
avatar_ = NULL;
}
void Sector::avatarDied( ){
- avatarDeathSequenceTime_ = 5.0;
- avatar_->setVisible( true );
- MessageBodyShipRegister msg( 0, 0, avatar_->name(), avatar_->mainNode()->getPosition(), false, 0 );
- network_->send( msg );
- listener_->avatarDeathSequence( true );
+ if ( avatar_ ){
+ avatar_->setVisible( true );
+ listener_->avatarDeathSequence( true );
+ }
}
void Sector::spawnAvatar( ){
- if ( avatar_ != NULL ){
- avatarDeathSequenceTime_ = -1.0;
-
+ if ( avatar_ ){
+ log_->info( std::string( "Spawn avatar: " ) + avatar_->name() );
+ avatarRespawnTime_ = 0.0;
+ avatar_->reset();
avatar_->mainNode()->setPosition( 0.0, 0.0, 500.0 );
avatar_->mainNode()->setOrientation( Ogre::Quaternion( 1.0, 0.0, 0.0, 0.0 ) );
avatar_->setVelocity( Ogre::Vector3( 0.0, 0.0, -20.0 ) );
- avatar_->reset();
- MessageBodyShipRegister msg( 0, 0, avatar_->name(), avatar_->mainNode()->getPosition(),
- true, avatar_->vesselBluePrint()->vesselID() );
- network_->send( msg );
-
avatar_->setVisible( false );
+ sendVesselRegister( avatar_ );
listener_->avatarDeathSequence( false );
}
}
@@ -562,66 +571,117 @@
object->attachObject( circle );
}
-void Sector::receiveVesselRegister( const MessageBodyShipRegister & msg ){
+void Sector::sendAllVesselMovements( ){
+ if ( avatar_ ) sendVesselMovement( avatar_ );
- if ( msg.senderID() != network_->userID() ){
- // std::map< long , SectorObjectMoveable * >::iterator it;
+// for ( std::map< int, SectorObjectMoveableAi * >::iterator it = localAiObjects_.begin(); it != localAiObjects_.end(); it ++ ){
+// sendVesselMovement( it->second );
+// }
- if ( movableObjects_.count( createGlobalID( msg.senderID(), msg.childID() ) ) ){
- if ( msg.status() == false ){
- log_->info( "Deregistering " + movableObjects_[ createGlobalID( msg.senderID(), msg.childID() ) ]->name() );
- destructMoveableObject( movableObjects_[ createGlobalID( msg.senderID(), msg.childID() ) ] );
- } else {
- log_->info( "Object " + msg.name() + " allready registered." );
+}
+
+void Sector::sendAllVesselInfos( ){
+ if ( avatar_ ){
+ sendVesselStatus( avatar_ );
+
+ for ( std::map< long, SectorObjectMoveableAi * >::iterator it = localAiObjects_.begin(); it != localAiObjects_.end(); it ++ ){
+ if ( it->second->target() == avatar_ ){
+ sendVesselMovement( it->second );
+ sendVesselStatus( it->second );
}
- } else {
- if ( msg.status() == true ){
- log_->info( "Create object " + msg.name()+ " " + toStr( msg.senderID() ) + " " + toStr( (int)msg.childID() ) + " " );
- SectorObjectMoveable * obj = createMoveableObject( msg.name(), msg.senderID(), msg.childID(),
- *VesselManager::getSingleton().vessel( msg.vesselID() ) );
- obj->mainNode()->setPosition( msg.position() );
- sendAllVesselStatus( );
- }
}
}
}
-void Sector::sendAllVesselMovements( ){
- if ( avatar_ != NULL ){
- MessageBodyShipMovement msg( 0,
- avatar_->mainNode()->getPosition(),
- avatar_->velDirection(),
- avatar_->mainNode()->getOrientation(),
- avatar_->thrustPercent(),
- avatar_->scaledYaw(),
- avatar_->scaledPitch(),
- avatar_->scaledRoll(),
- avatar_->incNetSequence() );
+void Sector::sendVesselMovement( SectorObjectMoveable * obj ){
+ if ( obj ){
+ MessageBodyShipMovement msg( obj->childID(),
+ obj->mainNode()->getPosition(),
+ obj->velDirection(),
+ obj->mainNode()->getOrientation(),
+ obj->thrustPercent(),
+ obj->scaledYaw(),
+ obj->scaledPitch(),
+ obj->scaledRoll(),
+ obj->incNetSequence() );
+
+ network_->send( msg );
+ }
+}
+void Sector::sendVesselRegister( SectorObjectMoveable * obj ){
+ if ( obj ) {
+ log_->info( std::string( "Send register " ) + obj->name() );
+ MessageBodyShipRegister msg( obj->userID(), obj->childID(), obj->name(), obj->mainNode()->getPosition(),
+ obj->vesselBluePrint()->vesselID() );
network_->send( msg );
}
- for ( std::map< int, SectorObjectMoveableAi * >::iterator it = localAiObjects_.begin(); it != localAiObjects_.end(); it ++ ){
- MessageBodyShipMovement msgObj( it->second->childID(),
- it->second->mainNode()->getPosition(),
- it->second->velDirection(),
- it->second->mainNode()->getOrientation(),
- it->second->thrustPercent(),
- it->second->scaledYaw(),
- it->second->scaledPitch(),
- it->second->scaledRoll(),
- it->second->incNetSequence() );
+}
- network_->send( msgObj );
+void Sector::receiveVesselRegister( const MessageBodyShipRegister & msg ){
+
+ if ( !movableObjects_.count( createGlobalID( msg.senderID(), msg.childID() ) ) ){
+ if ( msg.childID() == 0 ){
+ log_->info( "Create player object " + msg.name()+ " " + toStr( msg.senderID() ) + " " + toStr( msg.vesselID() ) );
+ SectorObjectMoveable * obj = createMoveableObject( msg.name(), msg.senderID(), msg.childID(),
+ *VesselManager::getSingleton().vessel( msg.vesselID() ) );
+ obj->mainNode()->setPosition( msg.position() );
+ } else {
+ log_->info( "Create ai object " + msg.name()+ " " + toStr( msg.senderID() ) + " " +
+ toStr( (int)msg.childID() ) + " " + toStr( msg.vesselID() ) );
+
+ SectorObjectMoveableAi * obj = createAiMoveableObject( msg.name(), msg.senderID(), msg.childID(),
+ *VesselManager::getSingleton().vessel( msg.vesselID() ) );
+ obj->mainNode()->setPosition( msg.position() );
+
+ if ( movableObjects_.count( createGlobalID( msg.senderID(), 0 ) ) ){
+ log_->info( "ai object target: " + movableObjects_[ createGlobalID( msg.senderID(), 0 ) ]->name() );
+ obj->setTarget( movableObjects_[ createGlobalID( msg.senderID(), 0 ) ] );
+ }
+ }
+
+ sendAllVesselInfos( );
+
+ } else {
+ log_->warn( std::string( "Registering: object allready exist: " ) +
+ movableObjects_[ createGlobalID( msg.senderID(), msg.childID() ) ]->name() );
}
+
}
+void Sector::sendVesselDeRegister( SectorObjectMoveable * obj ){
+ if ( obj ) {
+ log_->info( std::string( "Send Deregister " ) + obj->name() );
+ MessageBodyShipDeRegister msg( 0, obj->childID() );
+ network_->send( msg );
+ }
+}
+void Sector::receiveVesselDeRegister( const MessageBodyShipDeRegister & msg ){
+ if ( movableObjects_.count( createGlobalID( msg.senderID(), msg.childID() ) ) ){
+ log_->info( std::string( "Receive deregister " )
+ + movableObjects_[ createGlobalID( msg.senderID(), msg.childID() ) ]->name() );
+
+ SectorObjectMoveable *obj = movableObjects_[ createGlobalID( msg.senderID(), msg.childID() ) ];
+
+ destructMoveableObject( obj );
+
+ } else {
+ log_->warn( std::string( "Deregistering request for unknown object: " ) +
+ toStr( msg.senderID() ) + ": " + toStr( msg.childID() ) );
+ }
+}
+
void Sector::receiveVesselMovement( const std::vector < MessageBodyShipMovement * > & movements ){
std::map < long, const MessageBodyShipMovement * > singleMsg;
//** we sort the movement messaged
for ( size_t i = 0; i < movements.size(); i ++ ){
+// LogManager::getSingleton().debug( std::string( "Movement: " ) +
+// movableObjects_[ createGlobalID( movements[ i ]->senderID(), movements[ i ]->childID() )]->name() + " " + toStr( movements[ i ]->senderID() ) + " " + toStr( (int)movements[ i ]->childID() ) +
+// " " + toStr( movements[ i ]->position() ) );
+
if ( movements[ i ]->senderID() != network_->userID() ){
//** apply only foreign movements, and take just the actual movement
singleMsg[ createGlobalID( movements[ i ]->senderID(), movements[ i ]->childID() ) ] = movements[ i ];
@@ -639,38 +699,35 @@
<< i->second->position() << " this should not happen." << std::endl;
}
}
+ for ( size_t i = 0; i < movements.size(); i ++ ){
+ delete movements[ i ];
+ }
+
}
-void Sector::sendAllVesselStatus( ){
- if ( avatar_ != NULL ){
- sendVesselStatus( *avatar_ );
+void Sector::sendVesselStatus( SectorObjectMoveable * obj ){
+ if ( obj ){
+ MessageBodyShipStatus msg( obj->childID(),
+ obj->shieldPercent(),
+ obj->armorPercent(),
+ obj->firePressed(),
+ obj->afterburnerPressed(),
+ obj->breakPressed() );
+ network_->send( msg );
}
-// for ( std::map< int, SectorObjectMoveableAi * >::iterator it = localAiObjects_.begin(); it != localAiObjects_.end(); it ++ ){
-// sendVesselStatus( *(it->second) );
-// }
}
-void Sector::sendVesselStatus( const SectorObjectMoveable & obj ){
- MessageBodyShipStatus msg( obj.childID(),
- obj.shieldPercent(),
- obj.armorPercent(),
- obj.firePressed(),
- obj.afterburnerPressed(),
- obj.breakPressed() );
- network_->send( msg );
-}
-
void Sector::receiveVesselStatus( const MessageBodyShipStatus & msg ){
if ( msg.senderID() != network_->userID() ){
std::map< long, SectorObjectMoveable * >::iterator it;
if ( ( it = movableObjects_.find( createGlobalID( msg.senderID(), msg.childID() ) ) ) != movableObjects_.end() ){
- log_->cout( "ReceiveVesselStatus for " + it->second->name( ) );
+ log_->debug( "ReceiveVesselStatus for " + it->second->name( ) );
it->second->setStatus( msg );
} else {
log_->fatal( "Requested non existant object for shipstatus: " +
- network_->userName( msg.senderID() ) + " this should not happen." );
+ network_->userName( msg.senderID() ) + " this should not happen." );
}
}
}
Modified: branches/ogsector/src/Sector.h
===================================================================
--- branches/ogsector/src/Sector.h 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/Sector.h 2007-04-30 17:59:31 UTC (rev 425)
@@ -35,7 +35,7 @@
SectorObjectMoveable * createMoveableObject( const Ogre::String & name, int userId, int childId, Vessel & vessel );
- SectorObjectMoveableAi * createAiMoveableObject( const Ogre::String & name, int childId, Vessel & vessel );
+ SectorObjectMoveableAi * createAiMoveableObject( const Ogre::String & name, int userId, int childId, Vessel & vessel );
void destructMoveableObject( SectorObjectMoveable * obj );
@@ -62,20 +62,22 @@
SectorObject * prevTarget( );
+ void sendAllVesselInfos( );
+ void sendAllVesselMovements( );
+
+ void sendVesselRegister( SectorObjectMoveable * obj );
void receiveVesselRegister( const MessageBodyShipRegister & msg );
- void sendAllVesselStatus( );
+ void sendVesselDeRegister( SectorObjectMoveable * obj );
+ void receiveVesselDeRegister( const MessageBodyShipDeRegister & msg );
- void sendAllVesselMovements( );
-
+ void sendVesselMovement( SectorObjectMoveable * obj );
void receiveVesselMovement( const std::vector < MessageBodyShipMovement * > & movements );
- void sendVesselStatus( const SectorObjectMoveable & obj );
-
+ void sendVesselStatus( SectorObjectMoveable * obj );
void receiveVesselStatus( const MessageBodyShipStatus & msg );
void sendVesselAmmoHit( const Projectile & projectile, BaseObject * victim );
-
void receiveVesselAmmoHit( const MessageBodyShipAmmoHit & msg );
protected:
@@ -97,9 +99,9 @@
std::set< SectorObject * >::iterator itTarget_;
std::map< long, SectorObjectMoveable * > movableObjects_;
- std::map< int, SectorObjectMoveableAi * > localAiObjects_;
+ std::map< long, SectorObjectMoveableAi * > localAiObjects_;
- float avatarDeathSequenceTime_;
+ float avatarRespawnTime_;
};
Modified: branches/ogsector/src/SectorClient.cpp
===================================================================
--- branches/ogsector/src/SectorClient.cpp 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/SectorClient.cpp 2007-04-30 17:59:31 UTC (rev 425)
@@ -2,15 +2,6 @@
namespace OpenGate{
-void SectorClient::createScene( ){
- sector_ = new Sector( sceneMgr_, network_ );
- sector_->createAvatar( network_->userName() );
-}
-
-void SectorClient::destroyScene( ){
- if ( sector_ != NULL ) delete sector_;
-}
-
bool SectorClient::setup( bool dialog ){
root_ = new Ogre::Root;
@@ -37,8 +28,9 @@
// Create the scene
vesselManager_ = new VesselManager( );
+ vesselManager_->loadVessels( resourcePaths_, "ships.xml" );
- createScene();
+ sector_ = new Sector( sceneMgr_, network_ );
inputManager_ = new InputManager( );
@@ -58,8 +50,7 @@
// OgreConsole::getSingleton().addCommand("quit",&CMD_Quit);
// OgreConsole::getSingleton().addCommand("screenshot",&CMD_Screenshot);
-
- sector_->spawnAvatar();
+
return true;
}
@@ -80,6 +71,7 @@
typeName = i->first;
archName = i->second;
Ogre::ResourceGroupManager::getSingleton().addResourceLocation( archName, typeName, secName );
+ resourcePaths_.insert( archName );
}
}
}
Modified: branches/ogsector/src/SectorClient.h
===================================================================
--- branches/ogsector/src/SectorClient.h 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/SectorClient.h 2007-04-30 17:59:31 UTC (rev 425)
@@ -31,19 +31,49 @@
console_ = NULL;
}
- virtual ~SectorClient(){
- if ( console_ != NULL ) delete console_;
- if ( frameListener_ != NULL ) delete frameListener_;
- if ( inputManager_ != NULL ) delete inputManager_;
+ virtual ~SectorClient(){
+ shutdown();
if ( root_ != NULL ) delete root_;
}
+ void shutdown(){
+ if ( console_ != NULL ) {
+ LogManager::getSingleton().debug( "Shutdown console." );
+ delete console_;
+ console_ = NULL;
+ }
+ if ( frameListener_ != NULL ) {
+ LogManager::getSingleton().info( "Shutdown framelistener." );
+ delete frameListener_;
+ frameListener_ = NULL;
+ }
+ if ( inputManager_ != NULL ) {
+ LogManager::getSingleton().info( "Shutdown inputmanager." );
+ delete inputManager_;
+ inputManager_ = NULL;
+ }
+ if ( sector_ != NULL ) {
+ LogManager::getSingleton().info( "Shutdown sector." );
+ delete sector_;
+ sector_ = NULL;
+ }
+ if ( vesselManager_ ){
+ LogManager::getSingleton().info( "Shutdown vesselmanager." );
+ delete vesselManager_;
+ vesselManager_ = NULL;
+ }
+ }
+
virtual void go( bool dialog ){
if ( !setup( dialog ) ) return;
+ sector_->createAvatar( network_->userName() );
+ sector_->spawnAvatar();
+
root_->startRendering();
-
- destroyScene();
+
+ sector_->destructAvatar( );
+ shutdown();
}
protected:
@@ -63,11 +93,6 @@
virtual void createFrameListener( );
- virtual void createScene( );
-
- virtual void destroyScene( );
-
-
NetworkClient * network_;
Ogre::Root * root_;
SectorClientFrameListener * frameListener_;
@@ -80,6 +105,8 @@
VesselManager * vesselManager_;
OGConsole * console_;
+
+ std::set < std::string > resourcePaths_;
};
} // namespace OpenGate
Modified: branches/ogsector/src/SectorClientFrameListener.cpp
===================================================================
--- branches/ogsector/src/SectorClientFrameListener.cpp 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/SectorClientFrameListener.cpp 2007-04-30 17:59:31 UTC (rev 425)
@@ -125,31 +125,44 @@
std::vector < MessageBodyShipMovement * > movements;
network_->pull( msgs );
- for ( size_t i = 0; i < msgs.size(); i ++ ){
- switch ( msgs[ i ][ 0 ] ){
- case PROTO_CHAT:{
- network_->ping();
- MessageBodyChat msg( &msgs[ i ][ 0 ] );
- sector_->log()->chat( network_->userName( msg.senderID() ), msg.message() );
- } break;
- case PROTO_SHIPREGISTER:
- sector_->receiveVesselRegister( &msgs[ i ][ 0 ] ); break;
- case PROTO_SHIPSTATUS:
- sector_->receiveVesselStatus( &msgs[ i ][ 0 ] ); break;
- case PROTO_SHIPMOVEMENT:{
- //** we handle that in sum, so we can ignore dups because of packet loss
- MessageBodyShipMovement msg( &msgs[ i ][ 0 ] );
- movements.push_back( &msg );
- } break;
- case PROTO_SHIPAMMOHIT:
- sector_->receiveVesselAmmoHit( &msgs[ i ][ 0 ] ); break;
- default:
- std::cerr << "PROTO type unknown: " << msgs[ i ][ 0 ] << " " << msgs[ i ].size() << std::endl;
- break;
+ if ( msgs.size() > 0 ) {
+
+ // LogManager::getSingleton().debug( std::string( "Pullcount: " ) + toStr( msgs.size() ) );
+
+ for ( size_t i = 0; i < msgs.size(); i ++ ){
+
+// LogManager::getSingleton().debug( std::string( "Pull: " ) + toStr( (int)msgs[ i ][ 0 ] ) );
+// if ( msgs[ i ][ 0 ] == PROTO_SHIPMOVEMENT ) {
+// MessageBodyShipMovement m( &msgs[ i ][ 0 ] );
+// std::cout << m << std::endl;
+// }
+
+ switch ( msgs[ i ][ 0 ] ){
+ case PROTO_CHAT:{
+ network_->ping();
+ MessageBodyChat msg( &msgs[ i ][ 0 ] );
+ sector_->log()->chat( network_->userName( msg.senderID() ), msg.message() );
+ } break;
+ case PROTO_SHIPREGISTER:
+ sector_->receiveVesselRegister( &msgs[ i ][ 0 ] ); break;
+ case PROTO_SHIPDEREGISTER:
+ sector_->receiveVesselDeRegister( &msgs[ i ][ 0 ] ); break;
+ case PROTO_SHIPSTATUS:
+ sector_->receiveVesselStatus( &msgs[ i ][ 0 ] ); break;
+ case PROTO_SHIPMOVEMENT:{
+ //** we handle that in sum, so we can ignore dups because of packet loss
+ MessageBodyShipMovement *msg = new MessageBodyShipMovement( &msgs[ i ][ 0 ] );
+ movements.push_back( msg );
+ } break;
+ case PROTO_SHIPAMMOHIT:
+ sector_->receiveVesselAmmoHit( &msgs[ i ][ 0 ] ); break;
+ default:
+ std::cerr << "PROTO type unknown: " << msgs[ i ][ 0 ] << " " << msgs[ i ].size() << std::endl;
+ break;
+ }
}
+ if ( movements.size() > 0 ) sector_->receiveVesselMovement( movements );
}
- if ( movements.size() > 0 ) sector_->receiveVesselMovement( movements );
-
//** end capture network;
// max 1000 sector-updates/second
@@ -232,9 +245,9 @@
sector_->avatar()->setScaledRoll( 0.0 );
}
//** selfdestruct and eject;
- if ( e.key == OIS::KC_F11 ) { sector_->avatarDied(); }
- if ( e.key == OIS::KC_F5 ){ duelistPilot_ = !duelistPilot_; }
- if ( e.key == OIS::KC_F6 ){ duelistTarget_ = !duelistTarget_; }
+ if ( e.key == OIS::KC_F8 ) { sector_->avatar()->deathSequence( 0 ); }
+ if ( e.key == OIS::KC_F5 ) { duelistPilot_ = !duelistPilot_; }
+ if ( e.key == OIS::KC_F6 ) { duelistTarget_ = !duelistTarget_; }
} // if avatar;
//** next Target;
Modified: branches/ogsector/src/SectorObjects.cpp
===================================================================
--- branches/ogsector/src/SectorObjects.cpp 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/SectorObjects.cpp 2007-04-30 17:59:31 UTC (rev 425)
@@ -255,7 +255,6 @@
}
void SectorObjectMoveable::setFlightProperties( const MessageBodyShipMovement & msg ){
-
if ( forceMovement_ ){
mainNode_->setPosition( msg.position() );
mainNode_->setOrientation( msg.orientation() );
@@ -298,7 +297,7 @@
interpolateRot_ = diff * srcQ.Inverse();
// if ( msg.childID() > 0 ){
- if ( !1 ){
+ if ( !1 ){
std::cout << std::endl;
std::cout << msg.sequenceNr() << "LastFrameCount: " << lastFrameCount_
@@ -560,27 +559,27 @@
bool SectorObjectMoveable::deathSequence( Ogre::Real elapsedTime ){
if ( !deathSequence_ ){
+ setVisible( false );
setSelectable( false );
sector_->selectNextTarget( this );
LogManager::getSingleton().info( name_ + " destroyed." );
+
if ( !explosion_ ){
explosion_ = sceneMgr_->createParticleSystem( name_ + "ExplosionSystem", "OpenGate/ExplosionStart" );
mainNode_->attachObject( explosion_ );
- explosion_->getEmitter( 0 )->setEnabled( true );
- explodeSequenceTime_ = explosion_->getEmitter( 0 )->getDuration() + explosion_->getEmitter( 0 )->getMaxTimeToLive();
}
+ explosion_->getEmitter( 0 )->setEnabled( true );
+ explodeSequenceTime_ = explosion_->getEmitter( 0 )->getDuration() + explosion_->getEmitter( 0 )->getMaxTimeToLive();
+
if ( thrusterBbs_ ) thrusterBbs_->setVisible( false );
percentageThrust_ = 0;
updateThruster();
+ deathSequence_ = true;
}
- deathSequence_ = true;
explodeSequenceTime_ -= elapsedTime;
if ( explodeSequenceTime_ > 0 || projectiles_.size() > 0 ) {
- setVisible( false );
- //mainNode_->showBoundingBox( true );
-
return true;
} else {
explosion_->getEmitter( 0 )->setEnabled( false );
@@ -641,7 +640,7 @@
}
if ( statusChanged_ ){
- sector_->sendVesselStatus( *this );
+ sector_->sendVesselStatus( this );
statusChanged_ = false;
};
@@ -705,7 +704,7 @@
bool SectorObjectAvatar::update( Ogre::Real elapsedTime ){
if ( statusChanged_ ){
- sector_->sendVesselStatus( *this );
+ sector_->sendVesselStatus( this );
statusChanged_ = false;
};
return SectorObjectMoveable::update( elapsedTime );
@@ -724,10 +723,7 @@
sector_->avatarDied( );
}
- SectorObjectMoveable::deathSequence( elapsedTime );
-
- //** return always true, this object should not be automatic destroyed by the sector
- return true;
+ return SectorObjectMoveable::deathSequence( elapsedTime );
}
Modified: branches/ogsector/src/SectorObjects.h
===================================================================
--- branches/ogsector/src/SectorObjects.h 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/SectorObjects.h 2007-04-30 17:59:31 UTC (rev 425)
@@ -322,6 +322,9 @@
inline virtual long getTypeID() const { return SECTOROBJECTMOVABLE_AI_RTTI; }
virtual void setTarget( SectorObject * target ){ target_ = target; }
+
+ virtual SectorObject * target( ){ return target_; }
+
// virtual searchTarget( SectorObjectMoveable * target ){ target_ = target; }
virtual bool update( Ogre::Real elapsedTime );
Modified: branches/ogsector/src/VesselManager.cpp
===================================================================
--- branches/ogsector/src/VesselManager.cpp 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/VesselManager.cpp 2007-04-30 17:59:31 UTC (rev 425)
@@ -9,7 +9,6 @@
VesselManager::VesselManager(){
log_ = LogManager::getSingletonPtr();
- loadVessels( );
}
VesselManager::~VesselManager(){
@@ -19,56 +18,45 @@
vesselID_.end();
}
-void VesselManager::loadVessels( ){
-
- std::string shipResourceFile = "./data/ships.xml";
- TiXmlDocument doc( shipResourceFile );
- bool loadOkay = doc.LoadFile();
+void VesselManager::loadVessels( const std::set < std::string > & resourcePaths, const std::string & resourceName ){
- std::map < int, std::string > ships;
+ for ( std::set < std::string >::iterator it = resourcePaths.begin(); it != resourcePaths.end(); it ++ ){
+ std::string shipResourceFile( (*it) + "/" + resourceName );
- if ( loadOkay ) {
- TiXmlHandle docHandle( &doc );
- TiXmlElement* pElem;
- TiXmlHandle hRoot( 0 );
-
- //** block: Ships;
- pElem = docHandle.FirstChildElement().Element();
- hRoot = TiXmlHandle( pElem );
+ TiXmlDocument doc( shipResourceFile );
+ bool loadOkay = doc.LoadFile();
- if ( pElem ) {
- log_->debug( pElem->Value() );
- for ( pElem = hRoot.FirstChild( "Resource" ).Element(); pElem != 0; pElem = pElem->NextSiblingElement() ) {
- log_->info( std::string( "Found ressource: " ) + pElem->Attribute("location") );
- ships[ toInt( pElem->Attribute("id") ) ] = pElem->Attribute("location");
- }
- } else {
- log_->fatal( shipResourceFile + " cannot read first node." );
- }
- } else {
- log_->fatal( shipResourceFile + " cannot read shipResourceFile." );
- }
-
-
- for ( std::map < int, std::string >::iterator it = ships.begin(); it != ships.end(); it ++ ){
- Vessel * vessel = loadAndCreateVessel( it->second );
- if ( vessel ){
- if ( vessel->name().length() > 0 && vessel->factionName().length() > 0 ){
- vesselID_[ it->first ] = vessel;
- vessel->setVesselID( it->first );
- vessels_[ vessel->name() ] = vessel;
- factions_.insert( vessel->factionName() );
- log_->info( std::string( "Loaded: " ) + vessel->factionName() + "/" + vessel->name() );
+ std::map < int, std::string > ships;
+
+ if ( loadOkay ) {
+ log_->info( std::string( "open resource file for ships: ") + shipResourceFile );
+ TiXmlHandle docHandle( &doc );
+ TiXmlElement* pElem;
+ TiXmlHandle hRoot( 0 );
+
+ //** block: Ships;
+ pElem = docHandle.FirstChildElement().Element();
+ hRoot = TiXmlHandle( pElem );
+
+ if ( pElem ) {
+ for ( pElem = hRoot.FirstChild( "Resource" ).Element(); pElem != 0; pElem = pElem->NextSiblingElement() ) {
+ log_->info( std::string( "Found ressource: " ) + pElem->Attribute("location") );
+ ships[ toInt( pElem->Attribute("id") ) ] = pElem->Attribute("location");
+ }
} else {
- log_->fatal( it->second + " has no valid name and factionname." );
+ log_->fatal( shipResourceFile + " cannot read first node." );
}
} else {
- log_->fatal( it->second + " is no valid vessel description." );
+ // log_->info( shipResourceFile + " cannot open shipResourceFile." );
}
+
+ for ( std::map < int, std::string >::iterator it = ships.begin(); it != ships.end(); it ++ ){
+ loadAndCreateVessel( it->first, it->second );
+ }
}
}
-Vessel * VesselManager::loadAndCreateVessel( const std::string & fileName ){
+Vessel * VesselManager::loadAndCreateVessel( int vesselID, const std::string & fileName ){
TiXmlDocument doc( fileName );
bool loadOkay = doc.LoadFile();
@@ -94,9 +82,20 @@
Vessel *vessel = new Vessel();
pElem = hRoot.ChildElement( "faction", 0 ).Element();
- if ( pElem ) vessel->setFactionName( pElem->FirstChild()->Value() );
+ if ( pElem ) {
+ vessel->setFactionName( pElem->FirstChild()->Value() );
+ } else {
+ log_->fatal( fileName + " has no mandatory factionname (mandatory)." );
+ return NULL;
+ }
pElem = hRoot.ChildElement( "name", 0 ).Element();
- if ( pElem ) vessel->setName( pElem->FirstChild()->Value() );
+ if ( pElem ) {
+ vessel->setName( pElem->FirstChild()->Value() );
+ } else {
+ log_->fatal( fileName + " has no name (mandatory)." );
+ return NULL;
+ }
+
pElem = hRoot.ChildElement( "class", 0 ).Element();
if ( pElem ) vessel->setClassName( pElem->FirstChild()->Value() );
@@ -159,6 +158,18 @@
return NULL;
}
+ if ( vessels_.count( vessel->name() ) == 0 ){
+ vessel->setVesselID( vesselID );
+ vessels_[ vessel->name() ] = vessel;
+ vesselID_[ vesselID ] = vessel;
+
+ factions_.insert( vessel->factionName() );
+ log_->info( std::string( "Loaded: " ) + vessel->factionName() + "/" + vessel->name() );
+ } else {
+ log_->warn( std::string( "Ship with name: " ) + vessel->factionName() + "/" + vessel->name() +
+ " allready loaded" );
+ }
+
return vessel;
} else {
log_->fatal( fileName + " is no ship description" );
Modified: branches/ogsector/src/VesselManager.h
===================================================================
--- branches/ogsector/src/VesselManager.h 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/VesselManager.h 2007-04-30 17:59:31 UTC (rev 425)
@@ -175,11 +175,12 @@
static VesselManager * getSingletonPtr( );
VesselManager();
+
~VesselManager();
+
+ void loadVessels( const std::set < std::string > & resourcePaths, const std::string & resourceName );
- void loadVessels( );
-
- Vessel * loadAndCreateVessel( const std::string & filename );
+ Vessel * loadAndCreateVessel( int vesselID, const std::string & filename );
Vessel * vessel( int vesselID ){
if ( vesselID_.count( vesselID ) ){
Modified: branches/ogsector/src/networkClient.cpp
===================================================================
--- branches/ogsector/src/networkClient.cpp 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/networkClient.cpp 2007-04-30 17:59:31 UTC (rev 425)
@@ -11,10 +11,11 @@
: io_service_( io_service ), socket_( io_service ), resolver_( io_service ),
hostname_( hostName ), online_( false ){
+ log_ = LogManager::getSingletonPtr();
pingTime_ = 0;
userID_ = 0;
- std::cout << "Connecting to " << hostname_ << ":" << 1234 << std::endl;
+ log_->info( std::string( "Connecting to " ) + hostname_ + ":" + toStr( 1234 ) );
asio::error error = asio::error::host_not_found;
try{
@@ -27,19 +28,18 @@
socket_.connect( *endpoint_iterator++, asio::assign_error( error ) );
}
} catch ( asio::error & e) {
- std::cerr << e << std::endl;
+ log_->fatal( e.what() );
} catch ( std::exception & e) {
- std::cerr << "Exception: " << e.what() << std::endl;
+ log_->fatal( std::string( "Exception: " ) + e.what() );
} catch (...) {
}
if ( !error ){
- std::cout << "Connected: waiting for userID. " << std::endl;
+ log_->info( "Connected: waiting for userID. " );
online_ = true;
asio::async_read( socket_, asio::buffer( readMsg_.data(), Message::HeaderLength+MessageBodyUserID( 0 ).dataSize() ),
- boost::bind( & NetworkClient::handleReceiveUserID, this,
- asio::placeholders::error ) );
+ boost::bind( & NetworkClient::handleReceiveUserID, this, asio::placeholders::error ) );
} else {
- std::cout << error << std::endl;
+ log_->fatal( error.what() );
}
}
@@ -95,8 +95,8 @@
userID_ = (int)msg.userID();
} break;
default:
- std::cerr << " unknown MESSAGE_PROTO " << base.type() << std::endl;
- std::cerr << " wait for userid " << std::endl;
+ log_->fatal( std::string( "unknown MESSAGE_PROTO " ) + toStr( base.type() ) );
+ log_->fatal( "wait for userid " );
asio::async_read( socket_, asio::buffer( readMsg_.data(),
Message::HeaderLength+MessageBodyUserID( 0 ).dataSize() ),
boost::bind( & NetworkClient::handleReceiveUserID, this,
@@ -108,7 +108,7 @@
boost::bind( & NetworkClient::handleReadMessageHeader, this,
asio::placeholders::error ) );
} else {
- std::cout << "handleReceiveUserID: " << " " << error << std::endl;
+ log_->fatal( std::string( "handleReceiveUserID: " ) + error.what() );
}
}
}
@@ -122,7 +122,7 @@
boost::bind( &NetworkClient::handleReadMessageBody, this,
asio::placeholders::error ) );
} else {
- std::cout << "handleReadMessageHeader: " << " " << error << std::endl;
+ log_->fatal( std::string( "handleReadMessageHeader: " ) + error.what() );
doClose();
}
}
@@ -137,27 +137,33 @@
switch( base.type() ){
case PROTO_USERNAME: {
MessageBodyUserName msg( readMsg_.body() );
- std::cout << "New user = " << (int)msg.senderID() << " " << msg.userName() << std::endl;
+ log_->info( std::string( "New user = " ) + toStr((int)msg.senderID()) + " " + msg.userName() );
users_[ (int)msg.senderID() ] = msg.userName();
} break;
case PROTO_CONNECTION_REFUSED: {
MessageBodyConnectionRefused msg( readMsg_.body() );
switch ( msg.reason() ){
case CONNECTION_REFUSED_USER_ALREADY_EXIST:
- std::cerr << "Connection refused: " << userName_ << " already conneced to the server" << std::endl;
+ log_->fatal( std::string( "Connection refused: " ) + userName_ + " already conneced to the server" );
doClose();
online_ = false;
break;
default:
- std::cerr << "Connection refused for unknown reason:" << msg.reason() << std::endl;
+ log_->fatal( std::string("Connection refused for unknown reason: " ) + toStr( msg.reason() ) );
}
} break;
case PROTO_DISCONNECT: {
MessageBodyDisconnect msg( readMsg_.body() );
- std::cout << "Disconnect user = " << (int)msg.userID() << " " << userName( (int)msg.userID() ) << std::endl;
+ log_->info( std::string( "Disconnect user = " ) + toStr( (int)msg.userID() ) + " "
+ + userName( (int)msg.userID() ) );
users_.erase( users_.find( (int)msg.userID() ) ) ;
} break;
default:
+// if ( base.type() == PROTO_SHIPMOVEMENT ) {
+// MessageBodyShipMovement m( readMsg_.body() );
+// std::cout << m << std::endl;
+// }
+
std::vector < char > vec( readMsg_.bodyLength() );
vec.resize( readMsg_.bodyLength() );
memcpy( &vec[ 0 ], (char*)readMsg_.body(), readMsg_.bodyLength() );
@@ -168,7 +174,7 @@
boost::bind( & NetworkClient::handleReadMessageHeader, this,
asio::placeholders::error ) );
} else {
- std::cout << "handleReadMessageBody error: " << " " << error << std::endl;
+ log_->fatal( std::string( "handleReadMessageBody error: " ) + error.what() );
doClose();
}
}
@@ -199,7 +205,7 @@
asio::placeholders::error ) );
}
} else {
- std::cout << "handleWrite: " << " " << error << std::endl;
+ log_->fatal( std::string( "handleWrite: " ) + error.what() );
doClose();
}
}
@@ -207,7 +213,8 @@
void NetworkClient::doClose() {
if ( online_ ){
- std::cout << "User disconnected." << std::endl;
+ sleep( 1 );
+ // log_->info( std::string( "Network closed, user disconnected." ) );
socket_.close();
pingTime_ = -1;
online_ = false;
Modified: branches/ogsector/src/networkClient.h
===================================================================
--- branches/ogsector/src/networkClient.h 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/networkClient.h 2007-04-30 17:59:31 UTC (rev 425)
@@ -4,6 +4,7 @@
#include <asio.hpp>
#include <boost/bind.hpp>
+#include "LogManager.h"
#include "networkProtocol.h"
using asio::ip::tcp;
@@ -80,6 +81,7 @@
Uint32 userID_;
float pingTime_;
+ LogManager *log_;
};
} //namespace OpenGate
Modified: branches/ogsector/src/networkProtocol.h
===================================================================
--- branches/ogsector/src/networkProtocol.h 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/networkProtocol.h 2007-04-30 17:59:31 UTC (rev 425)
@@ -42,9 +42,10 @@
#define PROTO_CHAT 7
#define PROTO_SHIPBASE 10
#define PROTO_SHIPREGISTER 11
-#define PROTO_SHIPSTATUS 12
-#define PROTO_SHIPMOVEMENT 13
-#define PROTO_SHIPAMMOHIT 14
+#define PROTO_SHIPDEREGISTER 12
+#define PROTO_SHIPSTATUS 13
+#define PROTO_SHIPMOVEMENT 14
+#define PROTO_SHIPAMMOHIT 15
#define PROTO_TEST 255
#define CONNECTION_REFUSED_USER_ALREADY_EXIST 1
@@ -103,6 +104,11 @@
virtual int dataSize() const { return sizeof( Uint8 ) + sizeof( Uint32 ); }
+ friend std::ostream & operator << ( std::ostream & str, const MessageBodyBase & msg ){
+ str << "Type: " << (int)( msg.type() ) << " senderID: " << msg.senderID() ;
+ return str;
+ }
+
protected:
Uint8 type_;
Uint32 senderID_;
@@ -267,27 +273,20 @@
class MessageBodyShipRegister : public MessageBodyShipBase {
public:
- MessageBodyShipRegister( const Uint32 senderID, Uint8 childID, const std::string & name,
- const Ogre::Vector3 & pos, Uint8 status, Uint8 vesselID )
- : MessageBodyShipBase( childID ), name_( name ), pos_( pos ), status_( status ), vesselID_( vesselID ){
+ MessageBodyShipRegister( const Uint32 senderID, const Uint8 childID, const std::string & name,
+ const Ogre::Vector3 & pos, Uint16 vesselID )
+ : MessageBodyShipBase( childID ), name_( name ), pos_( pos ), vesselID_( vesselID ){
senderID_ = senderID;
type_ = (Uint8)PROTO_SHIPREGISTER;
}
- MessageBodyShipRegister( const Uint32 senderID, Uint8 childID, Uint8 status )
- : MessageBodyShipBase( childID ), name_( "" ), status_( status ){
- senderID_ = senderID;
- type_ = (Uint8)PROTO_SHIPREGISTER;
- }
-
MessageBodyShipRegister( const char * data ) : MessageBodyShipBase( data ){
int count = MessageBodyShipBase::dataSize();
readFromData( nameLength_, data, count );
std::string msg( (char*) &data[ count ], nameLength_ ); count += nameLength_; name_ = msg;
- readFromData( pos_, data, count );
- readFromData( status_, data, count );
+ readFromData( pos_, data, count );
readFromData( vesselID_, data, count );
}
@@ -298,10 +297,9 @@
nameLength_ = name_.length();
writeToOut( out_, nameLength_ );
- out_.write( ( char* )( name_.c_str() ), sizeof( char ) * nameLength_ );
+ out_.write( ( char* )( name_.c_str() ), sizeof( char ) * nameLength_ );
writeToOut( out_, pos_ );
- writeToOut( out_, status_ );
writeToOut( out_, vesselID_ );
}
@@ -309,18 +307,38 @@
Ogre::Vector3 position() const { return pos_; }
- Uint8 status( ) const { return status_; }
-
Uint16 vesselID() const { return vesselID_; }
protected:
Uint16 nameLength_;
std::string name_;
Ogre::Vector3 pos_;
- Uint8 status_;
Uint16 vesselID_;
};
+class MessageBodyShipDeRegister : public MessageBodyShipBase {
+public:
+ MessageBodyShipDeRegister( const Uint32 senderID, const Uint8 childID ): MessageBodyShipBase( childID ){
+ senderID_ = senderID;
+ type_ = (Uint8)PROTO_SHIPDEREGISTER;
+ }
+
+ MessageBodyShipDeRegister( const char * data ) : MessageBodyShipBase( data ){ }
+
+ virtual ~MessageBodyShipDeRegister( ){ }
+
+ void createOutStream() {
+ MessageBodyShipBase::createOutStream();
+ }
+
+ friend std::ostream & operator << ( std::ostream & str, const MessageBodyShipDeRegister & msg ){
+ str << "Type: " << (int)( msg.type() ) << " senderID: " << msg.senderID() << " childID: " << msg.childID();
+ return str;
+ }
+
+protected:
+};
+
class MessageBodyShipMovement : public MessageBodyShipBase {
public:
MessageBodyShipMovement( Uint8 childID, const Ogre::Vector3 & pos,
@@ -374,6 +392,14 @@
Uint16 sequenceNr( ) const { return seqNr_; }
+ friend std::ostream & operator << ( std::ostream & str, const MessageBodyShipMovement & msg ){
+ str << "Type: " << (int)( msg.type() ) << " senderID: " << msg.senderID() << std::endl;
+ str << "pos: " << msg.position() << " vel: " << msg.velocity() << " orient: " << msg.orientation() << std::endl;
+ str << "thrust: " << msg.thrust() <<
+ " yaw: " << msg.yaw() << " pitch: " << msg.pitch() << " roll: " << msg.roll();
+ return str;
+ }
+
protected:
Ogre::Vector3 pos_;
Ogre::Vector3 vel_;
Modified: branches/ogsector/src/networkServer.cpp
===================================================================
--- branches/ogsector/src/networkServer.cpp 2007-04-30 16:27:17 UTC (rev 424)
+++ branches/ogsector/src/networkServer.cpp 2007-04-30 17:59:31 UTC (rev 425)
@@ -103,14 +103,14 @@
allUsers_.send( chat );
}
-UserObject * Server::createUserObject( UserSession * user, const std::string & name, int userID, int childID ){
+UserObject * Server::createUserObject( UserSession * user, const std::string & name, int userID, int childID, int vesselID ){
UserObject * obj = NULL;
long id = createGlobalID( userID, childID );
if ( !userObjects_.count( id ) ){
log_->info( std::string( "Create user object: " ) + name );
- obj = new UserObject( user, name, childID );
+ obj = new UserObject( user, name, childID, vesselID );
user->insertChild( obj );
userObjects_[ id ] = obj;
} else {
@@ -129,67 +129,74 @@
delete obj;
}
-void Server::receiveShipRegister( UserSession * user, const MessageBodyShipRegister & msg ){
- std::string name = msg.name();
+void Server::receiveShipRegister( UserSession * user, const MessageBodyShipRegister & msgIn ){
+ std::string name = msgIn.name();
int userID = user->userID();
- int childID = msg.childID();
- Ogre::Vector3 pos = msg.position();
+ int childID = msgIn.childID();
+ int vesselID = msgIn.vesselID();
+ int senderID = msgIn.senderID();
+ Ogre::Vector3 pos = msgIn.position();
- log_->info( std::string( "receiveShipRegister: " ) + name + " " + toStr((int)msg.status()) );
+ log_->info( std::string( "receiveShipRegister from " ) + toStr( senderID ) + " " + name + " " +
+ " " + toStr( vesselID ) );
UserObject *obj;
+ obj = createUserObject( user, name, userID, childID, vesselID );
- if ( msg.status() == false ){
- if ( ( obj = userObjects_[ createGlobalID( userID, childID ) ] ) != NULL ){
- deRegisterUserObject( obj );
- } else{
- log_->info( std::string( "Deregister request for non existing object " ) + name );
- }
- } else {
- obj = createUserObject( user, name, userID, childID );
+ if ( obj != NULL ){
+ obj->setPosition( pos );
- if ( obj != NULL ){
- obj->setPosition( pos );
+ if ( obj->status() != Registered ){
+ log_->info( std::string( "Register: " ) + obj->name() );
+ obj->setStatus( Registered );
- if ( obj->status() != Registered ){
- log_->info( std::string( "Register: " ) + obj->name() );
- obj->setStatus( Registered );
+ //** first register all userobjects to the new object;
+ for ( std::map < long, UserObject * >::iterator it = userObjects_.begin(); it != userObjects_.end(); it ++ ){
- std::map < long, UserObject * >::iterator it;
- for ( it = userObjects_.begin(); it != userObjects_.end(); it ++ ){
-
- //** atm all is global;
- obj->joinRange( it->second );
+ //** atm all is global;
+ obj->joinRange( it->second );
+
+ //** if the object is no child, register all objects to them;
+ if ( !obj->isChild() && ( obj->userID() != it->second->userID() ) ){
+ log_->info( std::string( "\tSend register: " ) + obj->userName() + " <- " + it->second->name() );
- //** if the object is no child, register all objects to them;
- if ( !obj->isChild() && ( obj->userID() != it->second->userID() ) ){
- log_->info( std::string( "\tSend to user: " ) + obj->userName()
- + " object: " + it->second->name() );
-
- MessageBodyShipRegister msg( it->second->userID(), it->second->childID(),
- it->second->name(), it->second->position(),
- true, msg.vesselID() );
- obj->parent()->send( msg );
- }
-
- if ( !it->second->isChild() && ( obj->userID() != it->second->userID() ) ){
- log_->info( std::string( "\tSend to user: " ) + it->second->userName()
- + " object: " + obj->name() );
-
- MessageBodyShipRegister msg( obj->userID(), obj->childID(), obj->name(), obj->position(),
- true, msg.vesselID() );
- it->second->parent()->send( msg );
- }
- }
- } else {
- log_->info( std::string( "object: " ) + name + " already registered. " );
+ MessageBodyShipRegister msg( it->second->userID(), it->second->childID(),
+ it->second->name(), it->second->position(),
+ it->second->vesselID() );
+ obj->parent()->send( msg );
+ }
}
+
+ //** second register the new object to all existing objects in range;
+ MessageBodyShipRegister msg( obj->userID(), obj->childID(), obj->name(), obj->position(), obj->vesselID() );
+
+ // ** atm just global;
+ for ( std::map < long, UserObject * >::iterator it = userObjects_.begin(); it != userObjects_.end(); it ++ ){
+
+ if ( !it->second->isChild() && ( obj->parent() != it->second->parent() ) ){
+ log_->info( std::string( "\tSend register: " ) + obj->name() + " -> " + it->second->userName() );
+ it->second->parent()->send( msg );
+ }
+ }
} else {
- log_->info( std::string( "Cannot register object: " ) + name );
+ log_->warn( std::string( "object: " ) + name + " already registered. " );
}
+ } else {
+ log_->fatal( std::string( "Cannot create ...
[truncated message content] |