Changeset 10622 for code/trunk/src
- Timestamp:
- Oct 4, 2015, 3:45:56 PM (9 years ago)
- Location:
- code/trunk
- Files:
-
- 4 deleted
- 52 edited
- 14 copied
Legend:
- Unmodified
- Added
- Removed
-
code/trunk
- Property svn:mergeinfo changed
-
code/trunk/src/libraries/network/GamestateManager.h
r8402 r10622 1 /*1 /* 2 2 * ORXONOX - the hottest 3D action shooter ever to exist 3 3 * > www.orxonox.net < … … 78 78 std::map< uint32_t, packet::Gamestate* > gamestates; 79 79 }; 80 80 81 81 public: 82 82 83 83 GamestateManager(); 84 84 ~GamestateManager(); … … 88 88 virtual uint32_t getLastReceivedGamestateID( unsigned int peerID ); 89 89 virtual uint32_t getCurrentGamestateID(){ if( currentGamestate_) return currentGamestate_->getID(); else return GAMESTATEID_INITIAL; } 90 90 91 91 bool processGamestates(); 92 92 bool sendAck(unsigned int gamestateID, uint32_t peerID); -
code/trunk/src/libraries/network/LANDiscoverable.cc
r8858 r10622 35 35 #include "util/Output.h" 36 36 #include "packet/ServerInformation.h" 37 #include "core/config/ConfigValueIncludes.h" 38 #include "core/CoreIncludes.h" 39 37 40 38 41 namespace orxonox … … 43 46 LANDiscoverable::LANDiscoverable() 44 47 { 48 /* register object in orxonox */ 49 RegisterObject(LANDiscoverable); 50 51 this->setConfigValues(); 52 // this->setActivity(true); 45 53 this->host_ = 0; 46 54 this->bActive_ = false; 47 // this->setActivity(true); 55 } 56 57 void LANDiscoverable::setConfigValues() 58 { 59 /* update ownName string from orxonox.ini config file, if it 60 * has changed. 61 */ 62 SetConfigValueExternal(ownName, "Discovery", "ownName", "OrxServer"); 48 63 } 49 64 … … 61 76 if( bActive == this->bActive_ ) // no change 62 77 return; 63 78 64 79 if( bActive ) 65 80 { … … 84 99 { 85 100 ENetEvent event; 86 101 87 102 if( this->bActive_==false ) 88 103 return; 89 104 assert(this->host_); 90 105 91 106 while( enet_host_service( this->host_, &event, 0 ) > 0 ) 92 107 { … … 104 119 orxout(internal_info, context::network) << "Received LAN discovery message from client " << event.peer->host->receivedAddress << endl; 105 120 packet::ServerInformation info; 106 info.setServerName("Orxonox Server"); 121 info.setServerName(this->ownName); 122 info.setClientNumber(this->clientNumber); 107 123 info.send(event.peer); 108 124 // ENetPacket* packet = enet_packet_create( LAN_DISCOVERY_ACK, strlen(LAN_DISCOVERY_ACK)+1, ENET_PACKET_FLAG_RELIABLE ); -
code/trunk/src/libraries/network/LANDiscoverable.h
r8351 r10622 31 31 32 32 #include "NetworkPrereqs.h" 33 #include "core/config/Configurable.h" 33 34 34 35 namespace orxonox 35 36 { 36 37 37 class LANDiscoverable 38 class LANDiscoverable: public Configurable 38 39 { 39 40 public: … … 42 43 void setActivity( bool bActive ); 43 44 void update(); 45 void updateClientNumber(int clientNumber) {this->clientNumber = clientNumber;} 46 ; 47 /** Function used for the configuration file parameter update */ 48 void setConfigValues(); 44 49 45 50 private: 46 51 bool bActive_; 47 52 ENetHost* host_; 53 std::string ownName; 54 int clientNumber; 48 55 }; 49 56 -
code/trunk/src/libraries/network/LANDiscovery.cc
r8858 r10622 89 89 { 90 90 packet::ServerInformation info(&event); 91 orxout(internal_info, context::network) << "Received LAN discovery server information; Name: " << info.getServerName() << ", Address: " << info.getServerIP() << ", RTT: " << info.getServerRTT() << endl; 91 std::string payload = info.getServerName(); 92 info.setServerName(payload.substr(0,payload.length()-2)); 93 info.setClientNumber( Ogre::StringConverter::parseInt(payload.substr(payload.length()-1))); 94 orxout(internal_info, context::network) << "Received LAN discovery server information; Name: " << info.getServerName() << ", Address: " << info.getServerIP() << ", Players: " << info.getClientNumber() << ", RTT: " << info.getServerRTT() << endl; 92 95 std::vector<packet::ServerInformation>::iterator it; 93 96 for( it=this->servers_.begin(); it!=this->servers_.end(); ++it ) … … 124 127 } 125 128 129 std::string LANDiscovery::getServerListItemRTT(unsigned int index) 130 { 131 if( index >= this->servers_.size() ) 132 return BLANKSTRING; 133 else{ 134 uint32_t serverrtt = this->servers_[index].getServerRTT(); 135 return Ogre::StringConverter::toString(serverrtt); 136 } 137 } 126 138 139 std::string LANDiscovery::getServerListItemPlayerNumber(unsigned int index) 140 { 141 if( index >= this->servers_.size() ) 142 return BLANKSTRING; 143 else{ 144 int playerNumber = this->servers_[index].getClientNumber(); 145 return Ogre::StringConverter::toString(playerNumber); 146 } 147 } 127 148 } // namespace orxonox -
code/trunk/src/libraries/network/LANDiscovery.h
r8858 r10622 33 33 #include "packet/ServerInformation.h" 34 34 #include "util/Singleton.h" 35 #include <OgreStringConverter.h> 35 36 36 37 #include <vector> … … 51 52 std::string getServerListItemName( unsigned int index ); // tolua_export 52 53 std::string getServerListItemIP( unsigned int index ); // tolua_export 54 std::string getServerListItemRTT( unsigned int index ); // tolua_export 55 std::string getServerListItemPlayerNumber( unsigned int index ); // tolua_export 53 56 static LANDiscovery& getInstance(){ return Singleton<LANDiscovery>::getInstance(); } // tolua_export 54 57 55 58 private: 56 59 static LANDiscovery* singletonPtr_s; -
code/trunk/src/libraries/network/MasterServer.cc
r8952 r10622 34 34 #include "util/Output.h" 35 35 36 namespace orxonox 36 namespace orxonox 37 37 { 38 38 /*** MACROS ***/ … … 45 45 MasterServer *MasterServer::instance = NULL; 46 46 47 48 49 50 47 /* command: list servers */ 51 void 48 void 52 49 MasterServer::listServers( void ) 53 50 { … … 59 56 60 57 /* loop through list elements */ 61 for( i = MasterServer::getInstance()->mainlist.serverlist.begin(); 62 i != MasterServer::getInstance()->mainlist.serverlist.end(); ++i ) 58 for( i = MasterServer::getInstance()->mainlist.serverlist.begin(); 59 i != MasterServer::getInstance()->mainlist.serverlist.end(); ++i ) 63 60 { 64 61 orxout(user_info) << " " << (*i).ServerInfo.getServerIP() << std::endl; … … 70 67 } 71 68 72 void 69 void 73 70 MasterServer::delServer( std::string todeladdr ) 74 71 { 75 72 /* tell the user we're now removing the entry from the server list */ 76 orxout(user_info) << "MS: Deleting server \"" << todeladdr << "\"..." 73 orxout(user_info) << "MS: Deleting server \"" << todeladdr << "\"..." 77 74 << std::endl; 78 75 79 76 /* see if we actually have that server on our list */ 80 ServerListSearchResult shandle = 77 ServerListSearchResult shandle = 81 78 MasterServer::getInstance()->mainlist.findServerByAddress(todeladdr); 82 79 … … 86 83 } 87 84 88 /* force-disconnect the server */ 85 /* force-disconnect the server */ 89 86 enet_peer_disconnect( shandle.result.peer, 0 ); 90 87 … … 98 95 99 96 /* helpers */ 100 static void 97 static void 101 98 helper_output_debug( ENetEvent *event, char *addrconv ) 102 99 { 103 100 orxout(verbose, context::master_server) 104 << "A packet of length" 101 << "A packet of length" 105 102 << event->packet->dataLength 106 103 << " containing " 107 104 << (const char*)event->packet->data 108 105 << " was received from " 109 << addrconv 106 << addrconv 110 107 << " on channel " 111 108 << event->channelID << endl; … … 122 119 123 120 /* loop through list elements */ 124 for( i = mainlist.serverlist.begin(); i 125 != mainlist.serverlist.end(); ++i ) 121 for( i = mainlist.serverlist.begin(); i 122 != mainlist.serverlist.end(); ++i ) 126 123 { 127 124 /* send this particular server */ 128 125 /* build reply string */ 129 char *tosend = (char *)calloc( (*i).ServerInfo.getServerIP().length()130 + MSPROTO_SERVERLIST_ITEM_LEN + 2,1 );131 if( !tosend ) 126 int packetlen = MSPROTO_SERVERLIST_ITEM_LEN + 1 + (*i).ServerInfo.getServerIP().length() + 1 + (*i).ServerInfo.getServerName().length() + 1 + sizeof((*i).ServerInfo.getClientNumber()) + 1; 127 char *tosend = (char *)calloc(packetlen ,1 ); 128 if( !tosend ) 132 129 { orxout(internal_warning, context::master_server) << "Masterserver.cc: Memory allocation failed." << endl; 133 130 continue; 134 } 135 sprintf( tosend, "%s %s ", MSPROTO_SERVERLIST_ITEM,136 (*i).ServerInfo.getServerIP().c_str() 131 } 132 sprintf( tosend, "%s %s %s %u", MSPROTO_SERVERLIST_ITEM, 133 (*i).ServerInfo.getServerIP().c_str(), (*i).ServerInfo.getServerName().c_str(), (*i).ServerInfo.getClientNumber()); 137 134 138 135 /* create packet from it */ 139 136 reply = enet_packet_create( tosend, 140 strlen( tosend ) + 1, 137 strlen( tosend ) + 1, 141 138 ENET_PACKET_FLAG_RELIABLE); 142 139 … … 149 146 /* free the tosend buffer */ 150 147 free( tosend ); 151 } 148 } 152 149 153 150 /* create end-of-list packet */ … … 163 160 } 164 161 165 /* maybe the two methods below can be merged into one and 166 * made to use ENet's RTT functionality to check for disconnected 162 /* maybe the two methods below can be merged into one and 163 * made to use ENet's RTT functionality to check for disconnected 167 164 * servers. 168 165 */ 169 void 166 void 170 167 MasterServer::helper_cleanupServers( void ) 171 168 { 172 169 /* get an iterator */ 173 170 std::list<ServerListElem>::iterator i; 174 171 175 172 if( mainlist.serverlist.size() == 0 ) 176 173 return; 177 174 178 175 /* loop through list elements */ 179 for( i = mainlist.serverlist.begin(); i 180 != mainlist.serverlist.end(); ++i ) 176 for( i = mainlist.serverlist.begin(); i 177 != mainlist.serverlist.end(); ++i ) 181 178 { /* see if we have a disconnected peer */ 182 if( (*i).peer && 179 if( (*i).peer && 183 180 ((*i).peer->state == ENET_PEER_STATE_DISCONNECTED || 184 181 (*i).peer->state == ENET_PEER_STATE_ZOMBIE )) 185 { 182 { 186 183 /* Remove it from the list */ 187 184 orxout(internal_warning) << (char*)(*i).peer->data << " timed out.\n"; … … 190 187 /* stop iterating, we manipulated the list */ 191 188 /* TODO note: this only removes one dead server per loop 192 * iteration. not beautiful, but one iteration is ~100ms, 189 * iteration. not beautiful, but one iteration is ~100ms, 193 190 * so not really relevant for the moment. 194 191 */ … … 196 193 } 197 194 } 198 195 199 196 } 200 197 … … 204 201 /***** EVENTS *****/ 205 202 /* connect event */ 206 int 203 int 207 204 MasterServer::eventConnect( ENetEvent *event ) 208 205 { /* check for bad parameters */ … … 217 214 218 215 /* output debug info */ 219 orxout(verbose, context::master_server) << "A new client connected from " 220 << addrconv 221 << " on port " 216 orxout(verbose, context::master_server) << "A new client connected from " 217 << addrconv 218 << " on port " 222 219 << event->peer->address.port << endl; 223 220 224 221 /* store string form of address here */ 225 event->peer->data = addrconv; 222 event->peer->data = addrconv; 226 223 227 224 /* all fine. */ … … 230 227 231 228 /* disconnect event */ 232 int 229 int 233 230 MasterServer::eventDisconnect( ENetEvent *event ) 234 231 { /* check for bad parameters */ … … 255 252 256 253 /* data event */ 257 int 254 int 258 255 MasterServer::eventData( ENetEvent *event ) 259 256 { /* validate packet */ … … 262 259 return -1; 263 260 } 264 261 265 262 /* generate address in readable form */ 266 263 char *addrconv = (char *) calloc( 50, 1 ); 267 264 enet_address_get_host_ip( &(event->peer->address), addrconv, 49 ); 265 /* convert to string */ 266 std::string ip = std::string( addrconv ); 267 /* delete addrconv */ 268 if( addrconv ) free( addrconv ); 269 270 /* pointer to full packet data */ 271 char * packetdata = (char *)event->packet->data; 268 272 269 273 /* output debug info about the data that has come */ … … 271 275 272 276 /* GAME SERVER OR CLIENT CONNECTION? */ 273 if( !strncmp( (char *)event->packet->data, MSPROTO_GAME_SERVER, 274 MSPROTO_GAME_SERVER_LEN ) ) 277 if( !strncmp(packetdata, MSPROTO_GAME_SERVER, MSPROTO_GAME_SERVER_LEN ) ) 275 278 { /* Game server */ 276 279 277 if( !strncmp( (char *)event->packet->data 278 + MSPROTO_GAME_SERVER_LEN+1, 279 MSPROTO_REGISTER_SERVER, MSPROTO_REGISTER_SERVER_LEN ) ) 280 if( !strncmp( packetdata + MSPROTO_GAME_SERVER_LEN+1, MSPROTO_REGISTER_SERVER, MSPROTO_REGISTER_SERVER_LEN ) ) 280 281 { /* register new server */ 281 mainlist.addServer( packet::ServerInformation( event ), 282 event->peer ); 283 282 mainlist.addServer( packet::ServerInformation( event ), event->peer ); 283 284 284 /* tell people we did so */ 285 orxout(internal_info, context::master_server) << "Added new server to list: " << 285 orxout(internal_info, context::master_server) << "Added new server to list: " << 286 286 packet::ServerInformation( event ).getServerIP() << endl; 287 287 } 288 288 289 else if( !strncmp( (char *)event->packet->data 290 + MSPROTO_GAME_SERVER_LEN+1, 291 MSPROTO_SERVERDC, MSPROTO_SERVERDC_LEN ) ) 292 { 289 else if( !strncmp( packetdata + MSPROTO_GAME_SERVER_LEN+1, MSPROTO_SERVERDC, MSPROTO_SERVERDC_LEN ) ) 290 { /* disconnect server */ 291 292 /* remove the server from the list it belongs to */ 293 this->mainlist.delServerByAddress( ip ); 294 295 /* tell the user */ 296 orxout(internal_info, context::master_server) << "Removed server " << ip << " from list." << endl; 297 } 298 /* TODO add hook for disconnect here */ 299 300 else if( !strncmp( packetdata + MSPROTO_GAME_SERVER_LEN+1, MSPROTO_SET_NAME, MSPROTO_SET_NAME_LEN ) ) 301 { /* save server name */ 293 302 /* create string from peer data */ 294 std::string name = std::string( addrconv ); 303 std::string data (event->packet->data,event->packet->data + event->packet->dataLength ); 304 std::string name = data.substr(MSPROTO_GAME_SERVER_LEN+1 + MSPROTO_SET_NAME_LEN + 1); 295 305 296 306 /* remove the server from the list it belongs to */ 297 this->mainlist. delServerByAddress(name );307 this->mainlist.setNameByAddress( ip, name ); 298 308 299 309 /* tell the user */ 300 orxout(internal_info, context::master_server) << "Removed server " << name << " from list." << endl; 301 } 302 303 /* TODO add hook for disconnect here */ 304 } 305 else if( !strncmp( (char *)event->packet->data, MSPROTO_CLIENT, 306 MSPROTO_CLIENT_LEN) ) 310 orxout(internal_info, context::master_server) << "Updated server " << ip << " with new name " << name << endl; 311 } 312 313 else if( !strncmp( packetdata + MSPROTO_GAME_SERVER_LEN+1, MSPROTO_SET_CLIENTS, MSPROTO_SET_CLIENTS_LEN ) ) 314 { /* save client count from server */ 315 /* create string from peer data */ 316 std::string data (event->packet->data,event->packet->data + event->packet->dataLength ); 317 std::string textform= data.substr(MSPROTO_GAME_SERVER_LEN + 1 + MSPROTO_SET_CLIENTS_LEN + 1); 318 int clientNumber = Ogre::StringConverter::parseInt(textform); 319 320 this->mainlist.setClientsByAddress( ip, clientNumber); 321 322 /* tell the user */ 323 orxout(internal_info, context::master_server) << "Updated server " << ip << " with new client number " << clientNumber << endl; 324 } 325 } 326 else if( !strncmp( packetdata, MSPROTO_CLIENT, MSPROTO_CLIENT_LEN) ) 307 327 { /* client */ 308 if( !strncmp( (char *)event->packet->data + MSPROTO_CLIENT_LEN+1, 309 MSPROTO_REQ_LIST, MSPROTO_REQ_LIST_LEN ) ) 328 if( !strncmp( packetdata + MSPROTO_CLIENT_LEN+1, MSPROTO_REQ_LIST, MSPROTO_REQ_LIST_LEN ) ) 310 329 /* send server list */ 311 330 helper_sendlist( event ); 312 331 } 313 332 else 314 { /* bad message, don't do anything. */ } 315 316 /* delete addrconv */ 317 if( addrconv ) free( addrconv ); 333 { /* bad message, don't do anything. */ } 318 334 319 335 /* Clean up the packet now that we're done using it. */ … … 324 340 325 341 /**** MAIN ROUTINE *****/ 326 int 342 int 327 343 MasterServer::run() 328 344 { … … 330 346 ENetEvent *event = (ENetEvent *)calloc(sizeof(ENetEvent), sizeof(char)); 331 347 if( event == NULL ) 332 { 348 { 333 349 orxout(user_error, context::master_server) << "Could not create ENetEvent structure, exiting." << endl; 334 350 exit( EXIT_FAILURE ); … … 345 361 switch (event->type) 346 362 { /* new connection */ 347 case ENET_EVENT_TYPE_CONNECT: 363 case ENET_EVENT_TYPE_CONNECT: 348 364 eventConnect( event ); break; 349 365 350 366 /* disconnect */ 351 case ENET_EVENT_TYPE_DISCONNECT: 367 case ENET_EVENT_TYPE_DISCONNECT: 352 368 eventDisconnect( event ); break; 353 369 … … 358 374 359 375 /* done */ 376 free(event); 360 377 return 0; 361 } 378 } 362 379 363 380 /* constructor */ … … 380 397 this->address.port = ORX_MSERVER_PORT; 381 398 382 /* create a host with the above settings (the last two 0 mean: accept 399 /* create a host with the above settings (the last two 0 mean: accept 383 400 * any input/output bandwidth */ 384 this->server = enet_host_create( &this->address, ORX_MSERVER_MAXCONNS, 401 this->server = enet_host_create( &this->address, ORX_MSERVER_MAXCONNS, 385 402 ORX_MSERVER_MAXCHANS, 0, 0 ); 386 403 assert(this->server); … … 388 405 /* see if creation worked */ 389 406 if( !this->server ) 390 { orxout(user_error, context::master_server) << 407 { orxout(user_error, context::master_server) << 391 408 "An error occurred while trying to create an ENet server host." << endl; 392 409 exit( EXIT_FAILURE ); -
code/trunk/src/libraries/network/MasterServer.h
r8937 r10622 49 49 #include <cstdio> 50 50 51 namespace orxonox 51 #include <OgreStringConverter.h> 52 53 54 namespace orxonox 52 55 { 53 56 /* singleton */ … … 63 66 /* static pointer for commands */ 64 67 static MasterServer *instance; 65 static MasterServer *getInstance() 68 static MasterServer *getInstance() 66 69 { return instance; } 67 static void setInstance( MasterServer *setto ) 70 static void setInstance( MasterServer *setto ) 68 71 { instance = setto; } 69 72 70 73 /* functions for commands */ 71 74 static void listServers( void ); -
code/trunk/src/libraries/network/MasterServerProtocol.h
r8351 r10622 37 37 /* Client token (shows that the party sending data is a client */ 38 38 #define MSPROTO_CLIENT "CL" 39 #define MSPROTO_CLIENT_LEN 2 39 #define MSPROTO_CLIENT_LEN 2 40 40 41 41 /* Request: Serverlist (requiest made from client to master server */ 42 42 #define MSPROTO_REQ_LIST "REQ:LIST" 43 43 #define MSPROTO_REQ_LIST_LEN 8 44 45 46 44 47 45 … … 67 65 /* ping request from server */ 68 66 #define MSPROTO_PING_GAMESERVER "PING" 69 #define MSPROTO_PING_GAMESERVER_LEN 4 67 #define MSPROTO_PING_GAMESERVER_LEN 4 70 68 71 69 /* server disconnect */ … … 75 73 /* ping reply */ 76 74 #define MSPROTO_ACK "ACK" 77 #define MSPROTO_ACK_LEN 3 75 #define MSPROTO_ACK_LEN 3 78 76 77 /* server name */ 78 #define MSPROTO_SET_NAME "NAM" 79 #define MSPROTO_SET_NAME_LEN 3 79 80 81 /* server number of clients */ 82 #define MSPROTO_SET_CLIENTS "CLI" 83 #define MSPROTO_SET_CLIENTS_LEN 3 84 85 #define SERVER_NAME_MAXLEN 7 80 86 81 87 /* default master server port */ -
code/trunk/src/libraries/network/PeerList.cc
r8858 r10622 38 38 PeerList::~PeerList() { } 39 39 40 int 40 int 41 41 PeerList::addPeer( ENetPeer *toadd ) 42 42 { /* error correction */ 43 if( toadd == NULL ) 43 if( toadd == NULL ) 44 44 { orxout(internal_error, context::master_server) << "PeerList::addPeer: empty peer given." << endl; 45 45 return -1; … … 52 52 53 53 bool sub_compAddr( ENetAddress addr1, ENetAddress addr2 ) 54 { 54 { 55 55 for( int i = 0; i < 16; ++i ) 56 56 if( addr1.host.addr[i] < addr2.host.addr[i] ) … … 61 61 return 0; 62 62 } 63 63 64 64 65 65 bool … … 69 69 70 70 /* loop through list elements */ 71 for( i = peerlist.begin(); i != peerlist.end(); ++i ) 71 for( i = peerlist.begin(); i != peerlist.end(); ++i ) 72 72 if( !sub_compAddr((*i)->address, addr ) ) 73 73 { /* found this name, remove and quit */ … … 86 86 87 87 /* loop through list elements */ 88 for( i = peerlist.begin(); i != peerlist.end(); ++i ) 88 for( i = peerlist.begin(); i != peerlist.end(); ++i ) 89 89 if( !sub_compAddr((*i)->address, addr ) ) 90 90 /* found this name, remove and quit */ … … 95 95 } 96 96 97 int 98 PeerList::count(){ 99 return this->peerlist.size(); 100 } 101 97 102 } 98 -
code/trunk/src/libraries/network/PeerList.h
r8351 r10622 35 35 36 36 /* peer list */ 37 namespace orxonox 37 namespace orxonox 38 38 { 39 /** This class keeps a list of open connections 39 /** This class keeps a list of open connections 40 40 * and some info about them. 41 41 */ 42 class PeerList 42 class PeerList 43 43 { public: 44 44 /** constructor */ … … 50 50 /** \param toadd The peer to add 51 51 * \return 0 for success, -1 for error. 52 * 53 * Add new peer to list 52 * 53 * Add new peer to list 54 54 */ 55 55 int addPeer( ENetPeer *toadd ); … … 57 57 /** \param addr Address to look for 58 58 * \return if the peer was found or not 59 * 60 * Remove peer from list by address 59 * 60 * Remove peer from list by address 61 61 */ 62 62 bool remPeerByAddr( ENetAddress addr ); 63 63 64 64 /** \param addr The address to find by 65 * 66 * Find a connection by address */ 65 * 66 * Find a connection by address 67 */ 67 68 ENetPeer *findPeerByAddr( ENetAddress addr ); 68 69 69 /* NOTE: making this list public so it can easily 70 /** 71 * Count current peers 72 */ 73 int count(); 74 75 /* NOTE: making this list public so it can easily 70 76 * be iterated. This makes sense since iterating it 71 77 * will happen all the time, and using getter methods -
code/trunk/src/libraries/network/Server.cc
r9667 r10622 77 77 this->timeSinceLastUpdate_=0; 78 78 } 79 79 /* 80 Server::Server(int port, const std::string name) 81 { 82 this->setPort( port ); 83 this->timeSinceLastUpdate_=0; 84 this->serverName_=name; 85 }*/ 80 86 /** 81 87 * Constructor … … 108 114 /* make discoverable on LAN */ 109 115 LANDiscoverable::setActivity(true); 116 LANDiscoverable::updateClientNumber(0); 110 117 111 118 /* make discoverable on WAN */ 112 119 WANDiscoverable::setActivity(true); 120 WANDiscoverable::updateClientNumber(0); 113 121 114 122 /* done */ … … 283 291 // inform all the listeners 284 292 this->clientIDs_.push_back(peerID); 293 WANDiscoverable::updateClientNumber(this->clientIDs_.size()); 294 LANDiscoverable::updateClientNumber(this->clientIDs_.size()); 295 285 296 ClientConnectionListener::broadcastClientConnected(peerID); 286 297 GamestateManager::addPeer(peerID); … … 289 300 290 301 orxout(internal_info, context::network) << "Server: added client id: " << peerID << endl; 302 291 303 createClient(peerID); 292 304 } … … 309 321 } 310 322 } 323 WANDiscoverable::updateClientNumber(this->clientIDs_.size()); 324 LANDiscoverable::updateClientNumber(this->clientIDs_.size()); 325 311 326 ClientConnectionListener::broadcastClientDisconnected(peerID); 312 327 GamestateManager::removePeer(peerID); -
code/trunk/src/libraries/network/Server.h
r8858 r10622 67 67 virtual void printRTT(); 68 68 float getPacketLoss(unsigned int clientID); 69 int getClientCount() { return this->clientIDs_.size();} 70 std::string getServerName() { return this->serverName_;} 71 69 72 protected: 70 73 void updateGamestate(); … … 89 92 std::deque<packet::Packet*> packetQueue_; 90 93 std::vector<uint32_t> clientIDs_; 94 std::string serverName_; 91 95 }; 92 96 -
code/trunk/src/libraries/network/ServerList.cc
r8937 r10622 30 30 31 31 namespace orxonox 32 { 32 { 33 33 ServerList::ServerList() 34 34 { /* create a new list */ } … … 39 39 } 40 40 41 int 41 int 42 42 ServerList::addServer( packet::ServerInformation toadd, 43 43 ENetPeer *peer ) 44 { 44 { 45 45 ServerListElem toAdd; 46 46 toAdd.ServerInfo = toadd; 47 47 toAdd.peer = peer; 48 48 49 this->serverlist.push_back( toAdd ); 49 this->serverlist.push_back( toAdd ); 50 50 return 0; 51 51 } 52 52 53 bool 53 bool 54 54 ServerList::delServerByName( std::string name ) 55 { 55 { 56 56 /* get an iterator */ 57 57 std::list<ServerListElem>::iterator i; 58 58 59 59 /* loop through list elements */ 60 for( i = serverlist.begin(); i != serverlist.end(); ++i ) 60 for( i = serverlist.begin(); i != serverlist.end(); ++i ) 61 61 if( (*i).ServerInfo.getServerName() == name ) 62 62 { /* found this name, remove and quit */ … … 68 68 69 69 bool ServerList::delServerByAddress( std::string address ) 70 { 70 { 71 71 /* get an iterator */ 72 72 std::list<ServerListElem>::iterator i; 73 73 74 74 /* loop through list elements */ 75 for( i = serverlist.begin(); i != serverlist.end(); ++i ) 75 for( i = serverlist.begin(); i != serverlist.end(); ++i ) 76 76 if( (*i).ServerInfo.getServerIP() == address ) 77 77 { /* found this name, remove and quit */ … … 90 90 91 91 /* loop through list elements */ 92 for( i = serverlist.begin(); i != serverlist.end(); ++i ) 92 for( i = serverlist.begin(); i != serverlist.end(); ++i ) 93 93 if( (*i).ServerInfo.getServerIP() == address ) 94 94 { /* found the target, return it */ … … 110 110 /* iterate, return when name found */ 111 111 /* loop through list elements */ 112 for( i = serverlist.begin(); i != serverlist.end(); ++i ) 112 for( i = serverlist.begin(); i != serverlist.end(); ++i ) 113 113 if( (*i).ServerInfo.getServerName() == name ) 114 { 114 { 115 115 ServerListSearchResult res = { (*i), true }; 116 116 return res; … … 124 124 /* SORTING */ 125 125 /* sort by name */ 126 bool sub_compare_names( ServerListElem no1, 126 bool sub_compare_names( ServerListElem no1, 127 127 ServerListElem no2 ) 128 128 { return no1.ServerInfo.getServerName() > no2.ServerInfo.getServerName(); } 129 129 130 130 void ServerList::sortByName() 131 { 132 this->serverlist.sort( sub_compare_names ); 131 { 132 this->serverlist.sort( sub_compare_names ); 133 133 } 134 134 135 135 /* sort by ping */ 136 bool sub_compare_pings( ServerListElem no1, 136 bool sub_compare_pings( ServerListElem no1, 137 137 ServerListElem no2 ) 138 { 139 return no1.ServerInfo.getServer Name() > no2.ServerInfo.getServerName();138 { 139 return no1.ServerInfo.getServerRTT() > no2.ServerInfo.getServerRTT(); 140 140 } 141 141 142 142 void ServerList::sortByPing() 143 143 { 144 this->serverlist.sort( sub_compare_pings ); 144 this->serverlist.sort( sub_compare_pings ); 145 145 } 146 146 147 bool ServerList::setNameByAddress( std::string address, std::string name ){ 148 /* get an iterator */ 149 std::list<ServerListElem>::iterator i; 150 151 /* loop through list elements */ 152 for( i = serverlist.begin(); i != serverlist.end(); ++i ) 153 if( (*i).ServerInfo.getServerIP() == address ) 154 { /* found this adress, rename and quit */ 155 (*i).ServerInfo.setServerName( name ); 156 return true; 157 } 158 return false; 159 }; 160 161 bool ServerList::setClientsByAddress( std::string address, int clientNumber ){ 162 /* get an iterator */ 163 std::list<ServerListElem>::iterator i; 164 165 /* loop through list elements */ 166 for( i = serverlist.begin(); i != serverlist.end(); ++i ) 167 if( (*i).ServerInfo.getServerIP() == address ) 168 { /* found this adress, rename and quit */ 169 (*i).ServerInfo.setClientNumber( clientNumber ); 170 return true; 171 } 172 return false; 173 }; 174 147 175 } -
code/trunk/src/libraries/network/ServerList.h
r8937 r10622 35 35 36 36 /* methods necessary */ 37 namespace orxonox 38 { 37 namespace orxonox 38 { 39 39 /* HELPER STRUCTURES */ 40 struct ServerListElem 40 struct ServerListElem 41 41 { 42 42 /* server information (name, IP, etc) */ … … 63 63 * and some info about them. 64 64 */ 65 class ServerList 65 class ServerList 66 66 { public: 67 67 /** constructor */ … … 74 74 /* BASIC MANIPULATION */ 75 75 /** \param toadd the server to add. 76 * 76 * 77 77 * Add server to the game server list 78 78 */ … … 81 81 82 82 /** \param name Name of the server to remove 83 * 84 * Remove server by name 83 * 84 * Remove server by name 85 85 */ 86 86 bool delServerByName( std::string name ); 87 87 88 88 /** \param address IP address of the server to remove 89 * 89 * 90 90 * Remove server by address 91 91 */ 92 92 bool delServerByAddress( std::string address ); 93 93 94 bool setNameByAddress( std::string address, std::string name ); 94 95 95 96 bool setClientsByAddress( std::string address, int clientNumber ); 96 97 97 98 /* SEARCHING */ 98 /* \param address The address of the server that is to be 99 /* \param address The address of the server that is to be 99 100 * found 100 101 * \return A struct containing a result of the search and a boolean 101 102 * that is only true if the search was successful 102 * 103 * 103 104 * Find and return the list handle of a given address. 104 105 */ … … 107 108 108 109 109 /* \param name The name of the server that is to be 110 /* \param name The name of the server that is to be 110 111 * found 111 112 * \return The struct containing the list entry of the server 112 * 113 * 113 114 * Find and return the list handle of a given name. 114 115 */ … … 120 121 /** sort by name */ 121 122 void sortByName(); 122 123 123 124 /** sort by ping */ 124 125 void sortByPing(); -
code/trunk/src/libraries/network/WANDiscoverable.cc
r9667 r10622 44 44 /* debugging output */ 45 45 orxout(verbose, context::master_server) << "Creating WANDiscoverable." << endl; 46 46 47 47 /* register object in orxonox */ 48 48 RegisterObject(WANDiscoverable); … … 50 50 /* check for the masterserver address option in orxonox.ini */ 51 51 this->setConfigValues(); 52 52 53 53 } 54 54 55 55 void WANDiscoverable::setConfigValues() 56 56 { 57 /* update msaddress string from orxonox.ini config file, if it 58 * has changed. 57 /* update msaddress string from orxonox.ini config file, if it 58 * has changed. 59 59 */ 60 SetConfigValueExternal(msaddress, " WANDiscovery", "msaddress", "orxonox.net");61 // SetConfigValue( msaddress, "orxonox.net");62 } 60 SetConfigValueExternal(msaddress, "Discovery", "msaddress", "orxonox.net"); 61 SetConfigValueExternal(ownName, "Discovery", "ownName", "OrxServer"); 62 } 63 63 64 64 WANDiscoverable::~WANDiscoverable() … … 67 67 this->disconnect(); 68 68 } 69 69 70 70 void WANDiscoverable::setActivity(bool bActive) 71 71 { 72 72 if( bActive==this->bActive_ ) 73 73 return; 74 74 75 75 if( bActive ) 76 76 { … … 84 84 } 85 85 } 86 86 87 87 bool WANDiscoverable::connect() 88 88 { … … 93 93 return false; 94 94 } 95 95 96 96 /* connect and see if it worked */ 97 97 if( msc.connect( this->msaddress.c_str(), ORX_MSERVER_PORT ) ) 98 98 { 99 orxout(internal_error, context::master_server) << "Could not connect to master server at " 99 orxout(internal_error, context::master_server) << "Could not connect to master server at " 100 100 << this->msaddress << endl; 101 101 return false; 102 102 } 103 103 104 104 /* debugging output */ 105 105 orxout(verbose, context::master_server) << "Initialization of WANDiscoverable complete." << endl; 106 107 106 108 107 // Now register the server at the master server 109 108 this->msc.sendRequest( MSPROTO_GAME_SERVER " " MSPROTO_REGISTER_SERVER ); 110 109 110 std::string request = MSPROTO_GAME_SERVER " " MSPROTO_SET_NAME " "; 111 request += this->ownName; 112 this->msc.sendRequest( request ); 113 111 114 return true; 112 115 } … … 118 121 } 119 122 123 void WANDiscoverable::updateClientNumber(int clientNumber) 124 { 125 orxout(verbose, context::master_server) << "Sending new number of clients: " << clientNumber << endl; 126 std::string request = MSPROTO_GAME_SERVER " " MSPROTO_SET_CLIENTS " "; 127 request += Ogre::StringConverter::toString(clientNumber); 128 129 this->msc.sendRequest( request ); 130 } 120 131 121 132 122 133 134 123 135 } // namespace orxonox -
code/trunk/src/libraries/network/WANDiscoverable.h
r9667 r10622 32 32 #include "core/config/Configurable.h" 33 33 #include "MasterServerComm.h" 34 #include <OgreStringConverter.h> 34 35 35 36 namespace orxonox … … 46 47 47 48 /** \return Address of the master server 48 * 49 * Get the master server address 49 * 50 * Get the master server address 50 51 */ 51 52 std::string getMSAddress() … … 54 55 /** Function used for the configuration file parameter update */ 55 56 void setConfigValues(); 56 57 57 58 /** Function used to set the activity/discoverability */ 58 59 void setActivity( bool bActive ); 59 60 61 void updateClientNumber(int clientNumber); 62 60 63 /** Master server communications object */ 61 64 MasterServerComm msc; 62 65 63 66 private: 64 67 /** Function used to connect to the master server */ 65 68 bool connect(); 66 69 67 70 /** Function used to disconnect from the master server */ 68 71 void disconnect(); 69 72 70 73 /** master server address */ 71 74 std::string msaddress; 75 std::string ownName; 72 76 bool bActive_; 73 77 -
code/trunk/src/libraries/network/WANDiscovery.cc
r8858 r10622 41 41 /* debugging output */ 42 42 orxout(verbose, context::master_server) << "Creating WANDiscovery." << endl; 43 43 44 44 /* register object in orxonox */ 45 45 RegisterObject(WANDiscovery); … … 54 54 /* connect and see if it worked */ 55 55 if( msc.connect( this->msaddress.c_str(), ORX_MSERVER_PORT ) ) 56 orxout(internal_error, context::master_server) << "Could not connect to master server at " 56 orxout(internal_error, context::master_server) << "Could not connect to master server at " 57 57 << this->msaddress << endl; 58 58 … … 63 63 void WANDiscovery::setConfigValues() 64 64 { 65 /* update msaddress string from orxonox.ini config file, if it 66 * has changed. 65 /* update msaddress string from orxonox.ini config file, if it 66 * has changed. 67 67 */ 68 68 SetConfigValue( msaddress, "master.orxonox.net"); 69 } 69 } 70 70 71 71 WANDiscovery::~WANDiscovery() 72 { 72 { 73 73 /* clear server list */ 74 this->servers_.clear(); 74 this->servers_.clear(); 75 75 } 76 76 77 77 /* callback for the network reply poller */ 78 78 int WANDiscovery::rhandler( char *addr, ENetEvent *ev ) 79 { 79 { 80 80 /* error recognition */ 81 81 if( !ev || !ev->packet || !ev->packet->data ) … … 88 88 if( !strncmp( (char*)ev->packet->data, MSPROTO_SERVERLIST_ITEM, 89 89 MSPROTO_SERVERLIST_ITEM_LEN ) ) 90 { 90 { 91 91 /* create server structure from that item */ 92 92 packet::ServerInformation toadd; 93 93 94 94 /* fill in data, -1 for the index: index should be length -1 */ 95 toadd.setServerName( std::string((char*)ev->packet->data + 96 MSPROTO_SERVERLIST_ITEM_LEN+1) ); 97 toadd.setServerIP( std::string((char*)ev->packet->data + 98 MSPROTO_SERVERLIST_ITEM_LEN+1) ); 95 std::string datastr = std::string((char*)ev->packet->data + MSPROTO_SERVERLIST_ITEM_LEN+1); 96 int separator = datastr.find(" "); 97 toadd.setServerIP(datastr.substr(0,separator)); 98 int secondsep = datastr.find(" ", separator + 1); 99 toadd.setServerName(datastr.substr(separator + 1, secondsep - separator - 1)); 100 toadd.setClientNumber(Ogre::StringConverter::parseInt(datastr.substr(secondsep+1))); 101 102 orxout(internal_info, context::network) << "Received WAN discovery server information; Name: " << toadd.getServerName() << ", Address: " << toadd.getServerIP() << ", Players: " << toadd.getClientNumber() << ", RTT: " << toadd.getServerRTT() << endl; 99 103 100 104 /* add to list */ … … 103 107 else if( !strncmp( (char*)ev->packet->data, MSPROTO_SERVERLIST_END, 104 108 MSPROTO_SERVERLIST_END_LEN ) ) 105 { 109 { 106 110 /* this is the only case where 2 should be returned, 107 111 * as 1 is used to signal that we're done receiving 108 112 * the list 109 113 */ 110 return 2; 114 return 2; 111 115 } 112 116 … … 114 118 return 1; 115 119 } 116 120 117 121 void WANDiscovery::discover() 118 122 { … … 131 135 { case 0: /* no event occured, decrease timeout */ 132 136 --i; break; 133 case 1: /* got a list element, continue */ 137 case 1: /* got a list element, continue */ 134 138 break; 135 139 case 2: /* done. */ … … 159 163 } 160 164 165 std::string WANDiscovery::getServerListItemRTT(unsigned int index) 166 { 167 if( index >= this->servers_.size() ) 168 return BLANKSTRING; 169 else{ 170 uint32_t serverrtt = this->servers_[index].getServerRTT(); 171 return Ogre::StringConverter::toString(serverrtt); 172 } 173 174 } 175 std::string WANDiscovery::getServerListItemPlayerNumber(unsigned int index) 176 { 177 if( index >= this->servers_.size() ) 178 return BLANKSTRING; 179 else{ 180 int playerNumber = this->servers_[index].getClientNumber(); 181 return Ogre::StringConverter::toString(playerNumber); 182 } 183 } 161 184 162 185 } // namespace orxonox -
code/trunk/src/libraries/network/WANDiscovery.h
r9667 r10622 35 35 #include "MasterServerComm.h" 36 36 #include "MasterServerProtocol.h" 37 #include <OgreStringConverter.h> 37 38 38 39 #include <vector> … … 56 57 57 58 /** \return Address of the master server 58 * 59 * Get the master server address 59 * 60 * Get the master server address 60 61 */ 61 62 std::string getMSAddress() … … 65 66 void discover(); // tolua_export 66 67 67 /** \param index Index to get the name of 68 /** \param index Index to get the name of 68 69 * \return The name of the server 69 * 70 * Get the name of the server at index index. 70 * 71 * Get the name of the server at index index. 71 72 */ 72 73 std::string getServerListItemName( unsigned int index ); // tolua_export 73 74 74 /** \param index Index to get the IP of 75 /** \param index Index to get the IP of 75 76 * \return The IP of the server 76 * 77 * Get the IP of the server at index index. 77 * 78 * Get the IP of the server at index index. 78 79 */ 79 80 std::string getServerListItemIP( unsigned int index ); // tolua_export 80 81 82 /** \param index Index to get the RTT of 83 * \return The RTT of the server 84 * 85 * Get the RTT of the server at index index. 86 */ 87 std::string getServerListItemRTT( unsigned int index ); // tolua_export 88 89 /** \param index Index to get the RTT of 90 * \return The number of players on the server 91 * 92 * Get the number of players on the server 93 */ 94 std::string getServerListItemPlayerNumber( unsigned int index ); // tolua_export 95 81 96 /* todo: might make this private and use getter/setter methods 82 * at some later time. 97 * at some later time. 83 98 */ 84 99 /** game server list */ … … 92 107 93 108 int rhandler( char *addr, ENetEvent *ev ); 94 109 95 110 private: 96 111 /** master server address */ -
code/trunk/src/libraries/network/packet/ServerInformation.cc
r8351 r10622 39 39 namespace packet 40 40 { 41 41 42 42 ServerInformation::ServerInformation() 43 43 { 44 45 44 } 46 45 47 46 ServerInformation::ServerInformation(ENetEvent* event) 48 47 { … … 69 68 ServerInformation::~ServerInformation() 70 69 { 71 70 72 71 } 73 72 74 73 void ServerInformation::send(ENetPeer* peer) 75 74 { 76 uint32_t size = returnSize((char*&)LAN_DISCOVERY_ACK) + returnSize(this->serverName_); 75 std::string payload = this->serverName_ + Ogre::StringConverter::toString(this->clientNumber_); 76 uint32_t size = returnSize((char*&)LAN_DISCOVERY_ACK) + returnSize(payload); 77 77 uint8_t* temp = new uint8_t[size]; 78 78 uint8_t* temp2 = temp; 79 79 saveAndIncrease((char*&)LAN_DISCOVERY_ACK, temp2); 80 saveAndIncrease( this->serverName_, temp2);80 saveAndIncrease(payload, temp2); 81 81 ENetPacket* packet = enet_packet_create( temp, size, 0 ); 82 82 enet_peer_send(peer, 0, packet); 83 83 84 84 delete[] temp; 85 85 } 86 86 87 87 } // namespace packet 88 88 … … 95 95 } 96 96 } // namespace orxonox 97 -
code/trunk/src/libraries/network/packet/ServerInformation.h
r8351 r10622 30 30 31 31 #include <string> 32 #include <OgreStringConverter.h> 33 32 34 33 35 #ifndef SERVERINFORMATION_H … … 45 47 ServerInformation(ENetEvent* event); 46 48 ~ServerInformation(); 47 49 48 50 void send( ENetPeer* peer ); 51 void setServerName(std::string name) { this->serverName_ = name; } 52 std::string getServerName() { return this->serverName_; } 53 void setServerIP( std::string IP ) { this->serverIP_ = IP; } 49 54 std::string getServerIP() { return this->serverIP_; } 50 std::string getServerName() { return this->serverName_; } 51 void setServerName(std::string name) { this->serverName_ = name; } 52 void setServerIP( std::string IP ) { this->serverIP_ = IP; } 55 void setClientNumber( int clientNumber ) { this->clientNumber_ = clientNumber; } 56 int getClientNumber() { return this->clientNumber_; } 53 57 uint32_t getServerRTT() { return this->serverRTT_; } 54 58 55 59 private: 56 60 std::string serverName_; 61 int clientNumber_; 57 62 std::string serverIP_; 58 63 uint32_t serverRTT_; -
code/trunk/src/modules/objects/ForceField.h
r9939 r10622 160 160 const std::string& getMode(void); //!< Get the mode of the ForceField. 161 161 162 private:163 162 //! Strings to represent the modes. 164 163 static const std::string modeTube_s; … … 166 165 static const std::string modeInvertedSphere_s; 167 166 static const std::string modeNewtonianGravity_s; 168 169 167 static const std::string modeHomogen_s; 170 168 169 private: 171 170 float velocity_; //!< The velocity of the ForceField. 172 171 float radius_; //!< The radius of the ForceField. -
code/trunk/src/modules/objects/Turret.cc
r10262 r10622 223 223 XMLPortParam(Turret, "maxYaw", setMaxYaw, getMaxYaw, xmlelement, mode); 224 224 XMLPortParam(Turret, "maxPitch", setMaxPitch, getMaxPitch, xmlelement, mode); 225 XMLPortParam(Turret, "rotationThrust", setRotationThrust, getRotationThrust, xmlelement, mode); 225 226 } 226 227 -
code/trunk/src/modules/objects/Turret.h
r10262 r10622 102 102 { return this->maxYaw_; } 103 103 104 inline void setRotationThrust(float rotationthrust) 105 { this->rotationThrust_ = rotationthrust; } 106 107 inline float getRotationThrust() 108 { return this->rotationThrust_; } 109 104 110 protected: 105 111 Vector3 startDir_; //!< The initial facing direction, in local coordinates. -
code/trunk/src/modules/objects/controllers/TurretController.cc
r10262 r10622 104 104 { 105 105 Pawn* entity = orxonox_cast<Pawn*>(*it); 106 if (!entity || FormationController::sameTeam(t his->getControllableEntity(), entity, this->getGametype()))106 if (!entity || FormationController::sameTeam(turret, entity, this->getGametype())) 107 107 continue; 108 108 tempScore = turret->isInRange(entity); … … 196 196 if(this->isLookingAtTargetNew(Degree(5).valueRadians())) 197 197 { 198 198 199 this->getControllableEntity()->fire(0); 199 200 } -
code/trunk/src/modules/tetris/Tetris.h
r9833 r10622 90 90 void clearRow(unsigned int row); 91 91 92 93 92 PlayerInfo* player_; 94 93 -
code/trunk/src/modules/towerdefense/CMakeLists.txt
r10258 r10622 2 2 TowerDefense.cc 3 3 TowerDefenseTower.cc 4 TowerTurret.cc5 4 TowerDefenseCenterpoint.cc 6 5 TowerDefenseHUDController.cc … … 8 7 TDCoordinate.cc 9 8 TowerDefenseEnemy.cc 10 9 TowerDefenseSelecter.cc 11 10 ) 12 11 … … 17 16 orxonox 18 17 overlays 18 objects 19 19 SOURCE_FILES ${TOWERDEFENSE_SRC_FILES} 20 20 ) -
code/trunk/src/modules/towerdefense/TDCoordinate.cc
r10258 r10622 17 17 { 18 18 //RegisterObject(TDCoordinate); 19 x=0; 20 y=0; 19 Set(0,0); 21 20 22 21 } 23 22 24 23 TDCoordinate::TDCoordinate(int x, int y) 25 { 26 this->x=x; 27 this->y=y; 24 { 25 Set(x,y); 26 } 27 28 void TDCoordinate::Set(int x, int y) 29 { 30 if (x < 0) 31 { 32 _x = 0; 33 } 34 else if (x > 15) 35 { 36 _x = 15; 37 } 38 else 39 { 40 _x = x; 41 } 42 43 if (y < 0) 44 { 45 _y = 0; 46 } 47 else if (y > 15) 48 { 49 _y = 15; 50 } 51 else 52 { 53 _y = y; 54 } 55 } 56 57 int TDCoordinate::GetX() 58 { 59 return _x; 60 } 61 62 int TDCoordinate::GetY() 63 { 64 return _y; 28 65 } 29 66 … … 34 71 35 72 Vector3 *coord = new Vector3(); 36 coord->x= ( x-8) * tileScale;37 coord->y= ( y-8) * tileScale;73 coord->x= (_x-8) * tileScale; 74 coord->y= (_y-8) * tileScale; 38 75 coord->z=100; 39 76 -
code/trunk/src/modules/towerdefense/TDCoordinate.h
r10258 r10622 16 16 { 17 17 public: 18 int x; 19 int y; 18 TDCoordinate(); 19 TDCoordinate(int x, int y); 20 virtual ~TDCoordinate() {}; 21 virtual void Set(int x, int y); 22 virtual int GetX(); 23 virtual int GetY(); 24 virtual Vector3 get3dcoordinate(); 20 25 21 TDCoordinate(); 22 23 Vector3 get3dcoordinate(); 24 25 virtual ~TDCoordinate() {}; 26 27 TDCoordinate(int x, int y); 26 private: 27 int _x; 28 int _y; 28 29 }; 29 30 -
code/trunk/src/modules/towerdefense/TowerDefense.cc
r10258 r10622 37 37 * 38 38 * 39 *40 39 *TIPP: Eclipse hilft euch schnell auf bereits vorhanden Funktionen zuzugreifen: 41 40 * einfach "this->" eingeben und kurz warten. Dann tauch eine Liste mit Vorschlägen auf. Wenn ihr jetzt weiter … … 77 76 #include "TowerDefenseCenterpoint.h" 78 77 //#include "TDCoordinate.h" 79 #include "TowerTurret.h"80 78 #include "worldentities/SpawnPoint.h" 81 79 #include "worldentities/pawns/Pawn.h" … … 88 86 /* Part of a temporary hack to allow the player to add towers */ 89 87 #include "core/command/ConsoleCommand.h" 88 #include <cmath> 89 90 90 91 91 namespace orxonox 92 92 { 93 static const std::string __CC_addTower_name = "addTower"; 94 static const std::string __CC_upgradeTower_name = "upgradeTower"; 95 static const int upgradeCost = 20; 96 static const int towerCost = 20; 97 unsigned int maxspaceships = 30; 98 int maxspaceshipsstandard = 30; 99 100 101 102 SetConsoleCommand("TowerDefense", __CC_addTower_name, &TowerDefense::addTower ).addShortcut().defaultValues(1); 103 SetConsoleCommand("TowerDefense", __CC_upgradeTower_name, &TowerDefense::upgradeTower).addShortcut().defaultValues(0); 104 93 105 RegisterUnloadableClass(TowerDefense); 94 106 95 TowerDefense::TowerDefense(Context* context) : Deathmatch(context)107 TowerDefense::TowerDefense(Context* context) : TeamDeathmatch(context) 96 108 { 97 109 RegisterObject(TowerDefense); … … 103 115 }*/ 104 116 117 //Timer for the waves (10 seconds between the waves) 118 selecter = NULL; 119 this->player_ = NULL; 105 120 this->setHUDTemplate("TowerDefenseHUD"); 106 107 //this->stats_ = new TowerDefensePlayerStats(); 108 109 /* Temporary hack to allow the player to add towers and upgrade them */ 110 this->dedicatedAddTower_ = createConsoleCommand( "addTower", createExecutor( createFunctor(&TowerDefense::addTower, this) ) ); 111 this->dedicatedUpgradeTower_ = createConsoleCommand( "upgradeTower", createExecutor( createFunctor(&TowerDefense::upgradeTower, this) ) ); 121 this->nextwaveTimer_.setTimer(10, false, createExecutor(createFunctor(&TowerDefense::nextwave, this))); 122 this->nextwaveTimer_.stopTimer(); 123 this->waves_ = 0; 124 this->time = 0; 125 this->credit_ = 0; 126 this->lifes_ = 0; 127 this->timeSetTower_ = 0; 128 spaceships =15; 129 eggs=3; 130 ufos=7; 131 randomships=5; 132 133 134 ModifyConsoleCommand(__CC_addTower_name).setObject(this); 135 ModifyConsoleCommand(__CC_upgradeTower_name).setObject(this); 112 136 } 113 137 … … 117 141 if (this->isInitialized()) 118 142 { 119 if( this->dedicatedAddTower_ )120 delete this->dedicatedAddTower_;143 ModifyConsoleCommand(__CC_addTower_name).setObject(NULL); 144 ModifyConsoleCommand(__CC_upgradeTower_name).setObject(NULL); 121 145 } 122 146 } … … 131 155 void TowerDefense::start() 132 156 { 133 134 Deathmatch::start(); 135 136 // Waypoints: [1,3] [10,3] [10,11] [13,11] -> add the points to a matrix so the player cant place towers on the path 137 for (int i=0; i < 16 ; i++){ 138 for (int j = 0; j< 16 ; j++){ 139 towermatrix[i][j] = false; 157 if (center_ != NULL) // There needs to be a TowerDefenseCenterpoint, i.e. the area the game takes place. 158 { 159 if (selecter == NULL) 160 { 161 selecter = new TowerDefenseSelecter(this->center_->getContext()); 140 162 } 141 } 142 163 selecter->addTemplate(center_->getSelecterTemplate()); 164 center_->attach(selecter); 165 } 166 else // If no centerpoint was specified, an error is thrown and the level is exited. 167 { 168 orxout(internal_error) << "Jump: No Centerpoint specified." << endl; 169 return; 170 } 171 172 TeamDeathmatch::start(); 173 174 // Waypoints: [1,3] [10,3] [10,11] [13,11] -> add the points to a matrix so the player cant place towers on the path 175 for (int i=0; i < 16 ; i++) 176 { 177 for (int j = 0; j< 16 ; j++) 178 { 179 towerModelMatrix[i][j] = NULL; 180 towerTurretMatrix[i][j] = NULL; 181 } 182 } 183 184 185 186 if (player_ != NULL) 187 { 188 //this->player_->startControl(selecter); 189 } 190 else 191 { 192 orxout() << "player=NULL" << endl; 193 } 194 195 196 Model* dummyModel = new Model(this->center_->getContext()); 197 198 //the path of the spacehips has to be blocked, so that no towers can be build there 143 199 for (int k=0; k<3; k++) 144 tower matrix[1][k]=true;200 towerModelMatrix[1][k]=dummyModel; 145 201 for (int l=1; l<11; l++) 146 towermatrix[l][3]=true;202 towerModelMatrix[l][3]=dummyModel; 147 203 for (int m=3; m<12; m++) 148 towermatrix[10][m]=true;204 towerModelMatrix[10][m]=dummyModel; 149 205 for (int n=10; n<14; n++) 150 towermatrix[n][11]=true;206 towerModelMatrix[n][11]=dummyModel; 151 207 for (int o=13; o<16; o++) 152 towermatrix[13][o]=true; 208 towerModelMatrix[13][o]=dummyModel; 209 153 210 154 211 //set initial credits, lifes and WaveNumber 155 this->setCredit( 200);156 this->setLifes( 50);212 this->setCredit(100); 213 this->setLifes(100); 157 214 this->setWaveNumber(0); 158 215 time=0.0; 159 216 217 /* 160 218 //adds initial towers 161 219 for (int i=0; i <7; i++){ 162 220 addTower(i+3,4); 163 }/* 164 for (int j=0; j < 7; j++){ 165 addTower(9,j+5); 166 }*/ 221 } 222 */ 167 223 } 168 224 … … 178 234 en1->addTemplate("enemytowerdefense1"); 179 235 en1->setScale(3); 180 en1->setHealth(en1->getHealth() + this->getWaveNumber()*4); 236 en1->lookAt(Vector3(0,0,100000)); 237 en1->setHealth(en1->getHealth() +50 + this->getWaveNumber()*4); 181 238 break; 182 239 … … 184 241 en1->addTemplate("enemytowerdefense2"); 185 242 en1->setScale(2); 186 en1->setHealth(en1->getHealth() + this->getWaveNumber()*4); 243 en1->lookAt(Vector3(0,0,100000)); 244 en1->roll(Degree(120)); 245 en1->setHealth(en1->getHealth() -30 + this->getWaveNumber()*4); 187 246 // en1->setShieldHealth(en1->getShield() = this->getWaveNumber()*2)) 188 247 break; … … 191 250 en1->addTemplate("enemytowerdefense3"); 192 251 en1->setScale(1); 193 en1->setHealth(en1->getHealth() + this->getWaveNumber()*4); 252 en1->lookAt(Vector3(0,0,100000)); 253 en1->roll(Degree(120)); 254 en1->setHealth(en1->getHealth() -10 + this->getWaveNumber()*4); 194 255 break; 195 256 } 196 257 258 en1->setTeam(2); 197 259 en1->getController(); 198 en1->setPosition(path.at(0)->get3dcoordinate()); 260 en1->setPosition(path.at(0)->get3dcoordinate()); 199 261 TowerDefenseEnemyvector.push_back(en1); 200 262 … … 209 271 { 210 272 211 Deathmatch::end();273 TeamDeathmatch::end(); 212 274 ChatManager::message("Match is over! Gameover!"); 213 275 276 } 277 278 void TowerDefense::spawnPlayer(PlayerInfo* player) 279 { 280 assert(player); 281 this->player_ = player; 282 283 if (selecter->getPlayer() == NULL) 284 { 285 this->player_ = player; 286 player->startControl(selecter); 287 players_[player].state_ = PlayerState::Alive; 288 } 289 } 290 291 /** 292 @brief 293 Get the player. 294 @return 295 Returns a pointer to the player. If there is no player, NULL is returned. 296 */ 297 PlayerInfo* TowerDefense::getPlayer(void) const 298 { 299 return this->player_; 214 300 } 215 301 216 302 //not working yet 217 303 void TowerDefense::upgradeTower(int x,int y) 218 {/* 219 const int upgradeCost = 20; 304 { 305 TDCoordinate* coord = new TDCoordinate(x,y); 306 x = coord->GetX(); 307 y = coord->GetY(); 308 220 309 221 310 if (!this->hasEnoughCreditForTower(upgradeCost)) … … 225 314 } 226 315 227 if (towermatrix [x][y] == NULL) 316 317 Model* dummyModel2 = new Model(this->center_->getContext()); 318 319 if (towerModelMatrix [x][y] == NULL || (towerModelMatrix [x][y])->getMeshSource() == dummyModel2->getMeshSource()) 228 320 { 229 321 orxout() << "no tower on this position" << endl; … … 233 325 else 234 326 { 235 (towermatrix [x][y])->upgradeTower(); 236 }*/ 327 (towerTurretMatrix [x][y])->upgradeTower(); 328 switch(towerTurretMatrix[x][y]->upgrade) 329 { 330 case 1 : 331 towerModelMatrix[x][y]->setMeshSource("TD_T2.mesh"); 332 break; 333 334 case 2 : 335 towerModelMatrix[x][y]->setMeshSource("TD_T3.mesh"); 336 break; 337 case 3 : 338 towerModelMatrix[x][y]->setMeshSource("TD_T4.mesh"); 339 break; 340 case 4 : 341 towerModelMatrix[x][y]->setMeshSource("TD_T5.mesh"); 342 break; 343 344 } 345 346 this->buyTower(upgradeCost); 347 } 237 348 } 238 349 239 350 /*adds Tower at Position (x,y) and reduces credit and adds the point to the towermatrix. template ("towerturret") 240 351 so towers have ability if the turrets 241 242 352 */ 353 243 354 void TowerDefense::addTower(int x, int y) 244 { 245 const int towerCost = 20; 355 { 356 TDCoordinate* coord = new TDCoordinate(x,y); 357 x = coord->GetX(); 358 y = coord->GetY(); 359 246 360 247 361 if (!this->hasEnoughCreditForTower(towerCost)) … … 251 365 } 252 366 253 if (tower matrix [x][y]==true)367 if (towerModelMatrix [x][y]!=NULL) 254 368 { 255 369 orxout() << "not possible to put tower here!!" << endl; … … 264 378 int tileScale = (int) this->center_->getTileScale(); 265 379 266 if (x > 15 || y > 15 || x < 0 || y < 0)380 /*if (x > 15 || y > 15 || x < 0 || y < 0) 267 381 { 268 382 //Hard coded: TODO: let this depend on the centerpoint's height, width and fieldsize (fieldsize doesn't exist yet) 269 383 orxout() << "Can not add Tower: x and y should be between 0 and 15" << endl; 270 384 return; 271 } 272 273 orxout() << "Will add tower at (" << (x-8) * tileScale << "," << (y-8) * tileScale << ")" << endl; 274 275 //Reduce credit 276 this->buyTower(towerCost); 277 towermatrix [x][y]=true; 385 }*/ 386 387 //orxout() << "Will add tower at (" << (x-8) * tileScale << "," << (y-8) * tileScale << ")" << endl; 388 orxout() << "Will add tower at (" << x << "," << y << ")" << endl; 389 390 391 //Create Model 392 Model* newTowerModel = new Model(this->center_->getContext()); 393 newTowerModel->setMeshSource("TD_T1.mesh"); 394 newTowerModel->setScale(30); 395 newTowerModel->pitch(Degree(90)); 396 newTowerModel->setPosition(static_cast<float>((x-8) * tileScale), static_cast<float>((y-8) * tileScale), 80); 278 397 279 398 //Creates tower 280 399 TowerDefenseTower* towernew = new TowerDefenseTower(this->center_->getContext()); 281 towernew->addTemplate("towerturret"); 282 towernew->setPosition(static_cast<float>((x-8) * tileScale), static_cast<float>((y-8) * tileScale), 75); 400 towernew->setPosition(static_cast<float>((x-8) * tileScale), static_cast<float>((y-8) * tileScale), 275); 283 401 towernew->setGame(this); 284 } 402 towernew->setTeam(1); 403 404 //Reduce credit 405 this->buyTower(towerCost); 406 towerModelMatrix [x][y]= newTowerModel; 407 towerTurretMatrix [x][y]= towernew; 408 } 285 409 286 410 bool TowerDefense::hasEnoughCreditForTower(int towerCost) … … 296 420 297 421 422 void TowerDefense::nextwave() 423 { 424 425 orxout() << "newwave" << endl; 426 TowerDefenseEnemyvector.clear(); 427 waves_++; 428 //maxspaceships = round(maxspaceshipsstandard + 0.25*(waves_)); 429 time=0; 430 431 int helpnumber = 40 -(waves_); 432 if(helpnumber <= 0) {helpnumber =1;} 433 float numSpaceships = std::abs((rand() % 100)*5.0f*(helpnumber)); 434 float numEggs = std::abs((rand() % 100)*1.0f*(waves_)); 435 float numUfos = std::abs((rand() % 100)*1.5f*(0.5f*(waves_))) ; 436 437 float totalnumber = (numSpaceships + numEggs + numUfos)*1.3f; 438 439 int newspaceships = (int)(maxspaceships* numSpaceships / totalnumber); 440 int neweggs = (int)(maxspaceships*numEggs / totalnumber); 441 int newufos = (int)(maxspaceships*numUfos / totalnumber); 442 int newrandomships = maxspaceships -newspaceships - neweggs - newufos; 443 spaceships =newspaceships; 444 eggs=neweggs; 445 ufos=newufos; 446 randomships=newrandomships; 447 448 orxout() << spaceships << endl; 449 orxout() << eggs << endl; 450 orxout() << ufos << endl; 451 orxout() << randomships << endl; 452 453 454 455 456 457 } 458 298 459 void TowerDefense::tick(float dt) 299 460 { 300 461 SUPER(TowerDefense, tick, dt); 301 462 time +=dt; 463 timeSetTower_ +=dt; 464 465 //Check if tower has to be set (because TowerDefenseSelecter asks for it) 466 if(timeSetTower_ >= 0.25) 467 { 468 timeSetTower_ =0; 469 if(selecter != NULL && selecter->firePressed_) 470 { 471 472 int x = selecter->selectedPos_->GetX(); 473 int y = selecter->selectedPos_->GetY(); 474 Model* dummyModel2 = new Model(this->center_->getContext()); 475 476 477 478 if(towerModelMatrix[x][y] == NULL) 479 { 480 addTower(x,y); 481 } 482 else 483 { 484 if(!((towerModelMatrix [x][y])->getMeshSource() == dummyModel2->getMeshSource())) 485 { 486 towerTurretMatrix[x][y]->upgradeTower(); 487 if(towerTurretMatrix[x][y]->upgrade < towerTurretMatrix[x][y]->upgradeMax) 488 { 489 int specificupgradecost = (int)(upgradeCost*(std::pow(1.5,towerTurretMatrix[x][y]->upgrade))); 490 if(this->credit_ >= specificupgradecost) 491 { 492 this->buyTower(specificupgradecost); 493 switch(towerTurretMatrix[x][y]->upgrade) 494 { 495 case 1 : 496 towerModelMatrix[x][y]->setMeshSource("TD_T2.mesh"); 497 break; 498 499 case 2 : 500 towerModelMatrix[x][y]->setMeshSource("TD_T3.mesh"); 501 break; 502 case 3 : 503 towerModelMatrix[x][y]->setMeshSource("TD_T4.mesh"); 504 break; 505 case 4 : 506 towerModelMatrix[x][y]->setMeshSource("TD_T5.mesh"); 507 break; 508 509 } 510 } 511 512 513 } 514 } 515 } 516 selecter->firePressed_ = false; 517 } 518 } 302 519 303 520 TDCoordinate* coord1 = new TDCoordinate(1,1); 304 521 std::vector<TDCoordinate*> path; 305 522 path.push_back(coord1); 306 if(time>1 && TowerDefenseEnemyvector.size() < 30) 307 { 308 //adds different types of enemys depending on the WaveNumber 309 addTowerDefenseEnemy(path, this->getWaveNumber() % 3 +1 ); 310 time = time-1; 311 } 523 524 525 526 527 528 if(time>=TowerDefenseEnemyvector.size() && TowerDefenseEnemyvector.size() < maxspaceships) 529 { 530 531 //adds different types of enemys depending on the WaveNumber progressively making the combination of enemys more difficult 532 if(spaceships>0) 533 { 534 addTowerDefenseEnemy(path, 1); 535 spaceships--; 536 537 }else if(ufos>0) 538 { 539 addTowerDefenseEnemy(path, 3); 540 ufos--; 541 }else if(eggs>0) 542 { 543 addTowerDefenseEnemy(path, 2); 544 eggs--; 545 }else if(randomships>0) 546 { 547 addTowerDefenseEnemy(path, rand() % 3 +1); 548 randomships--; 549 550 } 551 552 } 553 312 554 313 555 Vector3* endpoint = new Vector3(500, 700, 150); … … 317 559 if(TowerDefenseEnemyvector.at(i) != NULL && TowerDefenseEnemyvector.at(i)->isAlive()) 318 560 { 319 //destroys enemys at the end of t ehpath and reduces the life by 1. no credits gifted561 //destroys enemys at the end of the path and reduces the life by 1. no credits gifted 320 562 321 563 Vector3 ship = TowerDefenseEnemyvector.at(i)->getRVWorldPosition(); … … 333 575 } 334 576 } 577 335 578 //goes thorugh vector to see if an enemy is still alive. if not next wave is launched 336 579 int count= 0; … … 343 586 } 344 587 588 if (count == 0 && !this->nextwaveTimer_.isActive()) 589 this->nextwaveTimer_.startTimer(); 590 591 /* time2 +=dt; 345 592 if(count== 0) 346 593 { 347 time2 +=dt;348 594 if(time2 > 10) 349 595 { … … 354 600 } 355 601 } 356 357 358 } 602 */ 603 604 } 605 359 606 360 607 // Function to test if we can add waypoints using code only. Doesn't work yet … … 399 646 void TowerDefense::playerEntered(PlayerInfo* player) 400 647 { 401 Deathmatch::playerEntered(player);648 TeamDeathmatch::playerEntered(player); 402 649 403 650 const std::string& message = player->getName() + " entered the game"; … … 407 654 bool TowerDefense::playerLeft(PlayerInfo* player) 408 655 { 409 bool valid_player = Deathmatch::playerLeft(player);656 bool valid_player = TeamDeathmatch::playerLeft(player); 410 657 411 658 if (valid_player) … … 437 684 } 438 685 439 Deathmatch::pawnKilled(victim, killer);686 TeamDeathmatch::pawnKilled(victim, killer); 440 687 } 441 688 -
code/trunk/src/modules/towerdefense/TowerDefense.h
r10258 r10622 38 38 #define _TowerDefense_H__ 39 39 #include "TDCoordinate.h" 40 #include "TowerDefenseSelecter.h" 40 41 #include "towerdefense/TowerDefensePrereqs.h" 41 #include "gametypes/ Deathmatch.h"42 #include "gametypes/TeamDeathmatch.h" 42 43 #include "TowerDefenseEnemy.h" 43 44 #include "util/Output.h" 44 45 #include "core/object/WeakPtr.h" 46 #include "TowerDefenseSelecter.h" 47 #include "graphics/Camera.h" 48 45 49 46 50 namespace orxonox 47 51 { 48 class _TowerDefenseExport TowerDefense : public Deathmatch52 class _TowerDefenseExport TowerDefense : public TeamDeathmatch 49 53 { 50 54 public: … … 53 57 54 58 std::vector<orxonox::WeakPtr<TowerDefenseEnemy> > TowerDefenseEnemyvector; 55 bool towermatrix[16][16]; 59 Model* towerModelMatrix[16][16]; 60 TowerDefenseTower* towerTurretMatrix[16][16]; 56 61 void addTowerDefenseEnemy(std::vector<TDCoordinate*> path, int templatenr); 57 62 virtual void start(); //<! The function is called when the gametype starts 58 63 virtual void end(); 59 64 virtual void tick(float dt); 60 //virtual void playerEntered(PlayerInfo* player); 61 //virtual bool playerLeft(PlayerInfo* player); 62 //Player Stats (set,get, reduce) 65 virtual void spawnPlayer(PlayerInfo* player); 66 PlayerInfo* getPlayer(void) const; 63 67 int getCredit(){ return this->credit_; } 64 68 int getLifes(){ return this->lifes_; } … … 69 73 void buyTower(int cost){ credit_ -= cost;} 70 74 void addCredit(int credit) { credit_+=credit; } 71 void nextwave() { waves_++;}75 void nextwave(); 72 76 int reduceLifes(int NumberofLifes){ return lifes_-=NumberofLifes; } 77 TowerDefenseSelecter* selecter; 78 int spaceships; 79 int eggs; 80 int ufos; 81 int randomships; 82 73 83 74 84 //virtual void pawnKilled(Pawn* victim, Pawn* killer = 0); … … 83 93 /* Adds a tower at x, y in the playfield */ 84 94 void addTower(int x, int y); 85 86 95 void upgradeTower(int x, int y); 87 /* Part of a temporary hack to allow the player to add towers */88 ConsoleCommand* dedicatedAddTower_;89 ConsoleCommand* dedicatedUpgradeTower_;90 96 91 97 //TODO: void spawnNewWave() … … 96 102 private: 97 103 TowerDefenseCenterpoint *center_; 104 PlayerInfo* player_; 98 105 float time; 99 float time2; 106 float timeSetTower_; 107 // float time2; 100 108 int credit_; 101 109 int waves_; 102 110 int lifes_; 111 Timer nextwaveTimer_; 103 112 104 113 /* handles stats */ 105 114 bool hasEnoughCreditForTower(int towerCost); 106 115 bool hasEnoughCreditForUpgrade(); 107 108 109 110 std::vector<TowerTurret*> towers_;111 116 }; 112 117 } -
code/trunk/src/modules/towerdefense/TowerDefenseCenterpoint.cc
r9667 r10622 53 53 this->width_ = 15; 54 54 this->height_ = 15; 55 this->towerTemplate_ = "";56 55 57 56 //this->setCollisionType(Static); … … 72 71 XMLPortParam(TowerDefenseCenterpoint, "height", setHeight, getHeight, xmlelement, mode); 73 72 XMLPortParam(TowerDefenseCenterpoint, "tileScale", setTileScale, getTileScale, xmlelement, mode); 74 XMLPortParam(TowerDefenseCenterpoint, " towerTemplate", setTowerTemplate, getTowerTemplate, xmlelement, mode);73 XMLPortParam(TowerDefenseCenterpoint, "selecterTemplate", setSelecterTemplate, getSelecterTemplate, xmlelement, mode); 75 74 76 75 //TODO: add XMLPortObject(TowerDefenseCenterpoint, WorldEntity, "waypoints", addWaypoint, getWaypoint, xmlelement, mode); -
code/trunk/src/modules/towerdefense/TowerDefenseCenterpoint.h
r9667 r10622 60 60 void setWidth(unsigned int width) 61 61 { this->width_ = width; } 62 63 62 unsigned int getWidth(void) const 64 63 { return this->width_; } 65 66 64 void setHeight(unsigned int height) 67 65 { this->height_ = height; } 68 69 66 unsigned int getHeight(void) const 70 67 { return this->height_; } 71 68 void setSelecterTemplate(const std::string& newTemplate) 69 { this->selecterTemplate_ = newTemplate; } 70 const std::string& getSelecterTemplate() const 71 { return this->selecterTemplate_; } 72 72 /** 73 73 @brief How to convert to world coordinates, e.g. that 0,15 is not at -8,-8 but at -80,-80 (if scale would be 10) … … 79 79 { return this->tileScale_; } 80 80 81 /**82 @brief Set the template for the towers.83 @param template The template name to be applied to each tower.84 */85 void setTowerTemplate(const std::string& templateName)86 { this->towerTemplate_ = templateName; }87 88 const std::string& getTowerTemplate(void) const89 { return this->towerTemplate_; }90 91 81 private: 92 82 void checkGametype(); 93 83 84 std::string selecterTemplate_; 94 85 unsigned int width_; 95 86 unsigned int height_; 96 87 unsigned int tileScale_; 97 98 std::string towerTemplate_;99 88 }; 100 89 } -
code/trunk/src/modules/towerdefense/TowerDefenseEnemy.cc
r10258 r10622 35 35 //add credit if enemy is destroyed 36 36 TowerDefenseEnemy::~TowerDefenseEnemy(){ 37 //this->td->addCredit(1); 37 38 if (this->isInitialized()) 39 { 40 getGame()->addCredit(1); 41 } 38 42 } 39 43 … … 64 68 if (getGame() && once_ == false && getHealth() <= 0) 65 69 { 70 orxout() << "damagefunctionIF" << endl; 66 71 getGame()->addCredit(1); 67 72 once_ = true; 68 73 } 74 orxout() << "damagefunction" << endl; 75 69 76 } 77 70 78 /* 71 79 void TowerDefenseEnemy::popWaypoint() -
code/trunk/src/modules/towerdefense/TowerDefenseTower.cc
r10258 r10622 22 22 Constructor. Registers and initializes the object. 23 23 */ 24 TowerDefenseTower::TowerDefenseTower(Context* context) : Pawn(context)24 TowerDefenseTower::TowerDefenseTower(Context* context) : Turret(context) 25 25 { 26 26 RegisterObject(TowerDefenseTower); 27 game_ =NULL; 28 this->setCollisionType(WorldEntity::None); 29 upgrade = 0; 30 this->addTemplate("towerdefensetower"); 27 31 28 this->setCollisionType(WorldEntity::Dynamic);29 upgrade = 0; 32 upgradeMax = 5; 33 30 34 31 35 //this->removeAllEngines(); … … 38 42 } 39 43 44 /* 40 45 void TowerDefenseTower::setOrientation(const Quaternion& orientation) 41 46 { … … 53 58 { 54 59 } 60 */ 55 61 56 62 bool TowerDefenseTower::upgradeTower() 57 63 { 58 if(upgrade < 3)64 if(upgrade < upgradeMax) 59 65 { 60 66 upgrade++; 61 67 float reloadrate = getReloadRate(); 62 68 float reloadwaittime = getReloadWaitTime(); 63 this->setDamageMultiplier( 5000);64 65 reloadrate = 0. 5f*reloadrate;66 reloadwaittime = 0. 5f*reloadwaittime;69 this->setDamageMultiplier((upgrade+1)*1.5f); 70 this->setRotationThrust(2*this->getRotationThrust()); 71 reloadrate = 0.7f*reloadrate; 72 reloadwaittime = 0.7f*reloadwaittime; 67 73 setReloadRate(reloadrate); 68 74 setReloadWaitTime(reloadwaittime); 69 this->addTemplate("towerturret1");75 //this->addTemplate("towerturret1"); 70 76 } 71 77 else -
code/trunk/src/modules/towerdefense/TowerDefenseTower.h
r10258 r10622 20 20 #include "towerdefense/TowerDefensePrereqs.h" 21 21 #include "worldentities/pawns/SpaceShip.h" 22 #include "objects/Turret.h" 22 23 23 24 24 25 namespace orxonox 25 26 { 26 class _TowerDefenseExport TowerDefenseTower : public Pawn27 class _TowerDefenseExport TowerDefenseTower : public Turret 27 28 { 28 29 public: … … 37 38 38 39 // Overriding these to stop TowerDefenseTowers from spasing out 40 /* 39 41 void setOrientation(const Quaternion& orientation); 40 42 virtual void rotateYaw(const Vector2& value); 41 43 virtual void rotatePitch(const Vector2& value); 42 44 virtual void rotateRoll(const Vector2& value); 45 */ 43 46 virtual bool upgradeTower(); 44 47 … … 46 49 void setGame(TowerDefense* Towerdefense) 47 50 { assert(Towerdefense); game_ = Towerdefense; } 51 int upgrade; 52 int upgradeMax; 48 53 private: 49 54 TowerDefense* game_; 50 int upgrade; 55 51 56 }; 52 57 } -
code/trunk/src/modules/weapons/WeaponsPrereqs.h
r8855 r10622 75 75 class ReplenishingMunition; 76 76 class RocketMunition; 77 class GravityBombMuntion; 77 78 78 79 // projectiles … … 82 83 class Projectile; 83 84 class Rocket; 85 class RocketOld; 84 86 class SimpleRocket; 87 class GravityBomb; 85 88 86 89 // weaponmodes … … 91 94 class LightningGun; 92 95 class RocketFire; 96 class RocketFireOld; 93 97 class SimpleRocketFire; 98 class GravityBombFire; 94 99 } 95 100 -
code/trunk/src/modules/weapons/munitions/CMakeLists.txt
r7846 r10622 4 4 FusionMunition.cc 5 5 RocketMunition.cc 6 GravityBombMunition.cc 6 7 ) -
code/trunk/src/modules/weapons/projectiles/CMakeLists.txt
r8855 r10622 6 6 LightningGunProjectile.cc 7 7 Rocket.cc 8 RocketOld.cc 8 9 SimpleRocket.cc 10 GravityBomb.cc 11 GravityBombField.cc 9 12 ) -
code/trunk/src/modules/weapons/projectiles/LightningGunProjectile.cc
r9667 r10622 47 47 48 48 this->textureIndex_ = 1; 49 this->setMass(2); 50 this->setCollisionType(Dynamic); 49 51 this->maxTextureIndex_ = 8; 50 52 this->textureTimer_.setTimer(0.01f, true, createExecutor(createFunctor(&LightningGunProjectile::changeTexture, this))); -
code/trunk/src/modules/weapons/projectiles/Rocket.cc
r10216 r10622 48 48 #include "worldentities/CameraPosition.h" 49 49 #include "worldentities/pawns/Pawn.h" 50 //#include "particleuniverse/include/ParticleUniverseSystemManager.h" 50 51 51 52 namespace orxonox … … 83 84 fire->setOrientation(this->getOrientation()); 84 85 fire->setSource("Orxonox/rocketfire"); 86 87 // Add Particle Universe Effects 88 //ParticleUniverse::ParticleSystemManager* pManager = ParticleUniverse::ParticleSystemManager::getSingletonPtr(); 89 //ParticleUniverse::ParticleSystem* pSys1 = pManager->createParticleSystem("pSys1", "bubbles", this->getScene()->getSceneManager()); 90 //this->attachOgreObject(pSys1); 85 91 86 92 this->enableCollisionCallback(); … … 223 229 void Rocket::destructionEffect() 224 230 { 225 ParticleSpawner *effect1, *effect2 ;231 ParticleSpawner *effect1, *effect2, *effect3, *effect4, *effect5; 226 232 if(this->getShooter()) 227 233 { 228 234 effect1 = new ParticleSpawner(this->getShooter()->getContext()); 229 235 effect2 = new ParticleSpawner(this->getShooter()->getContext()); 236 effect3 = new ParticleSpawner(this->getShooter()->getContext()); 237 effect4 = new ParticleSpawner(this->getShooter()->getContext()); 238 effect5 = new ParticleSpawner(this->getShooter()->getContext()); 230 239 } 231 240 else … … 233 242 effect1 = new ParticleSpawner(this->getContext()); 234 243 effect2 = new ParticleSpawner(this->getContext()); 244 effect3 = new ParticleSpawner(this->getContext()); 245 effect4 = new ParticleSpawner(this->getContext()); 246 effect5 = new ParticleSpawner(this->getContext()); 235 247 } 236 248 … … 238 250 effect1->setOrientation(this->getOrientation()); 239 251 effect1->setDestroyAfterLife(true); 240 effect1->setSource(" Orxonox/explosion4");252 effect1->setSource("orxonox/explosion_flash"); 241 253 effect1->setLifetime(2.0f); 242 254 … … 244 256 effect2->setOrientation(this->getOrientation()); 245 257 effect2->setDestroyAfterLife(true); 246 effect2->setSource(" Orxonox/smoke4");258 effect2->setSource("orxonox/explosion_flame"); 247 259 effect2->setLifetime(3.0f); 260 261 effect3->setPosition(this->getPosition()); 262 effect3->setOrientation(this->getOrientation()); 263 effect3->setDestroyAfterLife(true); 264 effect3->setSource("orxonox/explosion_shockwave"); 265 effect3->setLifetime(3.0f); 266 267 effect4->setPosition(this->getPosition()); 268 effect4->setOrientation(this->getOrientation()); 269 effect4->setDestroyAfterLife(true); 270 effect4->setSource("orxonox/explosion_sparks"); 271 effect4->setLifetime(3.0f); 272 273 effect5->setPosition(this->getPosition()); 274 effect5->setOrientation(this->getOrientation()); 275 effect5->setDestroyAfterLife(true); 276 effect5->setSource("orxonox/explosion_streak1"); 277 effect5->setLifetime(3.0f); 248 278 } 249 279 -
code/trunk/src/modules/weapons/weaponmodes/CMakeLists.txt
r7163 r10622 6 6 LightningGun.cc 7 7 RocketFire.cc 8 RocketFireOld.cc 8 9 SimpleRocketFire.cc 10 GravityBombFire.cc 9 11 ) -
code/trunk/src/modules/weapons/weaponmodes/EnergyDrink.cc
r10296 r10622 108 108 model->setScale(5); 109 109 110 this->computeMuzzleParameters(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn()->getAimPosition()); 110 111 projectile->setOrientation(this->getMuzzleOrientation()); 111 112 projectile->setPosition(this->getMuzzlePosition()); -
code/trunk/src/modules/weapons/weaponmodes/FusionFire.cc
r10296 r10622 68 68 BillboardProjectile* projectile = new BillboardProjectile(this->getContext()); 69 69 70 this->computeMuzzleParameters(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn()->getAimPosition()); 70 71 projectile->setOrientation(this->getMuzzleOrientation()); 71 72 projectile->setPosition(this->getMuzzlePosition()); -
code/trunk/src/modules/weapons/weaponmodes/LaserFire.cc
r10296 r10622 66 66 ParticleProjectile* projectile = new ParticleProjectile(this->getContext()); 67 67 68 this->computeMuzzleParameters(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn()->getAimPosition()); 68 69 projectile->setOrientation(this->getMuzzleOrientation()); 69 70 projectile->setPosition(this->getMuzzlePosition()); -
code/trunk/src/orxonox/controllers/ControllerDirector.cc
r10262 r10622 41 41 { 42 42 SUPER(ControllerDirector, XMLPort, xmlelement, mode); 43 XMLPortParam(ControllerDirector, "scriptname", setScriptName, getScriptName, xmlelement, mode).defaultValues("testscript"); 43 44 44 45 orxout(verbose)<< "ControllerDirector::XMLPort " … … 83 84 else 84 85 return; 85 86 86 87 /* Set up a luastate to use for running the scripts */ 87 88 LuaState * ls = new LuaState(); … … 98 99 * variable "newctrlid" defined, which means it can make use of it. 99 100 */ 100 101 ls->doFile( "testscript.lua");101 std::string scr = this->scriptname_ + ".lua"; 102 ls->doFile(scr); 102 103 103 104 /* Increase the controller ID so we have a different one for -
code/trunk/src/orxonox/controllers/ControllerDirector.h
r10262 r10622 47 47 virtual void XMLEventPort(Element& xmlelement, XMLPort::Mode mode); 48 48 49 inline void setScriptName(const std::string& name) { this->scriptname_ = name; } 50 inline const std::string& getScriptName() const { return this->scriptname_; } 51 49 52 50 53 /* Take over control of a given object */ … … 55 58 //void setNewController(Controller * controller); 56 59 57 private: 60 protected: 61 std::string scriptname_; 58 62 PlayerInfo* player_; 59 63 ControllableEntity* entity_; -
code/trunk/src/orxonox/controllers/FormationController.cc
r10290 r10622 955 955 bool FormationController::sameTeam(ControllableEntity* entity1, ControllableEntity* entity2, Gametype* gametype) 956 956 { 957 958 957 959 if (entity1 == entity2) 958 960 return true; … … 984 986 } 985 987 986 Team Deathmatch* tdm = orxonox_cast<TeamDeathmatch*>(gametype);988 TeamGametype* tdm = orxonox_cast<TeamGametype*>(gametype); 987 989 if (tdm) 988 990 { … … 992 994 if (entity2->getPlayer()) 993 995 team2 = tdm->getTeam(entity2->getPlayer()); 994 }995 996 Mission* miss = orxonox_cast<Mission*>(gametype);997 if (miss)998 {999 if (entity1->getPlayer())1000 team1 = miss->getTeam(entity1->getPlayer());1001 1002 if (entity2->getPlayer())1003 team2 = miss->getTeam(entity2->getPlayer());1004 996 } 1005 997 -
code/trunk/src/orxonox/controllers/ScriptController.cc
r10262 r10622 21 21 * 22 22 * Author: 23 * Fabian 'x3n' Landau23 * ... 24 24 * Co-authors: 25 25 * ... 26 26 * 27 27 */ 28 29 /* 30 * Currently available lua commands: 31 * 32 * IMPORTANT: ALL COMMANDS DO REQUIRE 7 PARAMETERS TO BE PROVIDED. FILL UP WITH ZEROES IN UNIMPORTANT PLACES. 33 * 34 * Command | Abbreviation | Parameter 1 | '' 2 | '' 3 | '' 4 | '' 5 | '' 6 | '' 7 35 * 36 * "Move And Look" | mal | GoTo X Coordinate | '' Y '' | '' Z '' | LookAt X Coordinate | '' Y '' | '' Y '' | Duration 37 * "Rotate And Look" | ral | GoTo X Coordinate | '' Y '' | '' Z '' | Axis (1=x, 2=z, 3=z) | - | - | Duration 38 * "Spiral" | spi | GoTo X Coordinate | '' Y '' | '' Z '' | - | - | - | Duration 39 * "Transition Look" | chl | From X Coordinate | '' Y '' | '' Z '' | To X Coordinate | '' Y '' | '' Y '' | Duration 40 * "Idle (Do nothing)" | idle | Duration 41 */ 28 42 29 43 #include "ScriptController.h" … … 32 46 #include "worldentities/ControllableEntity.h" 33 47 #include "core/LuaState.h" 34 #include <cmath> 48 #include "core/LuaState.h" 49 #include "util/Math.h" 35 50 36 51 namespace orxonox … … 66 81 this->eventno = 0; 67 82 83 /* - First "previous event" scheduled at t=0 */ 84 /* - Needed for automatically updating event times */ 85 this->prevEventTime = 0; 68 86 } 69 87 … … 178 196 179 197 /* Get a variable that specifies how far along the trajectory 180 * we are 198 * we are currently. 181 199 */ 182 200 float dl = eventTime / currentEvent.duration; 183 201 184 /* Depending */202 /* Depending on command */ 185 203 /* Do some moving */ 186 204 if( this->processing ) 187 { 188 if( this->currentEvent.fctName == "mal" ) 205 { 206 // Abbreviation for "spiral" (rotation + translation) 207 if (this->currentEvent.fctName == "spi") { 208 209 // Need to know a perpendicular basis to the translation vector: 210 // Given (a, b, c) we chose (b, -a, 0)norm and (0, c, -b)norm 211 // Currently we set a fix rotational radius of 400 212 // TODO: Add an option to adjust radius of spiral movement 213 Vector3 direction = this->currentEvent.v1 - startpos; 214 215 Vector3* ortho1 = new Vector3(direction.y, -direction.x, 0); 216 float absOrtho1 = sqrt(direction.y * direction.y + direction.x * direction.x); 217 *ortho1 = 400 * cos(2 * math::pi * dl) * (*ortho1)/absOrtho1; 218 219 Vector3* ortho2 = new Vector3(0, direction.z, -direction.y); 220 float absOrtho2 = sqrt(direction.y * direction.y + direction.z * direction.z); 221 *ortho2 = 400 * sin(2 * math::pi * dl) * (*ortho2)/absOrtho2; 222 223 this->entity_->setPosition( (1-dl)*startpos + dl * this->currentEvent.v1 + *ortho1 + *ortho2); 224 225 delete ortho1; 226 delete ortho2; 227 } 228 229 // Abbreviation for "rotate and look" 230 if (this->currentEvent.fctName == "ral") 231 { 232 // Specify the axis 233 Vector3* a; 234 switch ((int) currentEvent.d) { 235 case 3: 236 a = new Vector3(this->currentEvent.v1.x + this->currentEvent.e*cos(2*math::pi*dl), 237 this->currentEvent.v1.y + this->currentEvent.e*sin(2*math::pi*dl), 238 this->currentEvent.v1.z); 239 break; 240 case 2: 241 a = new Vector3(this->currentEvent.v1.x + this->currentEvent.e*sin(2*math::pi*dl), 242 this->currentEvent.v1.y, 243 this->currentEvent.v1.z + this->currentEvent.e*cos(2*math::pi*dl)); 244 break; 245 case 1: 246 a = new Vector3(this->currentEvent.v1.x, 247 this->currentEvent.v1.y + this->currentEvent.e*sin(2*math::pi*dl), 248 this->currentEvent.v1.z + this->currentEvent.e*cos(2*math::pi*dl)); 249 break; 250 } 251 252 this->entity_->setPosition(*a); 253 254 /* Look at the specified position */ 255 this->entity_->lookAt(this->currentEvent.v1); 256 } 257 else if( this->currentEvent.fctName == "mal" ) 189 258 { 190 259 /* Set the position to the correct place in the trajectory */ … … 193 262 /* Look at the specified position */ 194 263 this->entity_->lookAt(this->currentEvent.v2); 195 196 /* Update look at position */197 //this->lookAtPosition = this->currentEvent.v2;198 264 } 199 265 else if( this->currentEvent.fctName == "chl" ) … … 224 290 /* Fill the structure with all the provided information */ 225 291 tmp.fctName = instruction; 292 226 293 //tmp.x1 = x1; tmp.y1 = y1; tmp.z1 = z1; 227 294 //tmp.x2 = x2; tmp.y2 = y2; tmp.z2 = z2; 228 295 tmp.v1 = Vector3(x1,y1,z1); 229 296 tmp.v2 = Vector3(x2,y2,z2); 297 298 // the parameters are not required to be vector coordinates! 299 // for convenience they are however stored twice if they have some kind of different meaning 300 tmp.a = x1; 301 tmp.b = y1; 302 tmp.c = z1; 303 tmp.d = x2; 304 tmp.e = y2; 305 tmp.f = z2; 306 230 307 tmp.duration = duration; 231 tmp.eventTime = executionTime; 232 233 orxout(verbose) << tmp.fctName << endl; 308 309 /* This is kind of a hack. If we hit the function idle all we want to do is 310 advance event execution time, not schedule anything */ 311 if (instruction == "idle") { 312 tmp.eventTime = this->prevEventTime; 313 this->prevEventTime += x1; 314 return; 315 } else { 316 tmp.eventTime = this->prevEventTime; 317 this->prevEventTime += duration; 318 } 234 319 235 320 /* Add the created event to the event list */ -
code/trunk/src/orxonox/controllers/ScriptController.h
r10262 r10622 21 21 * 22 22 * Author: 23 * Fabian 'x3n' Landau23 * ... 24 24 * Co-authors: 25 25 * ... … … 45 45 std::string fctName; 46 46 47 /** Final position we want to be at **/ 47 48 Vector3 v1; 49 50 /** Where we are looking **/ 48 51 Vector3 v2; 52 53 /** The parameters are additionally stored as a set of 6 numerical values **/ 54 float a, b, c, d, e, f; 49 55 50 56 /** Time span of the event */ … … 69 75 // LUA interface 70 76 // tolua_begin 71 void eventScheduler(std::string instruction ,72 float x1 , float y1, float z1,73 float x2 , float y2, float z2,74 float duration , float executionTime);77 void eventScheduler(std::string instruction = "", 78 float x1 = 0, float y1 = 0, float z1 = 0, 79 float x2 = 0, float y2 = 0, float z2 = 0, 80 float duration = 0, float executionTime = 0); 75 81 76 82 static ScriptController* getScriptController(); … … 116 122 Vector3 startpos; 117 123 124 /* Time of the previously scheduled event */ 125 float prevEventTime; 126 118 127 /* - Position to look at during that transition */ 119 128 //Vector3 lookAtPosition; -
code/trunk/src/orxonox/controllers/testscript.lua
r10262 r10622 1 print 1 print ('1: Hello World') -
code/trunk/src/orxonox/worldentities/pawns/Pawn.cc
r10216 r10622 367 367 if (GameMode::isMaster()) 368 368 { 369 // this->deathEffect();369 this->deatheffect(); 370 370 this->goWithStyle(); 371 371 } … … 387 387 { 388 388 // play death effect 389 {389 /*{ 390 390 ParticleSpawner* effect = new ParticleSpawner(this->getContext()); 391 391 effect->setPosition(this->getPosition()); … … 410 410 effect->setSource("Orxonox/sparks"); 411 411 effect->setLifetime(4.0f); 412 } 412 }*/ 413 414 415 { 416 ParticleSpawner* effect = new ParticleSpawner(this->getContext()); 417 effect->setPosition(this->getPosition()); 418 effect->setOrientation(this->getOrientation()); 419 effect->setDestroyAfterLife(true); 420 effect->setSource("orxonox/explosion_flash2"); 421 effect->setLifetime(5.0f); 422 } 423 { 424 ParticleSpawner* effect = new ParticleSpawner(this->getContext()); 425 effect->setPosition(this->getPosition()); 426 effect->setOrientation(this->getOrientation()); 427 effect->setDestroyAfterLife(true); 428 effect->setSource("orxonox/explosion_flame2"); 429 effect->setLifetime(5.0f); 430 } 431 { 432 ParticleSpawner* effect = new ParticleSpawner(this->getContext()); 433 effect->setPosition(this->getPosition()); 434 effect->setOrientation(this->getOrientation()); 435 effect->setDestroyAfterLife(true); 436 effect->setSource("orxonox/explosion_shockwave2"); 437 effect->scale(20); 438 effect->setLifetime(5.0f); 439 }{ 440 ParticleSpawner* effect = new ParticleSpawner(this->getContext()); 441 effect->setPosition(this->getPosition()); 442 effect->setOrientation(this->getOrientation()); 443 effect->setDestroyAfterLife(true); 444 effect->setSource("orxonox/explosion_sparks2"); 445 effect->setLifetime(5.0f); 446 } 447 { 448 ParticleSpawner* effect = new ParticleSpawner(this->getContext()); 449 effect->setPosition(this->getPosition()); 450 effect->setOrientation(this->getOrientation()); 451 effect->setDestroyAfterLife(true); 452 effect->setSource("orxonox/explosion_streak2"); 453 effect->setLifetime(5.0f); 454 } 455 { 456 ParticleSpawner* effect = new ParticleSpawner(this->getContext()); 457 effect->setPosition(this->getPosition()); 458 effect->setOrientation(this->getOrientation()); 459 effect->setDestroyAfterLife(true); 460 effect->setSource("orxonox/explosion_afterglow"); 461 effect->scale(20); 462 effect->setLifetime(5.0f); 463 } 464 465 413 466 for (unsigned int i = 0; i < this->numexplosionchunks_; ++i) 414 467 {
Note: See TracChangeset
for help on using the changeset viewer.