diff --git a/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.cpp b/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.cpp index 39d2f625..2fbf5df3 100644 --- a/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.cpp +++ b/Code/Game/GameClient/GameClientState/LevelLoader/LevelParser.cpp @@ -33,184 +33,187 @@ std::vector> LevelParser::Parse(std::string filen Loader loader; char* buffer = (char*)loader.LoadFile(filename.c_str(), bufferSize); - //Read format version - LevelLoaderInternal::FormatVersion levelFormatVersion; - ParseObject(&buffer[counter], &levelFormatVersion, sizeof(levelFormatVersion)); - counter += sizeof(levelFormatVersion); - if(this->formatVersion != levelFormatVersion) + if(buffer) { - //Returns an empty vector, because it will most likely fail to read the level format. - return objects; - } - - while(counter < bufferSize) - { - loadCgf = true; - //Get typeID - ObjectType typeID; - ParseObject(&buffer[counter], &typeID, sizeof(typeID)); - switch((int)typeID) + //Read format version + LevelLoaderInternal::FormatVersion levelFormatVersion; + ParseObject(&buffer[counter], &levelFormatVersion, sizeof(levelFormatVersion)); + counter += sizeof(levelFormatVersion); + if(this->formatVersion != levelFormatVersion) { - case ObjectType_LevelMetaData: + //Returns an empty vector, because it will most likely fail to read the level format. + return objects; + } + + while(counter < bufferSize) + { + loadCgf = true; + //Get typeID + ObjectType typeID; + ParseObject(&buffer[counter], &typeID, sizeof(typeID)); + switch((int)typeID) { - SmartPointer header = new LevelMetaData; - ParseLevelMetaData(&buffer[counter], *(LevelMetaData*)header.Get(), counter); - objects.push_back(header); - break; - } - - case ObjectType_SpawnPoint: - { - loadCgf = false; - ObjectHeader* header = new ObjectHeader; - ParseObject(&buffer[counter], *header, counter, loadCgf); - - SpawnPointAttributes* spawn = new SpawnPointAttributes; - - spawn->typeID = header->typeID; - - for(int i = 0; i < 3; i++) + case ObjectType_LevelMetaData: { - spawn->position[i] = header->position[i]; + SmartPointer header = new LevelMetaData; + ParseLevelMetaData(&buffer[counter], *(LevelMetaData*)header.Get(), counter); + objects.push_back(header); + break; } - delete header; - //objects.push_back(header); - objects.push_back(spawn); - break; - } - - //This is by design, static and dynamic is using the same converter. Do not add anything inbetween them. - //Unless they are changed to not be the same. - case ObjectType_Static: case ObjectType_Dynamic: - { - //Get specialType. - ObjectSpecialType specialType; - ParseObject(&buffer[counter+4], &specialType, sizeof(typeID)); - - switch(specialType) + case ObjectType_SpawnPoint: { - //there is no difference when parsing these specialTypes. - case ObjectSpecialType_CrystalShard: - case ObjectSpecialType_CrystalFormation: - case ObjectSpecialType_Spike: - case ObjectSpecialType_SpikeBox: - case ObjectSpecialType_RedExplosiveBox: - case ObjectSpecialType_StandarsBox: - case ObjectSpecialType_Stone: - case ObjectSpecialType_Building: - { - ObjectHeader* header = new ObjectHeader; - ParseObject(&buffer[counter], *header, counter, loadCgf); - objects.push_back(header); + loadCgf = false; + ObjectHeader* header = new ObjectHeader; + ParseObject(&buffer[counter], *header, counter, loadCgf); - break; + SpawnPointAttributes* spawn = new SpawnPointAttributes; + + spawn->typeID = header->typeID; + + for(int i = 0; i < 3; i++) + { + spawn->position[i] = header->position[i]; } - case ObjectSpecialType_JumpPad: + delete header; + //objects.push_back(header); + objects.push_back(spawn); + break; + } + + //This is by design, static and dynamic is using the same converter. Do not add anything inbetween them. + //Unless they are changed to not be the same. + case ObjectType_Static: case ObjectType_Dynamic: + { + //Get specialType. + ObjectSpecialType specialType; + ParseObject(&buffer[counter+4], &specialType, sizeof(typeID)); + + switch(specialType) { - JumpPadAttributes* header = new JumpPadAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); + //there is no difference when parsing these specialTypes. + case ObjectSpecialType_CrystalShard: + case ObjectSpecialType_CrystalFormation: + case ObjectSpecialType_Spike: + case ObjectSpecialType_SpikeBox: + case ObjectSpecialType_RedExplosiveBox: + case ObjectSpecialType_StandarsBox: + case ObjectSpecialType_Stone: + case ObjectSpecialType_Building: + { + ObjectHeader* header = new ObjectHeader; + ParseObject(&buffer[counter], *header, counter, loadCgf); + objects.push_back(header); - //Read the spec - ParseObject(&buffer[counter], header->direction, 16); - counter += 16; - objects.push_back(header); + break; + } - break; - } + case ObjectSpecialType_JumpPad: + { + JumpPadAttributes* header = new JumpPadAttributes; + ParseObject(&buffer[counter], *header, counter, loadCgf); + + //Read the spec + ParseObject(&buffer[counter], header->direction, 16); + counter += 16; + objects.push_back(header); + + break; + } - case ObjectSpecialType_Portal: - { - PortalAttributes* header = new PortalAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); + case ObjectSpecialType_Portal: + { + PortalAttributes* header = new PortalAttributes; + ParseObject(&buffer[counter], *header, counter, loadCgf); - ParseObject(&buffer[counter], header->destination, 12); - counter += 12; - objects.push_back(header); + ParseObject(&buffer[counter], header->destination, 12); + counter += 12; + objects.push_back(header); - break; - } + break; + } - case ObjectSpecialType_World: - { - WorldAttributes* header = new WorldAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); + case ObjectSpecialType_World: + { + WorldAttributes* header = new WorldAttributes; + ParseObject(&buffer[counter], *header, counter, loadCgf); - ParseObject(&buffer[counter], &header->worldSize, 8); - counter += 8; - objects.push_back(header); - break; - } + ParseObject(&buffer[counter], &header->worldSize, 8); + counter += 8; + objects.push_back(header); + break; + } - case ObjectSpecialType_Sky: - { - loadCgf = false; - SkyAttributes* header = new SkyAttributes; - ParseObject(&buffer[counter], *header, counter, loadCgf); + case ObjectSpecialType_Sky: + { + loadCgf = false; + SkyAttributes* header = new SkyAttributes; + ParseObject(&buffer[counter], *header, counter, loadCgf); - ParseObject(&buffer[counter], &header->skySize, 4); - counter += 4; - objects.push_back(header); - break; - } - //this is a hotfix, fix so you only load the relevant data when the file is updated + ParseObject(&buffer[counter], &header->skySize, 4); + counter += 4; + objects.push_back(header); + break; + } + //this is a hotfix, fix so you only load the relevant data when the file is updated - default: - //Couldn't find specialType - break; + default: + //Couldn't find specialType + break; + } + break; } - break; - } - case ObjectType_Light: - { - LightType lightType; + case ObjectType_Light: + { + LightType lightType; - //Get Light type - ParseObject(&buffer[counter+4], &lightType, sizeof(lightType)); + //Get Light type + ParseObject(&buffer[counter+4], &lightType, sizeof(lightType)); - //We only support PointLight for now. - BasicLight* header = new BasicLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - /*switch(lightType) - { - case LightType_PointLight: - { - PointLight* header = new PointLight; + //We only support PointLight for now. + BasicLight* header = new BasicLight; ParseObject(&buffer[counter], header, sizeof(*header)); counter += sizeof(*header); objects.push_back(header); - break; - } - case LightType_DirectionalLight: - { - DirectionalLight* header = new DirectionalLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - break; - } - case LightType_SpotLight: - { - SpotLight* header = new SpotLight; - ParseObject(&buffer[counter], header, sizeof(*header)); - counter += sizeof(*header); - objects.push_back(header); - break; + /*switch(lightType) + { + case LightType_PointLight: + { + PointLight* header = new PointLight; + ParseObject(&buffer[counter], header, sizeof(*header)); + counter += sizeof(*header); + objects.push_back(header); + break; + } + case LightType_DirectionalLight: + { + DirectionalLight* header = new DirectionalLight; + ParseObject(&buffer[counter], header, sizeof(*header)); + counter += sizeof(*header); + objects.push_back(header); + break; + } + case LightType_SpotLight: + { + SpotLight* header = new SpotLight; + ParseObject(&buffer[counter], header, sizeof(*header)); + counter += sizeof(*header); + objects.push_back(header); + break; + } + default: + //Undefined LightType. + break; + } + break;*/ } default: - //Undefined LightType. + //Couldn't find typeID. FAIL!!!!!! break; - } - break;*/ } - default: - //Couldn't find typeID. FAIL!!!!!! - break; } } diff --git a/Code/Network/NetworkAPI/NetworkClient.cpp b/Code/Network/NetworkAPI/NetworkClient.cpp index 69872fc1..6f2998e9 100644 --- a/Code/Network/NetworkAPI/NetworkClient.cpp +++ b/Code/Network/NetworkAPI/NetworkClient.cpp @@ -317,6 +317,11 @@ bool NetworkClient::Connect(unsigned short port, std::wstring serverIP) return this->Connect(port, ip.c_str()); } +bool NetworkClient::Reconnect() +{ + return this->privateData->connection.Reconnect(); +} + void NetworkClient::Disconnect() { if(!privateData) return; diff --git a/Code/Network/NetworkAPI/NetworkClient.h b/Code/Network/NetworkAPI/NetworkClient.h index 6f037117..a7f3b0bb 100644 --- a/Code/Network/NetworkAPI/NetworkClient.h +++ b/Code/Network/NetworkAPI/NetworkClient.h @@ -93,6 +93,11 @@ namespace Oyster */ bool Connect(unsigned short port, std::wstring serverIP); + /**Tries to connect with the same port and ip it earlier used for Connect. + * + */ + bool Reconnect(); + /** * */ diff --git a/Code/Network/NetworkDependencies/Connection.cpp b/Code/Network/NetworkDependencies/Connection.cpp index 99cb8a71..a9abf75c 100644 --- a/Code/Network/NetworkDependencies/Connection.cpp +++ b/Code/Network/NetworkDependencies/Connection.cpp @@ -58,6 +58,9 @@ int Connection::Connect(unsigned short port , const char serverName[], bool bloc { if(this->socket == -1 || this->socket == 0) InitiateSocket(); + lastConnectPort = port; + lastConnectAddr = serverName; + struct hostent *hostEnt; if((hostEnt = gethostbyname(serverName)) == NULL) { @@ -83,6 +86,37 @@ int Connection::Connect(unsigned short port , const char serverName[], bool bloc return 0; } +int Connection::Reconnect() +{ + if(this->socket == -1 || this->socket == 0) InitiateSocket(); + + struct hostent *hostEnt; + if((hostEnt = gethostbyname(lastConnectAddr.c_str())) == NULL) + { + return WSAGetLastError(); + } + + struct sockaddr_in server; + server.sin_family = AF_INET; + server.sin_port = htons(lastConnectPort); + server.sin_addr.s_addr = *(unsigned long*) hostEnt->h_addr; + + SetBlockingMode(true); + + if(connect(this->socket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) + { + return WSAGetLastError(); + } + + closed = false; + stillSending = true; + + SetBlockingMode(blocking); + + //connection succesfull! + return 0; +} + int Connection::InitiateServer(unsigned short port) { int errorCode = 0; diff --git a/Code/Network/NetworkDependencies/Connection.h b/Code/Network/NetworkDependencies/Connection.h index 0f46a599..054537fc 100644 --- a/Code/Network/NetworkDependencies/Connection.h +++ b/Code/Network/NetworkDependencies/Connection.h @@ -28,6 +28,7 @@ namespace Oyster virtual int Disconnect(); virtual int Connect(ConnectionInfo info, bool blocking = false); virtual int Connect(unsigned short port , const char serverName[], bool blocking = false); + virtual int Reconnect(); virtual ConnectionInfo Listen(); @@ -47,6 +48,11 @@ namespace Oyster bool stillSending; bool closed; std::string addr; + + std::string lastConnectAddr; + unsigned short lastConnectPort; + + bool blocking; }; } } diff --git a/Code/Network/NetworkDependencies/IConnection.h b/Code/Network/NetworkDependencies/IConnection.h index 7c92f318..debdfe7b 100644 --- a/Code/Network/NetworkDependencies/IConnection.h +++ b/Code/Network/NetworkDependencies/IConnection.h @@ -39,6 +39,9 @@ namespace Oyster //(servers uses Listen instead of connect) virtual int Connect( unsigned short port, const char serverName[] ) { return false; }; + //Tries to connect with the same port and ip used for Connect. + virtual int Reconnect() = 0; + //Disconnects the client or server TODO: optimize! virtual int Disconnect() = 0; };