From b93e20e9423a59682f8e70aac18feb45a9b6e14f Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Mon, 17 Feb 2014 14:33:11 +0100 Subject: [PATCH 1/6] Bunch of implementations --- .../GameClient/GameClientState/GameState.cpp | 413 ++++++------------ .../GameClient/GameClientState/GameState.h | 29 +- .../GameClientState/LanMenuState.cpp | 4 +- .../GameClientState/NetLoadState.cpp | 89 +++- .../GameClientState/SharedStateContent.h | 6 +- 5 files changed, 234 insertions(+), 307 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 1691a470..29cfec03 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -5,10 +5,16 @@ #include "Camera_FPS.h" #include +#include "C_obj/C_Player.h" +#include "C_obj/C_DynamicObj.h" +#include "C_obj/C_StaticObj.h" + using namespace ::DanBias::Client; using namespace ::Oyster; using namespace ::Oyster::Network; using namespace ::Oyster::Math3D; +using namespace ::GameLogic; +using namespace ::Utility::DynamicMemory; struct GameState::MyData { @@ -17,17 +23,26 @@ struct GameState::MyData NetworkClient *nwClient; InputClass *input; - ::std::map> *staticObjects; - ::std::map> *dynamicObjects; + ::std::map> *staticObjects; + ::std::map> *dynamicObjects; + + bool key_forward; + bool key_backward; + bool key_strafeRight; + bool key_strafeLeft; + bool key_Shoot; + bool key_Jump; + + C_Player player; + Camera_FPS camera; + + int myId; } privData; GameState::GameState() { - key_forward = false; - key_backward = false; - key_strafeRight = false; - key_strafeLeft = false; + this->privData = nullptr; } GameState::~GameState() @@ -38,202 +53,69 @@ GameState::~GameState() bool GameState::Init( SharedStateContent &shared ) { - // load models - privData = new MyData(); + // we may assume that shared.network is properly connected + // and there is content in shared.dynamicObjects and shared.staticObjects + + this->privData = new MyData(); + + this->privData->key_forward = false; + this->privData->key_backward = false; + this->privData->key_strafeRight = false; + this->privData->key_strafeLeft = false; this->privData->nextState = GameClientState::ClientState_Same; this->privData->nwClient = shared.network; this->privData->input = shared.input; - - LoadGame(); + this->privData->staticObjects = &shared.staticObjects; + this->privData->dynamicObjects = &shared.dynamicObjects; //tell server ready - this->privData->nwClient->Send( GameLogic::Protocol_General_Status(GameLogic::Protocol_General_Status::States_ready) ); + this->privData->nwClient->Send( Protocol_General_Status(Protocol_General_Status::States_ready) ); return true; } -GameState::gameStateState GameState::LoadGame() +void GameState::InitiatePlayer( int id, std::wstring modelName, Float4x4 world ) { - - return gameStateState_playing; -} - -bool GameState::LoadModels(std::string mapFile) -{ - GameLogic::LevelLoader levelLoader; - std::vector> objects; - objects = levelLoader.LoadLevel(mapFile); - - int objCount = objects.size(); - int modelId = 0; - ModelInitData modelData; - for (int i = 0; i < objCount; i++) - { - GameLogic::ObjectTypeHeader* obj = objects.at(i); - - switch (obj->typeID) - { - case GameLogic::ObjectType::ObjectType_LevelMetaData: - - break; - case GameLogic::ObjectType::ObjectType_Static: - { - GameLogic::ObjectHeader* staticObjData = ((GameLogic::ObjectHeader*)obj); - - modelData.modelPath.assign(staticObjData->ModelFile.begin(), staticObjData->ModelFile.end()); - modelData.visible = true; - //modelData.position = ; - //modelData.rotation = Quaternion(Float3(2,2,-2), 1); - //modelData.scale = Float3(2,2,2); - modelData.id = modelId++; - - this->staticObjects.Push(new C_StaticObj()); - this->staticObjects[this->staticObjects.Size() -1 ]->Init(modelData); - } - break; - case GameLogic::ObjectType::ObjectType_Dynamic: - { - GameLogic::ObjectHeader* dynamicObjData = ((GameLogic::ObjectHeader*)obj); - //modelData.position = ; - //modelData.rotation = Quaternion(Float3(2,2,-2), 1); - //modelData.scale = Float3(2,2,2); - modelData.modelPath.assign(dynamicObjData->ModelFile.begin(), dynamicObjData->ModelFile.end()); - modelData.visible = true; - modelData.id = modelId++; - - this->dynamicObjects.Push(new C_DynamicObj()); - this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData); - } - break; - case GameLogic::ObjectType::ObjectType_Light: - { - GameLogic::BasicLight* lightData = ((GameLogic::BasicLight*)obj); - - switch( lightData->lightType ) - { - case GameLogic::LightType_PointLight: - { - //Oyster::Graphics::Definitions::Pointlight plight; - //plight.Pos = ((GameLogic::PointLight*)lightData)->position; - //plight.Color = lightData->diffuseColor; - //plight.Radius = 100; - //plight.Bright = 0.9f; - //Oyster::Graphics::API::AddLight(plight); - } - break; - default: break; - } - } - break; - default: - break; - } - } - myId += modelId++; - // add player model - //modelData.position = ; - //modelData.rotation = Quaternion(Float3(2,2,-2), 1); - //modelData.scale = Float3(2,2,2); - - - modelData.visible = true; - modelData.modelPath = L"char_still_sizeref.dan"; - modelData.id = myId; - // load models - this->dynamicObjects.Push(new C_DynamicObj()); - this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData); - - /*C_Player* obj = new C_Player(); - privData->object.push_back(obj); - privData->object[privData->object.size() -1 ]->Init(modelData); - */ - return true; - -} - -bool GameState::InitCamera(Float3 startPos) -{ - camera.SetHeadOffset( Float3(0.0f, 1.0f, 1.0f) ); - camera.SetPerspectiveProjection( pi / 4.0f, 1024.0f/768.0f, 1.0f, 1000.0f ); - camera.UpdateOrientation(); - Oyster::Graphics::API::SetProjection(camera.GetProjectionMatrix()); - - return true; -} - -void GameState::InitiatePlayer(int id, std::wstring modelName, Float4x4 world) -{ - myId = id; + this->privData->myId = id; ModelInitData modelData; - C_Object* obj; modelData.visible = true; - //modelData.world = world; modelData.position = Float3(world[12], world[13], world[14]); modelData.rotation = Quaternion(Float3(0,0,0), 1); modelData.scale = Float3(1,1,1); modelData.modelPath = modelName; - modelData.id = myId; - - obj = new C_Player(); - this->dynamicObjects.Push(obj); - this->dynamicObjects[this->dynamicObjects.Size() -1 ]->Init(modelData); + modelData.id = this->privData->myId; + this->privData->player.Init( modelData ); - Float3 pos = Float3(world[12], world[13], world[14]); - - camera.SetPosition( pos ); - camera.UpdateOrientation(); + this->privData->camera.SetPosition( this->privData->player.getPos() ); + this->privData->camera.UpdateOrientation(); } GameClientState::ClientState GameState::Update( float deltaTime ) { - //switch (privData->state) - //{ - //case gameStateState_loading: //Will this ever happen in this scope?? - // { - // // load map - // // wait for all players - // LoadGame(); - // GameLogic::Protocol_General_Status gameStatus; - // gameStatus.status = GameLogic::Protocol_General_Status::States_ready; - // privData->nwClient->Send(gameStatus); - // privData->state = gameStateState_playing; - // } - // break; - //case gameStateState_playing: - // // read server data - // // update objects - // { - // readKeyInput(KeyInput); - // camera.UpdateOrientation(); - // } - // break; - //case gameStateState_end: - // return ClientState_Lobby; - // break; - //default: - // break; - //} - // - //// send key input to server. - //return ClientState_Same; - return this->privData->nextState; } bool GameState::Render() { - Oyster::Graphics::API::SetView( camera.GetViewMatrix() ); + Oyster::Graphics::API::SetView( this->privData->camera.GetViewMatrix() ); Oyster::Graphics::API::NewFrame(); - for (unsigned int i = 0; i < staticObjects.Size(); i++) + + // for debugging to be replaced with render weapon + this->privData->player.Render(); + + auto staticObject = this->privData->staticObjects->begin(); + for( ; staticObject != this->privData->staticObjects->end(); ++staticObject ) { - staticObjects[i]->Render(); + staticObject->second->Render(); } - for (unsigned int i = 0; i < dynamicObjects.Size(); i++) + + auto dynamicObject = this->privData->dynamicObjects->begin(); + for( ; dynamicObject != this->privData->dynamicObjects->end(); ++dynamicObject ) { - dynamicObjects[i]->Render(); + dynamicObject->second->Render(); } Oyster::Graphics::API::EndFrame(); @@ -242,8 +124,25 @@ bool GameState::Render() bool GameState::Release() { + if( privData ) + { + auto staticObject = this->privData->staticObjects->begin(); + for( ; staticObject != this->privData->staticObjects->end(); ++staticObject ) + { + staticObject->second = nullptr; + } - privData = NULL; + auto dynamicObject = this->privData->dynamicObjects->begin(); + for( ; dynamicObject != this->privData->dynamicObjects->end(); ++dynamicObject ) + { + dynamicObject->second = nullptr; + } + + this->privData->staticObjects->clear(); + this->privData->dynamicObjects->clear(); + + privData = NULL; + } return true; } @@ -252,138 +151,119 @@ void GameState::ChangeState( ClientState next ) this->privData->nextState = next; } -void GameState::readKeyInput(InputClass* KeyInput) +void GameState::ReadKeyInput() { - if(KeyInput->IsKeyPressed(DIK_W)) + if( this->privData->input->IsKeyPressed(DIK_W) ) { - if(!key_forward) + if(!this->privData->key_forward) { - privData->nwClient->Send(GameLogic::Protocol_PlayerMovementForward()); - key_forward = true; + this->privData->nwClient->Send( Protocol_PlayerMovementForward() ); + this->privData->key_forward = true; } } else - key_forward = false; + this->privData->key_forward = false; - if(KeyInput->IsKeyPressed(DIK_S)) + if( this->privData->input->IsKeyPressed(DIK_S) ) { - if(!key_backward) + if( !this->privData->key_backward ) { - privData->nwClient->Send(GameLogic::Protocol_PlayerMovementBackward()); - key_backward = true; + this->privData->nwClient->Send( Protocol_PlayerMovementBackward() ); + this->privData->key_backward = true; } } else - key_backward = false; + this->privData->key_backward = false; - if(KeyInput->IsKeyPressed(DIK_A)) + if( this->privData->input->IsKeyPressed(DIK_A) ) { - if(!key_strafeLeft) + if( !this->privData->key_strafeLeft ) { - privData->nwClient->Send(GameLogic::Protocol_PlayerMovementLeft()); - key_strafeLeft = true; + this->privData->nwClient->Send( Protocol_PlayerMovementLeft() ); + this->privData->key_strafeLeft = true; } } else - key_strafeLeft = false; + this->privData->key_strafeLeft = false; - if(KeyInput->IsKeyPressed(DIK_D)) + if( this->privData->input->IsKeyPressed(DIK_D) ) { - if(!key_strafeRight) + if( !this->privData->key_strafeRight ) { - privData->nwClient->Send(GameLogic::Protocol_PlayerMovementRight()); - key_strafeRight = true; + this->privData->nwClient->Send( Protocol_PlayerMovementRight() ); + this->privData->key_strafeRight = true; } } else - key_strafeRight = false; + this->privData->key_strafeRight = false; //send delta mouse movement - //if (KeyInput->IsMousePressed()) { - camera.YawRight( -KeyInput->GetYaw() ); - camera.PitchUp( KeyInput->GetPitch() ); - camera.UpdateOrientation(); + this->privData->camera.YawRight( -this->privData->input->GetYaw() ); + this->privData->camera.PitchUp( this->privData->input->GetPitch() ); + this->privData->camera.UpdateOrientation(); - GameLogic::Protocol_PlayerLook playerLookDir; - Float4 look = camera.GetLook(); - - privData->nwClient->Send( playerLookDir ); + privData->nwClient->Send( Protocol_PlayerLook(this->privData->camera.GetLook(), this->privData->camera.GetRight()) ); } // shoot - if(KeyInput->IsKeyPressed(DIK_Z)) + if( this->privData->input->IsKeyPressed(DIK_Z) ) { - if(!key_Shoot) + if( !this->privData->key_Shoot ) { - GameLogic::Protocol_PlayerShot playerShot; + Protocol_PlayerShot playerShot; playerShot.primaryPressed = true; playerShot.secondaryPressed = false; playerShot.utilityPressed = false; - privData->nwClient->Send(playerShot); - key_Shoot = true; + this->privData->nwClient->Send( playerShot ); + this->privData->key_Shoot = true; } } else - key_Shoot = false; - if(KeyInput->IsKeyPressed(DIK_X)) + this->privData->key_Shoot = false; + if( this->privData->input->IsKeyPressed(DIK_X) ) { - if(!key_Shoot) + if( !this->privData->key_Shoot ) { - GameLogic::Protocol_PlayerShot playerShot; + Protocol_PlayerShot playerShot; playerShot.primaryPressed = false; playerShot.secondaryPressed = true; playerShot.utilityPressed = false; - privData->nwClient->Send(playerShot); - key_Shoot = true; + this->privData->nwClient->Send( playerShot ); + this->privData->key_Shoot = true; } } else - key_Shoot = false; - if(KeyInput->IsKeyPressed(DIK_C)) + this->privData->key_Shoot = false; + if( this->privData->input->IsKeyPressed(DIK_C) ) { - if(!key_Shoot) + if( !this->privData->key_Shoot ) { - GameLogic::Protocol_PlayerShot playerShot; + Protocol_PlayerShot playerShot; playerShot.primaryPressed = false; playerShot.secondaryPressed = false; playerShot.utilityPressed = true; - privData->nwClient->Send(playerShot); - key_Shoot = true; + this->privData->nwClient->Send( playerShot ); + this->privData->key_Shoot = true; } } else - key_Shoot = false; + this->privData->key_Shoot = false; // jump - if(KeyInput->IsKeyPressed(DIK_SPACE)) + if( this->privData->input->IsKeyPressed(DIK_SPACE) ) { - if(!key_Jump) + if(!this->privData->key_Jump) { - privData->nwClient->Send(GameLogic::Protocol_PlayerJump()); - key_Jump = true; + this->privData->nwClient->Send( Protocol_PlayerJump() ); + this->privData->key_Jump = true; } } else - key_Jump = false; + this->privData->key_Jump = false; - // send event data - // - //if(KeyInput->IsKeyPressed(DIK_L)) - // privData->state = GameState::gameStateState_end; -} - -using namespace ::Oyster::Network; -using namespace ::Utility::DynamicMemory; - -// returns -1 if none found -int FindObject( const DynamicArray> &collection, int id ) -{ - int num = collection.Size(); - for( int i = 0; i < num; ++i ) if( id == collection[i]->GetId() ) - return i; - return -1; + // TODO: implement sub-menu } void GameState::DataRecieved( NetEvent e ) @@ -400,76 +280,67 @@ void GameState::DataRecieved( NetEventmyId == decoded.object_ID ) - camera.SetPosition( decoded.position ); + if( this->privData->myId == decoded.object_ID ) + this->privData->camera.SetPosition( decoded.position ); - int i = FindObject( this->dynamicObjects, decoded.object_ID ); - if( i > -1 ) - this->dynamicObjects[i]->setPos( decoded.position ); + (*this->privData->dynamicObjects)[decoded.object_ID]->setPos( decoded.position ); } break; case protocol_Gameplay_ObjectScale: { - GameLogic::Protocol_ObjectScale decoded(data); - int i = FindObject( this->dynamicObjects, decoded.object_ID ); - if( i > -1 ) - this->dynamicObjects[i]->setScale( decoded.scale ); + Protocol_ObjectScale decoded(data); + (*this->privData->dynamicObjects)[decoded.object_ID]->setScale( decoded.scale ); } break; case protocol_Gameplay_ObjectRotation: { - GameLogic::Protocol_ObjectRotation decoded(data); + Protocol_ObjectRotation decoded(data); Quaternion rotation = Quaternion( Float3(decoded.rotationQ), decoded.rotationQ[3] ); // if is this player. Remember to change camera - if( this->myId == decoded.object_ID ) - camera.SetAngular( AngularAxis(rotation) ); + if( this->privData->myId == decoded.object_ID ) + this->privData->camera.SetAngular( AngularAxis(rotation) ); - int i = FindObject( this->dynamicObjects, decoded.object_ID ); - if( i > -1 ) - this->dynamicObjects[i]->setRot( rotation ); + (*this->privData->dynamicObjects)[decoded.object_ID]->setRot( rotation ); } break; case protocol_Gameplay_ObjectPositionRotation: { - GameLogic::Protocol_ObjectPositionRotation decoded(data); + Protocol_ObjectPositionRotation decoded(data); Float3 position = decoded.position; Quaternion rotation = Quaternion( Float3(decoded.rotationQ), decoded.rotationQ[3] ); // if is this player. Remember to change camera - if( this->myId == decoded.object_ID ) + if( this->privData->myId == decoded.object_ID ) { - camera.SetPosition( position ); - camera.SetAngular( AngularAxis(rotation) ); + this->privData->camera.SetPosition( position ); + this->privData->camera.SetAngular( AngularAxis(rotation) ); } - int i = FindObject( this->dynamicObjects, decoded.object_ID ); - if( i > -1 ) - { - this->dynamicObjects[i]->setPos( position ); - this->dynamicObjects[i]->setRot( rotation ); - } + C_DynamicObj *object = (*this->privData->dynamicObjects)[decoded.object_ID]; + object->setPos( position ); + object->setRot( rotation ); } break; case protocol_Gameplay_ObjectEnabled: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectDisabled: { - GameLogic::Protocol_ObjectDisable decoded(data); + Protocol_ObjectDisable decoded(data); - int i = FindObject( this->dynamicObjects, decoded.objectID ); - if( i > -1 ) + auto object = this->privData->dynamicObjects->find( decoded.objectID ); + if( object != this->privData->dynamicObjects->end() ) { - this->dynamicObjects[i].Release(); - this->dynamicObjects.Pop(i); + object->second = nullptr; + this->privData->dynamicObjects->erase( object ); } } break; case protocol_Gameplay_ObjectCreate: { - GameLogic::Protocol_ObjectCreate decoded(data); + Protocol_ObjectCreate decoded(data); C_DynamicObj* object = new C_DynamicObj(); ModelInitData modelData; @@ -484,7 +355,7 @@ void GameState::DataRecieved( NetEventInit(modelData); - dynamicObjects.Push(object); + (*this->privData->dynamicObjects)[decoded.object_ID] = object; } break; diff --git a/Code/Game/GameClient/GameClientState/GameState.h b/Code/Game/GameClient/GameClientState/GameState.h index 5a3b3c1a..29ea2f1e 100644 --- a/Code/Game/GameClient/GameClientState/GameState.h +++ b/Code/Game/GameClient/GameClientState/GameState.h @@ -4,13 +4,6 @@ #include "OysterMath.h" #include -#include "Camera_FPS.h" -#include "LevelLoader/LevelLoader.h" -#include "C_obj/C_Player.h" -#include "C_obj/C_DynamicObj.h" -#include "C_obj/C_StaticObj.h" -#include "DynamicArray.h" - namespace DanBias { namespace Client { class GameState : public GameClientState @@ -27,12 +20,8 @@ namespace DanBias { namespace Client ~GameState(void); bool Init( SharedStateContent &shared ); GameClientState::ClientState Update( float deltaTime ) override; - - bool LoadModels(std::string mapFile); - bool InitCamera(Oyster::Math::Float3 startPos) ; - void InitiatePlayer(int id, std::wstring modelName, Oyster::Math::Float4x4 world); - gameStateState LoadGame(); - void readKeyInput(InputClass* KeyInput); + void InitiatePlayer( int id, std::wstring modelName, Oyster::Math::Float4x4 world ); + void ReadKeyInput(); bool Render()override; bool Release()override; @@ -43,20 +32,6 @@ namespace DanBias { namespace Client private: struct MyData; ::Utility::DynamicMemory::UniquePointer privData; - - bool key_forward; - bool key_backward; - bool key_strafeRight; - bool key_strafeLeft; - bool key_Shoot; - bool key_Jump; - Camera_FPS camera; - - int myId; - - Utility::DynamicMemory::DynamicArray> staticObjects; - Utility::DynamicMemory::DynamicArray> dynamicObjects; - //Utility::DynamicMemory::DynamicArray> playObjects; }; } } #endif \ No newline at end of file diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.cpp b/Code/Game/GameClient/GameClientState/LanMenuState.cpp index 3051c097..0615f209 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.cpp +++ b/Code/Game/GameClient/GameClientState/LanMenuState.cpp @@ -123,8 +123,8 @@ void LanMenuState::ChangeState( ClientState next ) { case GameClientState::ClientState_Lobby: // attempt to connect to lobby - //if( !this->privData->nwClient->Connect(this->privData->connectPort, (*this->privData->connectIP)[0]) ) - // return; // TODO: temporary commented out + if( !this->privData->nwClient->Connect(this->privData->connectPort, (*this->privData->connectIP)[0]) ) + return; break; default: break; } diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index 3463182e..8274472d 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -1,13 +1,18 @@ #include "NetLoadState.h" #include "NetworkClient.h" #include "OysterMath.h" -#include "../Game/GameProtocols/Protocols.h" +#include "Protocols.h" +#include "LevelLoader\LevelLoader.h" +#include "Utilities.h" +#include "C_obj\C_StaticObj.h" +#include "C_obj\C_DynamicObj.h" using namespace ::DanBias::Client; using namespace ::Oyster; using namespace ::Oyster::Math; using namespace ::Oyster::Network; using namespace ::GameLogic; +using namespace ::Utility::String; struct NetLoadState::MyData { @@ -16,9 +21,17 @@ struct NetLoadState::MyData GameClientState::ClientState nextState; NetworkClient *nwClient; Graphics::API::Texture background; + ::std::map> *staticObjects; + ::std::map> *dynamicObjects; + bool loading; }; +inline Quaternion ArrayToQuaternion( float source[4] ) +{ + return Quaternion( Float3(source[0], source[1], source[2]), source[3] ); +} + NetLoadState::NetLoadState(void) {} NetLoadState::~NetLoadState(void) @@ -31,9 +44,12 @@ bool NetLoadState::Init( SharedStateContent &shared ) { this->privData = new MyData(); - this->privData->nextState = GameClientState::ClientState_Same; - this->privData->nwClient = shared.network; - this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" ); + this->privData->nextState = GameClientState::ClientState_Same; + this->privData->nwClient = shared.network; + this->privData->background = Graphics::API::CreateTexture( L"grass_md.png" ); + this->privData->dynamicObjects = &shared.dynamicObjects; + this->privData->staticObjects = &shared.staticObjects; + this->privData->loading = false; // we may assume that nwClient is properly connected to the server @@ -82,6 +98,7 @@ void NetLoadState::DataRecieved( NetEventprivData->loading ) { this->LoadGame( Protocol_LobbyCreateGame(e.args.data.protocol).modelName ); + this->ChangeState( ClientState_Game ); } } @@ -89,7 +106,69 @@ void NetLoadState::LoadGame( const ::std::string &fileName ) { this->privData->loading = true; - // TODO: ask Sam about level loader + LevelLoader loader; + auto objects = loader.LoadLevel( fileName ); + auto object = objects.begin(); + ObjectHeader *oh; + + int objectID = 100; // first 100 is reserved for players. This is how the server does it. + + for( ; object != objects.end(); ++object ) + { + ++objectID; + oh = (ObjectHeader*)&*object; + switch( oh->typeID ) + { + case ObjectType::ObjectType_Static: + { + ModelInitData desc; + desc.id = objectID; + StringToWstring( oh->ModelFile, desc.modelPath ); + desc.position = oh->position; + desc.rotation = ArrayToQuaternion( oh->rotation ); + desc.scale = oh->scale; + desc.visible = true; + + C_StaticObj *staticObject = new C_StaticObj(); + if( staticObject->Init( desc ) ) + { + (*this->privData->staticObjects)[objectID] = staticObject; + } + else + { + delete staticObject; + } + } + break; + case ObjectType::ObjectType_Dynamic: + { + ModelInitData desc; + desc.id = objectID; + StringToWstring( oh->ModelFile, desc.modelPath ); + desc.position = oh->position; + desc.rotation = ArrayToQuaternion( oh->rotation ); + desc.scale = oh->scale; + desc.visible = true; + + C_DynamicObj *dynamicObject = new C_DynamicObj(); + if( dynamicObject->Init( desc ) ) + { + (*this->privData->dynamicObjects)[objectID] = dynamicObject; + } + else + { + delete dynamicObject; + } + } + break; + case ObjectType::ObjectType_Light: + { + /* TODO: implement light into the leveformat */ + } + break; + default: break; + } + } this->privData->nextState = ClientState::ClientState_Game; } diff --git a/Code/Game/GameClient/GameClientState/SharedStateContent.h b/Code/Game/GameClient/GameClientState/SharedStateContent.h index 2fabb1ac..da9dc759 100644 --- a/Code/Game/GameClient/GameClientState/SharedStateContent.h +++ b/Code/Game/GameClient/GameClientState/SharedStateContent.h @@ -11,6 +11,8 @@ #include #include "Utilities.h" #include "C_Object.h" +#include "C_obj\C_StaticObj.h" +#include "C_obj\C_DynamicObj.h" #include "NetworkClient.h" #include "L_inputClass.h" @@ -19,8 +21,8 @@ namespace DanBias { namespace Client struct SharedStateContent { public: - ::std::map> staticObjects; - ::std::map> dynamicObjects; + ::std::map> staticObjects; + ::std::map> dynamicObjects; ::Oyster::Network::NetworkClient *network; InputClass* input; }; From 2bc7c9f65f4088547f4b712fa3e0878d1e20a488 Mon Sep 17 00:00:00 2001 From: dean11 Date: Mon, 17 Feb 2014 15:11:12 +0100 Subject: [PATCH 2/6] GameServer - added more features to object protocols --- Code/Game/GameClient/GameClient.vcxproj.user | 2 +- Code/Game/GameLogic/GameLogic.vcxproj.user | 2 +- Code/Game/GameProtocols/ObjectProtocols.h | 54 +++++++++++++++---- .../GameServer/Implementation/GameLobby.cpp | 3 -- .../GameServer/Implementation/GameServer.cpp | 4 -- 5 files changed, 45 insertions(+), 20 deletions(-) diff --git a/Code/Game/GameClient/GameClient.vcxproj.user b/Code/Game/GameClient/GameClient.vcxproj.user index 4b847ee6..2e28d6f7 100644 --- a/Code/Game/GameClient/GameClient.vcxproj.user +++ b/Code/Game/GameClient/GameClient.vcxproj.user @@ -1,7 +1,7 @@  - false + true $(OutDir) diff --git a/Code/Game/GameLogic/GameLogic.vcxproj.user b/Code/Game/GameLogic/GameLogic.vcxproj.user index 2e28d6f7..4b847ee6 100644 --- a/Code/Game/GameLogic/GameLogic.vcxproj.user +++ b/Code/Game/GameLogic/GameLogic.vcxproj.user @@ -1,7 +1,7 @@  - true + false $(OutDir) diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index 70e24883..e3449022 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -476,7 +476,21 @@ namespace GameLogic } Protocol_ObjectCreate( Oyster::Network::CustomNetProtocol& p ) { - /** @todo TODO: not implemented */ + this->object_ID = p[1].value.netInt; + this->name.assign(p[2].value.netCharPtr); + + this->position[0] = p[3].value.netFloat; + this->position[1] = p[4].value.netFloat; + this->position[2] = p[5].value.netFloat; + + this->rotationQ[0] = p[6].value.netFloat; + this->rotationQ[1] = p[7].value.netFloat; + this->rotationQ[2] = p[8].value.netFloat; + this->rotationQ[3] = p[9].value.netFloat; + + this->scale[0] = p[10].value.netFloat; + this->scale[1] = p[11].value.netFloat; + this->scale[2] = p[12].value.netFloat; } Protocol_ObjectCreate(float p[3], float r[4], float s[3], int id, char *path) { @@ -538,7 +552,7 @@ namespace GameLogic std::string name; std::string meshName; float position[3]; - float rotation[3]; + float rotationQ[4]; float scale[3]; Protocol_ObjectCreatePlayer() @@ -569,9 +583,25 @@ namespace GameLogic } Protocol_ObjectCreatePlayer(Oyster::Network::CustomNetProtocol& p) { + this->object_ID = p[1].value.netInt; + this->teamId = this->protocol[2].value.netInt; + this->name.assign(p[3].value.netCharPtr); + this->meshName.assign(p[4].value.netCharPtr); + + this->position[0] = p[5].value.netFloat; + this->position[1] = p[6].value.netFloat; + this->position[2] = p[7].value.netFloat; + this->rotationQ[0] = p[8].value.netFloat; + this->rotationQ[1] = p[9].value.netFloat; + this->rotationQ[2] = p[10].value.netFloat; + this->rotationQ[3] = p[11].value.netFloat; + + this->scale[0] = p[12].value.netFloat; + this->scale[1] = p[13].value.netFloat; + this->scale[2] = p[14].value.netFloat; } - Protocol_ObjectCreatePlayer(float position[3], float rotation[3], float scale[3], int ObjectID, int teamID, std::string name, std::string meshName) + Protocol_ObjectCreatePlayer(float position[3], float rotation[4], float scale[3], int ObjectID, int teamID, std::string name, std::string meshName) { this->protocol[0].value = protocol_Gameplay_ObjectCreatePlayer; this->protocol[0].type = Oyster::Network::NetAttributeType_Short; @@ -592,17 +622,18 @@ namespace GameLogic this->protocol[8].type = Oyster::Network::NetAttributeType_Float; this->protocol[9].type = Oyster::Network::NetAttributeType_Float; this->protocol[10].type = Oyster::Network::NetAttributeType_Float; - //SCALE this->protocol[11].type = Oyster::Network::NetAttributeType_Float; + //SCALE this->protocol[12].type = Oyster::Network::NetAttributeType_Float; this->protocol[13].type = Oyster::Network::NetAttributeType_Float; + this->protocol[14].type = Oyster::Network::NetAttributeType_Float; this->object_ID = ObjectID; this->teamId = teamID; this->name = name; this->meshName = meshName; memcpy(&this->position[0], &position[0], sizeof(float)*3); - memcpy(&this->rotation[0], &rotation[0], sizeof(float)*3); + memcpy(&this->rotationQ[0], &rotation[0], sizeof(float)*4); memcpy(&this->scale[0], &scale[0], sizeof(float)*3); } Oyster::Network::CustomNetProtocol GetProtocol() override @@ -618,13 +649,14 @@ namespace GameLogic this->protocol[6].value = this->position[1]; this->protocol[7].value = this->position[2]; //ROTATION - this->protocol[8].value = this->rotation[0]; - this->protocol[9].value = this->rotation[1]; - this->protocol[10].value = this->rotation[2]; + this->protocol[8].value = this->rotationQ[0]; + this->protocol[9].value = this->rotationQ[1]; + this->protocol[10].value = this->rotationQ[2]; + this->protocol[11].value = this->rotationQ[3]; //SCALE - this->protocol[11].value = this->scale[0]; - this->protocol[12].value = this->scale[1]; - this->protocol[13].value = this->scale[2]; + this->protocol[12].value = this->scale[0]; + this->protocol[13].value = this->scale[1]; + this->protocol[14].value = this->scale[2]; return protocol; } diff --git a/Code/Game/GameServer/Implementation/GameLobby.cpp b/Code/Game/GameServer/Implementation/GameLobby.cpp index 1b8b63ec..82599677 100644 --- a/Code/Game/GameServer/Implementation/GameLobby.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby.cpp @@ -15,18 +15,15 @@ namespace DanBias { GameLobby::GameLobby() { } - GameLobby::~GameLobby() { this->clients.Clear(); } - void GameLobby::Release() { NetworkSession::CloseSession(true); this->gameSession.CloseSession(true); } - void GameLobby::Update() { this->ProcessClients(); diff --git a/Code/Game/GameServer/Implementation/GameServer.cpp b/Code/Game/GameServer/Implementation/GameServer.cpp index 4fd6e03c..087fa7ff 100644 --- a/Code/Game/GameServer/Implementation/GameServer.cpp +++ b/Code/Game/GameServer/Implementation/GameServer.cpp @@ -61,8 +61,6 @@ void GameServerAPI::ServerStart() { timer.reset(); server.Start(); - - } void GameServerAPI::ServerStop() { @@ -113,8 +111,6 @@ void GameServerAPI::NotifyWhenClientConnect(ClientConnectedNotify func) { if(!func) clientConnectedCallback = DefaultClientConnectedNotify; else clientConnectedCallback = func; - - } void GameServerAPI::NotifyWhenClientDisconnect(ClientDisconnectedNotify func) { From 12623d1b167bed917d140030fb371946f2e828d3 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Mon, 17 Feb 2014 16:16:27 +0100 Subject: [PATCH 3/6] Bunch of implementations --- Code/Game/GameClient/DanBiasGame_Impl.cpp | 6 +-- Code/Game/GameClient/GameClient.vcxproj | 8 +-- .../GameClient/GameClientState/GameState.cpp | 50 ++++++++++++++----- .../GameClient/GameClientState/GameState.h | 3 +- .../GameClientState/NetLoadState.cpp | 13 +++-- 5 files changed, 54 insertions(+), 26 deletions(-) diff --git a/Code/Game/GameClient/DanBiasGame_Impl.cpp b/Code/Game/GameClient/DanBiasGame_Impl.cpp index 392e917f..81650049 100644 --- a/Code/Game/GameClient/DanBiasGame_Impl.cpp +++ b/Code/Game/GameClient/DanBiasGame_Impl.cpp @@ -99,9 +99,6 @@ namespace DanBias data.timer.reset(); Graphics::API::Update( dt ); - - if(data.networkClient.IsConnected()) - data.networkClient.Update(); data.capFrame += dt; if(data.capFrame > 0.03) @@ -118,6 +115,9 @@ namespace DanBias data.capFrame = 0; } + if(data.networkClient.IsConnected()) + data.networkClient.Update(); + } return DanBiasClientReturn_Success; } diff --git a/Code/Game/GameClient/GameClient.vcxproj b/Code/Game/GameClient/GameClient.vcxproj index a87f61e4..3daafff3 100644 --- a/Code/Game/GameClient/GameClient.vcxproj +++ b/Code/Game/GameClient/GameClient.vcxproj @@ -112,7 +112,7 @@ Windows true %(AdditionalDependencies) - NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;%(DelayLoadDLLs) + NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;GameClient_$(PlatformShortName)D.dll;%(DelayLoadDLLs) @@ -129,7 +129,7 @@ Windows true %(AdditionalDependencies) - NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;%(DelayLoadDLLs) + NetworkAPI_$(PlatformShortName)D.dll;OysterGraphics_$(PlatformShortName)D.dll;GameClient_$(PlatformShortName)D.dll;%(DelayLoadDLLs) @@ -150,7 +150,7 @@ true true %(AdditionalDependencies) - NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;%(DelayLoadDLLs) + NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;GameClient_$(PlatformShortName).dll;%(DelayLoadDLLs) @@ -171,7 +171,7 @@ true true %(AdditionalDependencies) - NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;%(DelayLoadDLLs) + NetworkAPI_$(PlatformShortName).dll;OysterGraphics_$(PlatformShortName).dll;GameClient_$(PlatformShortName).dll;%(DelayLoadDLLs) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 29cfec03..38ded541 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -8,6 +8,7 @@ #include "C_obj/C_Player.h" #include "C_obj/C_DynamicObj.h" #include "C_obj/C_StaticObj.h" +#include "Utilities.h" using namespace ::DanBias::Client; using namespace ::Oyster; @@ -15,6 +16,7 @@ using namespace ::Oyster::Network; using namespace ::Oyster::Math3D; using namespace ::GameLogic; using namespace ::Utility::DynamicMemory; +using namespace ::Utility::String; struct GameState::MyData { @@ -40,6 +42,11 @@ struct GameState::MyData } privData; +inline Quaternion ArrayToQuaternion( const float source[4] ) +{ + return Quaternion( Float3(source[0], source[1], source[2]), source[3] ); +} + GameState::GameState() { this->privData = nullptr; @@ -75,21 +82,33 @@ bool GameState::Init( SharedStateContent &shared ) return true; } -void GameState::InitiatePlayer( int id, std::wstring modelName, Float4x4 world ) +void GameState::InitiatePlayer( int id, const std::string &modelName, const float position[3], const float rotation[4], const float scale[3], bool isMyPlayer ) { - this->privData->myId = id; - ModelInitData modelData; - modelData.visible = true; - modelData.position = Float3(world[12], world[13], world[14]); - modelData.rotation = Quaternion(Float3(0,0,0), 1); - modelData.scale = Float3(1,1,1); - modelData.modelPath = modelName; - modelData.id = this->privData->myId; - this->privData->player.Init( modelData ); + modelData.visible = true; + modelData.position = position; + modelData.rotation = ArrayToQuaternion( rotation ); + modelData.scale = scale; + StringToWstring( modelName, modelData.modelPath ); + modelData.id = id; - this->privData->camera.SetPosition( this->privData->player.getPos() ); - this->privData->camera.UpdateOrientation(); + if( isMyPlayer ) + { + if( this->privData->player.Init(modelData) ) + { + this->privData->myId = id; + this->privData->camera.SetPosition( this->privData->player.getPos() ); + this->privData->camera.UpdateOrientation(); + } + } + else + { + C_DynamicObj *p = new C_DynamicObj(); + if( p->Init(modelData) ) + { + (*this->privData->dynamicObjects)[id] = p; + } + } } GameClientState::ClientState GameState::Update( float deltaTime ) @@ -359,7 +378,12 @@ void GameState::DataRecieved( NetEventInitiatePlayer( decoded.object_ID, decoded.meshName, decoded.position, decoded.rotation, decoded.scale, decoded.owner ); + } + break; case protocol_Gameplay_ObjectJoinTeam: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectLeaveTeam: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectWeaponCooldown: break; /** @todo TODO: implement */ diff --git a/Code/Game/GameClient/GameClientState/GameState.h b/Code/Game/GameClient/GameClientState/GameState.h index 29ea2f1e..e3ced125 100644 --- a/Code/Game/GameClient/GameClientState/GameState.h +++ b/Code/Game/GameClient/GameClientState/GameState.h @@ -20,9 +20,8 @@ namespace DanBias { namespace Client ~GameState(void); bool Init( SharedStateContent &shared ); GameClientState::ClientState Update( float deltaTime ) override; - void InitiatePlayer( int id, std::wstring modelName, Oyster::Math::Float4x4 world ); + void InitiatePlayer( int id, const std::string &modelName, const float position[3], const float rotation[4], const float scale[3] ); void ReadKeyInput(); - bool Render()override; bool Release()override; void ChangeState( ClientState next ); diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index 8274472d..f50db40c 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -27,7 +27,7 @@ struct NetLoadState::MyData bool loading; }; -inline Quaternion ArrayToQuaternion( float source[4] ) +inline Quaternion ArrayToQuaternion( const float source[4] ) { return Quaternion( Float3(source[0], source[1], source[2]), source[3] ); } @@ -99,6 +99,7 @@ void NetLoadState::DataRecieved( NetEventLoadGame( Protocol_LobbyCreateGame(e.args.data.protocol).modelName ); this->ChangeState( ClientState_Game ); + this->privData->loading = false; } } @@ -109,18 +110,20 @@ void NetLoadState::LoadGame( const ::std::string &fileName ) LevelLoader loader; auto objects = loader.LoadLevel( fileName ); auto object = objects.begin(); - ObjectHeader *oh; + ObjectTypeHeader *oth; int objectID = 100; // first 100 is reserved for players. This is how the server does it. for( ; object != objects.end(); ++object ) { ++objectID; - oh = (ObjectHeader*)&*object; - switch( oh->typeID ) + oth = (ObjectTypeHeader*)(*object._Ptr); + switch( oth->typeID ) { case ObjectType::ObjectType_Static: { + ObjectHeader *oh = (ObjectHeader*)oth; + ModelInitData desc; desc.id = objectID; StringToWstring( oh->ModelFile, desc.modelPath ); @@ -142,6 +145,8 @@ void NetLoadState::LoadGame( const ::std::string &fileName ) break; case ObjectType::ObjectType_Dynamic: { + ObjectHeader *oh = (ObjectHeader*)oth; + ModelInitData desc; desc.id = objectID; StringToWstring( oh->ModelFile, desc.modelPath ); From 830b448690b04e288ae42c10c47f496e05629add Mon Sep 17 00:00:00 2001 From: dean11 Date: Mon, 17 Feb 2014 16:17:07 +0100 Subject: [PATCH 4/6] Temp --- Code/Game/GameProtocols/ObjectProtocols.h | 93 +++---- Code/Game/GameServer/GameLobby.h | 3 +- .../GameServer/Implementation/GameLobby.cpp | 229 +++++++++--------- .../GameLobby_ProtocolParser.cpp | 31 ++- .../Implementation/GameSession_General.cpp | 1 + 5 files changed, 199 insertions(+), 158 deletions(-) diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index e3449022..ff6aa6e5 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -546,14 +546,14 @@ namespace GameLogic //#define protocol_Gameplay_ObjectCreatePlayer 359 struct Protocol_ObjectCreatePlayer :public Oyster::Network::CustomProtocolObject { - //ObjectType type; //ie player, box or whatever - int object_ID; - int teamId; - std::string name; - std::string meshName; - float position[3]; - float rotationQ[4]; - float scale[3]; + /*1*/ int object_ID; + /*2*/ int teamId; + /*3*/ bool owner; + /*4*/ std::string name; + /*5*/ std::string meshName; + /*6 - 8*/ float position[3]; + /*9 - 11*/ float rotationQ[4]; + /*12 - 14*/ float scale[3]; Protocol_ObjectCreatePlayer() { @@ -564,44 +564,47 @@ namespace GameLogic this->protocol[1].type = Oyster::Network::NetAttributeType_Int; //TEAM_ID this->protocol[2].type = Oyster::Network::NetAttributeType_Int; + //OWNER + this->protocol[3].type = Oyster::Network::NetAttributeType_Bool; //PLAYER-NAME - this->protocol[3].type = Oyster::Network::NetAttributeType_CharArray; - //MESH-NAME this->protocol[4].type = Oyster::Network::NetAttributeType_CharArray; + //MESH-NAME + this->protocol[5].type = Oyster::Network::NetAttributeType_CharArray; //POSITION - this->protocol[5].type = Oyster::Network::NetAttributeType_Float; this->protocol[6].type = Oyster::Network::NetAttributeType_Float; this->protocol[7].type = Oyster::Network::NetAttributeType_Float; - //ROTATION this->protocol[8].type = Oyster::Network::NetAttributeType_Float; + //ROTATION this->protocol[9].type = Oyster::Network::NetAttributeType_Float; this->protocol[10].type = Oyster::Network::NetAttributeType_Float; - //SCALE this->protocol[11].type = Oyster::Network::NetAttributeType_Float; + //SCALE this->protocol[12].type = Oyster::Network::NetAttributeType_Float; this->protocol[13].type = Oyster::Network::NetAttributeType_Float; + this->protocol[14].type = Oyster::Network::NetAttributeType_Float; } Protocol_ObjectCreatePlayer(Oyster::Network::CustomNetProtocol& p) { this->object_ID = p[1].value.netInt; this->teamId = this->protocol[2].value.netInt; - this->name.assign(p[3].value.netCharPtr); - this->meshName.assign(p[4].value.netCharPtr); + this->owner = this->protocol[3].value.netBool; + this->name.assign(p[4].value.netCharPtr); + this->meshName.assign(p[5].value.netCharPtr); - this->position[0] = p[5].value.netFloat; - this->position[1] = p[6].value.netFloat; - this->position[2] = p[7].value.netFloat; + this->position[0] = p[6].value.netFloat; + this->position[1] = p[7].value.netFloat; + this->position[2] = p[8].value.netFloat; - this->rotationQ[0] = p[8].value.netFloat; - this->rotationQ[1] = p[9].value.netFloat; - this->rotationQ[2] = p[10].value.netFloat; - this->rotationQ[3] = p[11].value.netFloat; + this->rotationQ[0] = p[9].value.netFloat; + this->rotationQ[1] = p[10].value.netFloat; + this->rotationQ[2] = p[11].value.netFloat; + this->rotationQ[3] = p[12].value.netFloat; - this->scale[0] = p[12].value.netFloat; - this->scale[1] = p[13].value.netFloat; - this->scale[2] = p[14].value.netFloat; + this->scale[0] = p[13].value.netFloat; + this->scale[1] = p[14].value.netFloat; + this->scale[2] = p[15].value.netFloat; } - Protocol_ObjectCreatePlayer(float position[3], float rotation[4], float scale[3], int ObjectID, int teamID, std::string name, std::string meshName) + Protocol_ObjectCreatePlayer(float position[3], float rotation[4], float scale[3], int ObjectID, bool owner, int teamID, std::string name, std::string meshName) { this->protocol[0].value = protocol_Gameplay_ObjectCreatePlayer; this->protocol[0].type = Oyster::Network::NetAttributeType_Short; @@ -610,26 +613,29 @@ namespace GameLogic this->protocol[1].type = Oyster::Network::NetAttributeType_Int; //TEAM_ID this->protocol[2].type = Oyster::Network::NetAttributeType_Int; + //OWNER + this->protocol[3].type = Oyster::Network::NetAttributeType_Bool; //PLAYER-NAME - this->protocol[3].type = Oyster::Network::NetAttributeType_CharArray; - //MESH-NAME this->protocol[4].type = Oyster::Network::NetAttributeType_CharArray; + //MESH-NAME + this->protocol[5].type = Oyster::Network::NetAttributeType_CharArray; //POSITION - this->protocol[5].type = Oyster::Network::NetAttributeType_Float; this->protocol[6].type = Oyster::Network::NetAttributeType_Float; this->protocol[7].type = Oyster::Network::NetAttributeType_Float; - //ROTATION this->protocol[8].type = Oyster::Network::NetAttributeType_Float; + //ROTATION this->protocol[9].type = Oyster::Network::NetAttributeType_Float; this->protocol[10].type = Oyster::Network::NetAttributeType_Float; this->protocol[11].type = Oyster::Network::NetAttributeType_Float; - //SCALE this->protocol[12].type = Oyster::Network::NetAttributeType_Float; + //SCALE this->protocol[13].type = Oyster::Network::NetAttributeType_Float; this->protocol[14].type = Oyster::Network::NetAttributeType_Float; + this->protocol[15].type = Oyster::Network::NetAttributeType_Float; this->object_ID = ObjectID; this->teamId = teamID; + this->owner = owner; this->name = name; this->meshName = meshName; memcpy(&this->position[0], &position[0], sizeof(float)*3); @@ -641,22 +647,23 @@ namespace GameLogic this->protocol[1].value = this->object_ID; this->protocol[2].value = this->teamId; - this->protocol.Set(3, this->name); - this->protocol.Set(4, this->meshName); + this->protocol[3].value = this->owner; + this->protocol.Set(4, this->name); + this->protocol.Set(5, this->meshName); //POSITION - this->protocol[5].value = this->position[0]; - this->protocol[6].value = this->position[1]; - this->protocol[7].value = this->position[2]; + this->protocol[6].value = this->position[0]; + this->protocol[7].value = this->position[1]; + this->protocol[8].value = this->position[2]; //ROTATION - this->protocol[8].value = this->rotationQ[0]; - this->protocol[9].value = this->rotationQ[1]; - this->protocol[10].value = this->rotationQ[2]; - this->protocol[11].value = this->rotationQ[3]; + this->protocol[9].value = this->rotationQ[0]; + this->protocol[10].value = this->rotationQ[1]; + this->protocol[11].value = this->rotationQ[2]; + this->protocol[12].value = this->rotationQ[3]; //SCALE - this->protocol[12].value = this->scale[0]; - this->protocol[13].value = this->scale[1]; - this->protocol[14].value = this->scale[2]; + this->protocol[13].value = this->scale[0]; + this->protocol[14].value = this->scale[1]; + this->protocol[15].value = this->scale[2]; return protocol; } diff --git a/Code/Game/GameServer/GameLobby.h b/Code/Game/GameServer/GameLobby.h index 86cd498a..d0cbbcc3 100644 --- a/Code/Game/GameServer/GameLobby.h +++ b/Code/Game/GameServer/GameLobby.h @@ -41,11 +41,12 @@ namespace DanBias //void LobbyCreateGame(GameLogic::Protocol_LobbyCreateGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Create: void LobbyStartGame(GameLogic::Protocol_LobbyStartGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Start: //void LobbyJoin(GameLogic::Protocol_LobbyJoin& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Join: - void LobbyLogin(GameLogic::Protocol_LobbyJoinGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Login: + void LobbyLogin(GameLogic::Protocol_LobbyJoinGame& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Login: void LobbyRefresh(GameLogic::Protocol_LobbyRefresh& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_Refresh: void LobbyGameData(GameLogic::Protocol_LobbyGameData& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_GameData: void LobbyMainData(GameLogic::Protocol_LobbyClientData& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_MainData: void LobbyReady(GameLogic::Protocol_LobbyClientReadyState& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_ClientReadyState: + void LobbyQuerryGameData(GameLogic::Protocol_QuerryGameType& p, Oyster::Network::NetworkClient* c); //id = protocol_Lobby_QuerryGameType: private: void ClientEventCallback(Oyster::Network::NetEvent e) override; diff --git a/Code/Game/GameServer/Implementation/GameLobby.cpp b/Code/Game/GameServer/Implementation/GameLobby.cpp index 82599677..6f4f0a47 100644 --- a/Code/Game/GameServer/Implementation/GameLobby.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby.cpp @@ -11,127 +11,132 @@ using namespace Oyster::Network; using namespace Oyster; using namespace GameLogic; -namespace DanBias +using namespace DanBias; + +GameLobby::GameLobby() +{ } +GameLobby::~GameLobby() +{ + this->clients.Clear(); +} +void GameLobby::Release() +{ + NetworkSession::CloseSession(true); + this->gameSession.CloseSession(true); +} +void GameLobby::Update() { - GameLobby::GameLobby() - { } - GameLobby::~GameLobby() - { - this->clients.Clear(); - } - void GameLobby::Release() - { - NetworkSession::CloseSession(true); - this->gameSession.CloseSession(true); - } - void GameLobby::Update() + for (unsigned int i = 0; i < this->clients.Size(); i++) { - this->ProcessClients(); - } - void GameLobby::SetGameDesc(const LobbyLevelData& desc) - { - this->description.gameMode = desc.gameMode; - this->description.gameTime = desc.gameTime; - this->description.mapNumber = desc.mapNumber; - this->description.maxClients = desc.maxClients; - } - void GameLobby::GetGameDesc(LobbyLevelData& desc) - { - desc.gameMode = this->description.gameMode; - desc.gameTime = this->description.gameTime; - desc.mapNumber = this->description.mapNumber; - desc.maxClients = this->description.maxClients; - } - bool GameLobby::StartGameSession( ) - { - //Check if all clients is ready - if(this->GetClientCount() && this->GetClientCount() == this->readyList.Size()) + if(this->clients[i]) { - GameSession::GameDescription desc; - desc.maxClients = this->description.maxClients; - desc.gameMode = this->description.gameMode; - desc.gameTime = this->description.gameTime; - desc.mapNumber = this->description.mapNumber; - desc.owner = this; - desc.clients = this->clients; + this->clients[i]->Update(); + } + } +} +void GameLobby::SetGameDesc(const LobbyLevelData& desc) +{ + this->description.gameMode = desc.gameMode; + this->description.gameTime = desc.gameTime; + this->description.mapNumber = desc.mapNumber; + this->description.maxClients = desc.maxClients; +} +void GameLobby::GetGameDesc(LobbyLevelData& desc) +{ + desc.gameMode = this->description.gameMode; + desc.gameTime = this->description.gameTime; + desc.mapNumber = this->description.mapNumber; + desc.maxClients = this->description.maxClients; +} +bool GameLobby::StartGameSession( ) +{ +//Check if all clients is ready + if(this->GetClientCount() && this->GetClientCount() == this->readyList.Size()) + { + GameSession::GameDescription desc; + desc.maxClients = this->description.maxClients; + desc.gameMode = this->description.gameMode; + desc.gameTime = this->description.gameTime; + desc.mapNumber = this->description.mapNumber; + desc.owner = this; + desc.clients = this->clients; - if(desc.gameTime == 0.0f) - desc.gameTime = (int)(60.0f * 10.0f); //note: should be fetched from somewhere. + if(desc.gameTime == 0.0f) + desc.gameTime = (int)(60.0f * 10.0f); //note: should be fetched from somewhere. - if(desc.maxClients == 0) - desc.maxClients = 10; //note: should be fetched somewhere else.. + if(desc.maxClients == 0) + desc.maxClients = 10; //note: should be fetched somewhere else.. - this->clients.Clear(); //Remove clients from lobby list + this->clients.Clear(); //Remove clients from lobby list - if(this->gameSession.Create(desc)) - { - this->gameSession.Run(); + if(this->gameSession.Create(desc)) + { + this->gameSession.Run(); - return true; + return true; + } + } + else + { + //? + } + return false; +} + +void GameLobby::ClientEventCallback(NetEvent e) +{ + switch (e.args.type) + { + case NetworkClient::ClientEventArgs::EventType_Disconnect: + + break; + case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToRecieve: + + break; + case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend: + printf("\t(%i : %s) - EventType_ProtocolFailedToSend\n", e.sender->GetID(), e.sender->GetIpAddress().c_str()); + e.sender->Disconnect(); + this->readyList.Remove(e.sender); + this->clients.Remove(e.sender); + break; + case NetworkClient::ClientEventArgs::EventType_ProtocolRecieved: + printf("\t(%i : %s) - EventType_ProtocolRecieved\n", e.sender->GetID(), e.sender->GetIpAddress().c_str()); + this->ParseProtocol(e.args.data.protocol, e.sender); + break; + } +} +void GameLobby::ClientConnectedEvent(Utility::DynamicMemory::SmartPointer client) +{ + printf("New client(%i) connected - %s \n", client->GetID(), client->GetIpAddress().c_str()); + + if(this->gameSession) + { + Attach(client); + } + else + { + Attach(client); + Protocol_LobbyClientData p1; + Protocol_LobbyGameData p2; + + for (unsigned int i = 0; i < this->clients.Size(); i++) + { + if(this->clients[i]) + { + Protocol_LobbyClientData::PlayerData t; + t.id = this->clients[i]->GetID(); + t.ip = this->clients[i]->GetIpAddress(); + t.team = 0; + t.name = "Dennis är kung tycker Erik!"; + p1.list.Push(t); } } - else - { - //? - } - return false; + p2.majorVersion = 1; + p2.minorVersion = 0; + p2.mapName = "Dennis är kung tycker Erik!"; + + client->Send(p1.GetProtocol()); + client->Send(p2.GetProtocol()); } +} - void GameLobby::ClientEventCallback(NetEvent e) - { - switch (e.args.type) - { - case NetworkClient::ClientEventArgs::EventType_Disconnect: - - break; - case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToRecieve: - - break; - case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend: - printf("\t(%i : %s) - EventType_ProtocolFailedToSend\n", e.sender->GetID(), e.sender->GetIpAddress().c_str()); - e.sender->Disconnect(); - this->readyList.Remove(e.sender); - this->clients.Remove(e.sender); - break; - case NetworkClient::ClientEventArgs::EventType_ProtocolRecieved: - printf("\t(%i : %s) - EventType_ProtocolRecieved\n", e.sender->GetID(), e.sender->GetIpAddress().c_str()); - this->ParseProtocol(e.args.data.protocol, e.sender); - break; - } - } - void GameLobby::ClientConnectedEvent(Utility::DynamicMemory::SmartPointer client) - { - printf("New client(%i) connected - %s \n", client->GetID(), client->GetIpAddress().c_str()); - - if(this->gameSession) - { - this->gameSession.Attach(client); - } - else - { - Attach(client); - Protocol_LobbyClientData p1; - Protocol_LobbyGameData p2; - - for (unsigned int i = 0; i < this->clients.Size(); i++) - { - if(this->clients[i]) - { - Protocol_LobbyClientData::PlayerData t; - t.id = this->clients[i]->GetID(); - t.ip = this->clients[i]->GetIpAddress(); - t.team = 0; - t.name = "Dennis är kung tycker Erik!"; - p1.list.Push(t); - } - } - p2.majorVersion = 1; - p2.minorVersion = 0; - p2.mapName = "Dennis är kung tycker Erik!"; - - client->Send(p1.GetProtocol()); - client->Send(p2.GetProtocol()); - } - } - -}//End namespace DanBias \ No newline at end of file diff --git a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp index 7493cb5a..d49f83fc 100644 --- a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp @@ -18,11 +18,11 @@ void GameLobby::ParseProtocol(Oyster::Network::CustomNetProtocol& p, NetworkClie break; //case protocol_Lobby_Create: this->LobbyCreateGame (Protocol_LobbyCreateGame (p), c); //break; - case protocol_Lobby_StartGame: this->LobbyStartGame (Protocol_LobbyStartGame (p), c); + case protocol_Lobby_StartGame: this->LobbyStartGame (Protocol_LobbyStartGame (p), c); break; //case protocol_Lobby_Join: this->LobbyJoin (Protocol_LobbyJoin (p), c); //break; - case protocol_Lobby_Login: this->LobbyLogin (Protocol_LobbyJoinGame (p), c); + case protocol_Lobby_Login: this->LobbyLogin (Protocol_LobbyJoinGame (p), c); break; case protocol_Lobby_Refresh: this->LobbyRefresh (Protocol_LobbyRefresh (p), c); break; @@ -32,6 +32,8 @@ void GameLobby::ParseProtocol(Oyster::Network::CustomNetProtocol& p, NetworkClie break; case protocol_Lobby_ClientReadyState: this->LobbyReady (Protocol_LobbyClientReadyState (p), c); break; + case protocol_Lobby_QuerryGameType: this->LobbyReady (Protocol_LobbyClientReadyState (p), c); + break; } } @@ -112,4 +114,29 @@ void GameLobby::LobbyReady(GameLogic::Protocol_LobbyClientReadyState& p, Oyster: this->readyList.Remove(c); } } +void GameLobby::LobbyQuerryGameData(GameLogic::Protocol_QuerryGameType& p, Oyster::Network::NetworkClient* c) +{ + NetClient temp; + bool found = false; + //find client in waiting list + for (unsigned int i = 0; !found && i < this->clients.Size(); i++) + { + if(this->clients[i]->GetID() == c->GetID()) + { + temp = this->clients[i]; + found = true; + } + } + + //Something is wrong + if(!found) + { + c->Disconnect(); + } + else + { + //Send game data + this->gameSession.Attach(temp); + } +} diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index 647cee4a..cf82cc61 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -209,6 +209,7 @@ namespace DanBias { IPlayerData* p = this->clients[i]->GetPlayer(); Protocol_ObjectCreate oc(p->GetPosition(), p->GetRotation(), p->GetScale(), p->GetID(), "char_white.dan"); + //Protocol_ObjectCreatePlayer oc(p->GetPosition(), p->GetRotation(), p->GetScale(), p->GetID(), "char_white.dan"); this->clients[i]->GetClient()->Send(oc); } } From 112f45463aad359580033a9152ce935dab8e34c9 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Mon, 17 Feb 2014 16:18:21 +0100 Subject: [PATCH 5/6] Oops .. Forgot to save this one for the previous commit --- Code/Game/GameClient/GameClientState/GameState.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.h b/Code/Game/GameClient/GameClientState/GameState.h index e3ced125..035ad566 100644 --- a/Code/Game/GameClient/GameClientState/GameState.h +++ b/Code/Game/GameClient/GameClientState/GameState.h @@ -20,7 +20,7 @@ namespace DanBias { namespace Client ~GameState(void); bool Init( SharedStateContent &shared ); GameClientState::ClientState Update( float deltaTime ) override; - void InitiatePlayer( int id, const std::string &modelName, const float position[3], const float rotation[4], const float scale[3] ); + void InitiatePlayer( int id, const std::string &modelName, const float position[3], const float rotation[4], const float scale[3], bool isMyPlayer ); void ReadKeyInput(); bool Render()override; bool Release()override; From 6f368b45657c305085172a6e779e73f323a0f3d0 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Tue, 18 Feb 2014 08:53:52 +0100 Subject: [PATCH 6/6] compilation error dealt with --- Code/Game/GameClient/GameClientState/GameState.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 38ded541..2ae8ae21 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -381,7 +381,7 @@ void GameState::DataRecieved( NetEventInitiatePlayer( decoded.object_ID, decoded.meshName, decoded.position, decoded.rotation, decoded.scale, decoded.owner ); + this->InitiatePlayer( decoded.object_ID, decoded.meshName, decoded.position, decoded.rotationQ, decoded.scale, decoded.owner ); } break; case protocol_Gameplay_ObjectJoinTeam: break; /** @todo TODO: implement */