From 3bdb65f92af949b89820517a215ac92e1cf70828 Mon Sep 17 00:00:00 2001 From: dean11 Date: Thu, 20 Feb 2014 17:10:37 +0100 Subject: [PATCH 01/25] Misc - Added methods for extracting resource reference count and resource size --- .../Utilities/Resource/ResourceManager.cpp | 32 +++++++++++++++++++ .../Misc/Utilities/Resource/ResourceManager.h | 8 +++++ Code/Misc/Utilities/Utilities.h | 1 + 3 files changed, 41 insertions(+) diff --git a/Code/Misc/Utilities/Resource/ResourceManager.cpp b/Code/Misc/Utilities/Resource/ResourceManager.cpp index 04c03a6f..e23ff398 100644 --- a/Code/Misc/Utilities/Resource/ResourceManager.cpp +++ b/Code/Misc/Utilities/Resource/ResourceManager.cpp @@ -437,6 +437,38 @@ int ResourceManager::GetResourceId(const wchar_t c[]) return -1; } +int ResourceManager::GetResourceCount(const wchar_t filename[]) +{ + ResourceData *t = FindResource(this->resources, filename); + + if(t) return t->referenceCount; + + return 0; +} +int ResourceManager::GetResourceCount(const HRESOURCE& resource) +{ + ResourceData *t = FindResource(this->resources, resource); + + if(t) return t->referenceCount; + + return 0; +} +int ResourceManager::GetResourceSize(const wchar_t filename[]) +{ + ResourceData *t = FindResource(this->resources, filename); + + if(t) return t->resourceSize; + + return 0; +} +int ResourceManager::GetResourceSize(const HRESOURCE& resource) +{ + ResourceData *t = FindResource(this->resources, resource); + + if(t) return t->resourceSize; + + return 0; +} diff --git a/Code/Misc/Utilities/Resource/ResourceManager.h b/Code/Misc/Utilities/Resource/ResourceManager.h index d5684538..b3de6af5 100644 --- a/Code/Misc/Utilities/Resource/ResourceManager.h +++ b/Code/Misc/Utilities/Resource/ResourceManager.h @@ -148,6 +148,14 @@ namespace Oyster * @return Returns the accociated ID */ int GetResourceId(const wchar_t filename[]); + + int GetResourceCount(const wchar_t filename[]); + + int GetResourceCount(const HRESOURCE& resource); + + int GetResourceSize(const wchar_t filename[]); + + int GetResourceSize(const HRESOURCE& resource); private: ResourceManager(const ResourceManager& obj); diff --git a/Code/Misc/Utilities/Utilities.h b/Code/Misc/Utilities/Utilities.h index b97d62d7..bf9bb65c 100644 --- a/Code/Misc/Utilities/Utilities.h +++ b/Code/Misc/Utilities/Utilities.h @@ -44,6 +44,7 @@ namespace Utility ReferenceCount() :count(0) { } ReferenceCount(const ReferenceCount& o) { count = o.count; } inline const ReferenceCount& operator=(const ReferenceCount& o) { count = o.count; return *this;} + operator int() { return this->count; } inline void Incref() { this->count++; } inline void Incref(int c) { this->count += c; } inline int Decref() { return --this->count;} From c460bae943556737747b27ac728c18727fecfa60 Mon Sep 17 00:00:00 2001 From: lindaandersson Date: Fri, 21 Feb 2014 11:23:38 +0100 Subject: [PATCH 02/25] Updated dmg protocol --- .../GameClient/GameClientState/GameState.cpp | 34 ++++++++++++++----- Code/Game/GameProtocols/ObjectProtocols.h | 31 +++++++++++------ 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 078bc74b..508d9d4f 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -553,17 +553,33 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState case protocol_Gameplay_ObjectWeaponEnergy: break; /** @todo TODO: implement */ case protocol_Gameplay_ObjectRespawn: { - // set player pos Protocol_ObjectRespawn decoded(data); - // move player. Remember to change camera - this->privData->camera.SetPosition( decoded.position ); - this->privData->player.setPos( decoded.position ); - this->privData->player.updateWorld(); - // RB DEBUG - this->privData->player.setRBPos ( decoded.position ); - this->privData->player.updateRBWorld(); - // !RB DEBUG + if( this->privData->myId == decoded.objectID ) + { + // move player. Remember to change camera + this->privData->camera.SetPosition( decoded.position ); + this->privData->player.setPos( decoded.position ); + this->privData->player.updateWorld(); + // RB DEBUG + this->privData->player.setRBPos ( decoded.position ); + this->privData->player.updateRBWorld(); + // !RB DEBUG + } + else + { + C_DynamicObj *object = (*this->privData->dynamicObjects)[decoded.objectID]; + + if( object ) + { + object->setPos( decoded.position ); + object->updateWorld(); + // RB DEBUG + object->setRBPos ( decoded.position ); + object->updateRBWorld(); + // !RB DEBUG + } + } this->currGameUI = this->gameUI; } return GameClientState::event_processed; diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index cae7c7f5..d92afc60 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -812,39 +812,48 @@ namespace GameLogic //#define protocol_Gameplay_ObjectRespawn 364 struct Protocol_ObjectRespawn :public Oyster::Network::CustomProtocolObject { + int objectID; float position[3]; Protocol_ObjectRespawn() { this->protocol[0].type = Oyster::Network::NetAttributeType_Short; this->protocol[0].value.netShort = protocol_Gameplay_ObjectRespawn; - - this->protocol[1].type = Oyster::Network::NetAttributeType_Float; + // ID + this->protocol[1].type = Oyster::Network::NetAttributeType_Int; + // POSITION this->protocol[2].type = Oyster::Network::NetAttributeType_Float; this->protocol[3].type = Oyster::Network::NetAttributeType_Float; + this->protocol[4].type = Oyster::Network::NetAttributeType_Float; + this->objectID = 0; memset(&this->position[0], 0, sizeof(float) * 3); } - Protocol_ObjectRespawn(float position[3]) + Protocol_ObjectRespawn(int id, float position[3]) { this->protocol[0].type = Oyster::Network::NetAttributeType_Short; this->protocol[0].value.netShort = protocol_Gameplay_ObjectRespawn; - this->protocol[1].type = Oyster::Network::NetAttributeType_Float; + // ID + this->protocol[1].type = Oyster::Network::NetAttributeType_Int; + // POSITION this->protocol[2].type = Oyster::Network::NetAttributeType_Float; this->protocol[3].type = Oyster::Network::NetAttributeType_Float; - + this->protocol[4].type = Oyster::Network::NetAttributeType_Float; + this->objectID = id; memcpy(&this->position[0], &position[0], sizeof(float) * 3); } Protocol_ObjectRespawn(Oyster::Network::CustomNetProtocol& p) { - this->position[0] = p[1].value.netFloat; - this->position[1] = p[2].value.netFloat; - this->position[2] = p[3].value.netFloat; + this->objectID = p[1].value.netInt; + this->position[0] = p[2].value.netFloat; + this->position[1] = p[3].value.netFloat; + this->position[2] = p[4].value.netFloat; } Oyster::Network::CustomNetProtocol GetProtocol() override { - this->protocol[1].value = this->position[0]; - this->protocol[2].value = this->position[1]; - this->protocol[3].value = this->position[2]; + this->protocol[1].value = this->objectID; + this->protocol[2].value = this->position[0]; + this->protocol[3].value = this->position[1]; + this->protocol[4].value = this->position[2]; return protocol; } From bd0daf363d11e051bab7b2ba5a7501f4fb009274 Mon Sep 17 00:00:00 2001 From: lanariel Date: Fri, 21 Feb 2014 11:49:24 +0100 Subject: [PATCH 03/25] start with Instanced --- Code/Game/GameClient/GameClientState/GameState.cpp | 2 +- .../Definitions/GraphicalDefinition.h | 7 +++++++ Code/OysterGraphics/DllInterfaces/GFXAPI.cpp | 13 +++++++++++++ Code/OysterGraphics/DllInterfaces/GFXAPI.h | 4 ++++ Code/OysterGraphics/Render/Resources.cpp | 2 ++ Code/OysterGraphics/Render/Resources.h | 10 ++++++++++ 6 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index bf436d65..624eca17 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -90,7 +90,7 @@ bool GameState::Init( SharedStateContent &shared ) this->privData->camera.SetPerspectiveProjection( Utility::Value::Radian(90.0f), aspectRatio, 0.1f, 1000.0f ); Graphics::API::SetProjection( this->privData->camera.GetProjectionMatrix() ); gfxOp.AmbientValue = 0.5f; - gfxOp.GlobalGlowTint = Math::Float3(2,1,1); + gfxOp.GlobalGlowTint = Math::Float3(1,1,1); gfxOp.GlobalTint = Math::Float3(1,1,1); Graphics::API::SetOptions(gfxOp); diff --git a/Code/OysterGraphics/Definitions/GraphicalDefinition.h b/Code/OysterGraphics/Definitions/GraphicalDefinition.h index f6a6431c..9d7d4301 100644 --- a/Code/OysterGraphics/Definitions/GraphicalDefinition.h +++ b/Code/OysterGraphics/Definitions/GraphicalDefinition.h @@ -90,6 +90,13 @@ namespace Oyster Math::Float3 GlowTint; Math::Float PAD2; }; + + struct RenderInstanceData + { + Math::Matrix WV; + Math::Matrix WVP; + TintData td; + }; } } } \ No newline at end of file diff --git a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp index 8f01bea4..61bd30e6 100644 --- a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp +++ b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp @@ -19,6 +19,7 @@ namespace Oyster Math::Float4x4 Projection; std::vector Lights; float deltaTime; + int MostModel; #ifdef _DEBUG Model::Model* cube; Model::Model* sphere; @@ -133,6 +134,16 @@ namespace Oyster return API::Sucsess; } + void API::BeginLoadingModels() + { + } + + void API::EndLoadingModels() + { + //TODO finalize instance buffers and create rendering map; + + } + //returns null for invalid filenames Model::Model* API::CreateModel(std::wstring filename) { @@ -144,6 +155,8 @@ namespace Oyster m->GlowTint = Math::Float3(1); m->info = (Model::ModelInfo*)Core::loader.LoadResource((Core::modelPath + filename).c_str(),Oyster::Graphics::Loading::LoadDAN, Oyster::Graphics::Loading::UnloadDAN); + Core::loader + Model::ModelInfo* mi = (Model::ModelInfo*)m->info; if(!mi || mi->Vertices->GetBufferPointer() == NULL) { diff --git a/Code/OysterGraphics/DllInterfaces/GFXAPI.h b/Code/OysterGraphics/DllInterfaces/GFXAPI.h index 795f649a..7f338cce 100644 --- a/Code/OysterGraphics/DllInterfaces/GFXAPI.h +++ b/Code/OysterGraphics/DllInterfaces/GFXAPI.h @@ -42,6 +42,10 @@ namespace Oyster static State Init(HWND Window, bool MSAA_Quality, bool Fullscreen, Option options); + static void BeginLoadingModels(); + + static void EndLoadingModels(); + static State ReloadShaders(); //should be called after rendered normal models, before GUI or Text rendering diff --git a/Code/OysterGraphics/Render/Resources.cpp b/Code/OysterGraphics/Render/Resources.cpp index 2e693472..4c203cf9 100644 --- a/Code/OysterGraphics/Render/Resources.cpp +++ b/Code/OysterGraphics/Render/Resources.cpp @@ -63,6 +63,8 @@ namespace Oyster ID3D11ShaderResourceView* Resources::Gui::Text::Font = NULL; ID3D11DepthStencilView* Resources::Gui::depth = NULL; + + std::map Resources::RenderData = std::map(); #pragma endregion diff --git a/Code/OysterGraphics/Render/Resources.h b/Code/OysterGraphics/Render/Resources.h index 665ab8dc..6ad756eb 100644 --- a/Code/OysterGraphics/Render/Resources.h +++ b/Code/OysterGraphics/Render/Resources.h @@ -1,6 +1,8 @@ #pragma once #include "../Core/Core.h" +#include "../Model/ModelInfo.h" +#include "../Definitions/GraphicalDefinition.h" namespace Oyster { @@ -11,6 +13,14 @@ namespace Oyster class Resources { public: + struct ModelDataWrapper + { + Definitions::RenderInstanceData* rid; + int Models; + }; + + + static std::map RenderData; static const int GBufferSize = 3; static const int LBufferSize = 3; From 5aeac78f60bb4ea6acafcf01a40a297571150ece Mon Sep 17 00:00:00 2001 From: lanariel Date: Fri, 21 Feb 2014 12:19:53 +0100 Subject: [PATCH 04/25] instanced structure in place --- Code/OysterGraphics/DllInterfaces/GFXAPI.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp index 61bd30e6..4e61c7f3 100644 --- a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp +++ b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp @@ -155,8 +155,6 @@ namespace Oyster m->GlowTint = Math::Float3(1); m->info = (Model::ModelInfo*)Core::loader.LoadResource((Core::modelPath + filename).c_str(),Oyster::Graphics::Loading::LoadDAN, Oyster::Graphics::Loading::UnloadDAN); - Core::loader - Model::ModelInfo* mi = (Model::ModelInfo*)m->info; if(!mi || mi->Vertices->GetBufferPointer() == NULL) { @@ -166,6 +164,15 @@ namespace Oyster return NULL; } + if(Core::loader.GetResourceCount(m->info) == 1) + { + Render::Resources::RenderData[m->info] = new Render::Resources::ModelDataWrapper(); + } + else + { + Render::Resources::RenderData[m->info]->Models++; + } + return m; } From 38717f011cbbc6fd5df3269a4378baf6f4e721fc Mon Sep 17 00:00:00 2001 From: lindaandersson Date: Fri, 21 Feb 2014 12:38:25 +0100 Subject: [PATCH 05/25] Render players with run animation --- Code/Game/GameClient/DanBiasGame_Impl.cpp | 3 +- .../GameClient/GameClientState/GameState.cpp | 159 +++++++++--------- .../GameServer/Implementation/GameClient.cpp | 4 +- .../Implementation/GameSession_Gameplay.cpp | 39 ++--- 4 files changed, 95 insertions(+), 110 deletions(-) diff --git a/Code/Game/GameClient/DanBiasGame_Impl.cpp b/Code/Game/GameClient/DanBiasGame_Impl.cpp index 2a46b8d6..b461f908 100644 --- a/Code/Game/GameClient/DanBiasGame_Impl.cpp +++ b/Code/Game/GameClient/DanBiasGame_Impl.cpp @@ -103,7 +103,6 @@ namespace DanBias float dt = (float)data.timer.getElapsedSeconds(); data.timer.reset(); - Graphics::API::Update( dt ); data.capFrame += dt; if(data.capFrame > 0.03f) @@ -115,6 +114,8 @@ namespace DanBias case Result_error: return DanBiasClientReturn_Error; default: break; } + + Graphics::API::Update( data.capFrame ); if(Render() != S_OK) return DanBiasClientReturn_Error; data.capFrame -= 0.03f; diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 41b176e1..470f6bfb 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -33,7 +33,8 @@ struct GameState::MyData ::std::map> *dynamicObjects; ::std::map> *lights; - C_Player player; + //C_Player player; + ::std::map> players; Camera_FPSV2 camera; int myId; @@ -123,37 +124,30 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa RBData.scale = scale; RBData.type = RB_Type_Cube; // !RB DEBUG - if( isMyPlayer ) + C_Player *p = new C_Player(); + if( p->Init(modelData) ) { - if( this->privData->player.Init(modelData) ) - { - // RB DEBUG - this->privData->player.InitRB( RBData ); - // !RB DEBUG + // RB DEBUG + p->InitRB( RBData ); + // !RB DEBUG + // start with runing animation + p->playAnimation( L"run_forwards", true ); + (this->privData->players)[id] = p; + + if( isMyPlayer ) + { this->privData->myId = id; - this->privData->camera.SetPosition( this->privData->player.getPos() ); + this->privData->camera.SetPosition( p->getPos() ); Float3 offset = Float3( 0.0f ); // DEBUG position of camera so we can see the player model - //offset.y = this->privData->player.getScale().y * 5.0f; - //offset.z = this->privData->player.getScale().z * -5.0f; + //offset.y = p->getScale().y * 5.0f; + //offset.z = p->getScale().z * -5.0f; // !DEBUG this->privData->camera.SetHeadOffset( offset ); this->privData->camera.UpdateOrientation(); } } - else - { - C_DynamicObj *p = new C_DynamicObj(); - if( p->Init(modelData) ) - { - // RB DEBUG - this->privData->player.InitRB( RBData ); - // !RB DEBUG - - (*this->privData->dynamicObjects)[id] = p; - } - } } GameClientState::ClientState GameState::Update( float deltaTime ) @@ -187,7 +181,17 @@ bool GameState::Render() Oyster::Graphics::API::NewFrame(); // for debugging to be replaced with render weapon - this->privData->player.Render(); + auto playerObject = this->privData->players.begin(); + for( ; playerObject != this->privData->players.end(); ++playerObject ) + { + if(playerObject->second) + { + if( this->privData->myId != playerObject->second->GetId() ) + { + playerObject->second->Render(); + } + } + } auto staticObject = this->privData->staticObjects->begin(); for( ; staticObject != this->privData->staticObjects->end(); ++staticObject ) @@ -211,11 +215,18 @@ bool GameState::Render() { Oyster::Graphics::API::StartRenderWireFrame(); - Oyster::Math3D::Float4x4 translation = Oyster::Math3D::TranslationMatrix(Float3( 0,132, 20)); - Oyster::Math3D::Float4x4 scale = Oyster::Math3D::ScalingMatrix(Float3( 0.5f, 0.5f, 0.5f)); - Oyster::Math3D::Float4x4 world = translation * scale; - Oyster::Graphics::API::RenderDebugCube( world ); - Oyster::Graphics::API::RenderDebugCube(this->privData->player.getRBWorld()); + playerObject = this->privData->players.begin(); + for( ; playerObject != this->privData->players.end(); ++playerObject ) + { + if( playerObject->second->getBRtype() == RB_Type_Cube) + { + Oyster::Graphics::API::RenderDebugCube( playerObject->second->getRBWorld()); + } + if( playerObject->second->getBRtype() == RB_Type_Sphere) + { + Oyster::Graphics::API::RenderDebugSphere( playerObject->second->getRBWorld()); + } + } staticObject = this->privData->staticObjects->begin(); for( ; staticObject != this->privData->staticObjects->end(); ++staticObject ) @@ -276,6 +287,12 @@ bool GameState::Release() Graphics::API::Option o = Graphics::API::GetOption(); if( privData ) { + auto playerObject = this->privData->players.begin(); + for( ; playerObject != this->privData->players.end(); ++playerObject ) + { + playerObject->second = nullptr; + } + auto staticObject = this->privData->staticObjects->begin(); for( ; staticObject != this->privData->staticObjects->end(); ++staticObject ) { @@ -381,6 +398,7 @@ void GameState::ReadKeyInput() this->key_showStats = false; } } + const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState::NetEvent &message ) { if( message.args.type == NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend ) @@ -459,42 +477,29 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState 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->privData->myId == decoded.object_ID ) + C_Object *object; + object = (this->privData->players)[decoded.object_ID]; + if( !object) { - if( !Within(position.Dot(position), 2500.0f, 90000.0f) ) - { // HACK: bug trap - const char *breakPoint = "Something is wrong."; - position = Float3( 0.0f, 160.0f, 0.0f ); - } - - this->privData->camera.SetPosition( position ); - this->privData->camera.SetRotation( rotation ); - this->privData->player.setPos( position ); - this->privData->player.setRot( rotation ); - this->privData->player.updateWorld(); - // RB DEBUG - this->privData->player.setRBPos ( position ); - this->privData->player.setRBRot ( rotation ); - this->privData->player.updateRBWorld(); - // !RB DEBUG + // if it is not a player + object = (*this->privData->dynamicObjects)[decoded.object_ID]; } - else - { - C_DynamicObj *object = (*this->privData->dynamicObjects)[decoded.object_ID]; - if( object ) + if( object ) + { + if( this->privData->myId == decoded.object_ID ) { - object->setPos( position ); - object->setRot( rotation ); - object->updateWorld(); - // RB DEBUG - object->setRBPos ( position ); - object->setRBRot ( rotation ); - object->updateRBWorld(); - // !RB DEBUG + this->privData->camera.SetPosition( position ); + this->privData->camera.SetRotation( rotation ); } + object->setPos( position ); + object->setRot( rotation ); + object->updateWorld(); + // RB DEBUG + object->setRBPos ( position ); + object->setRBRot ( rotation ); + object->updateRBWorld(); + // !RB DEBUG } } return GameClientState::event_processed; @@ -534,7 +539,7 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState RBData.rotation = ArrayToQuaternion( decoded.position ); RBData.scale = Float3( decoded.scale ); - this->privData->player.InitRB( RBData ); + object->InitRB( RBData ); // !RB DEBUG (*this->privData->dynamicObjects)[decoded.object_ID] = object; @@ -555,30 +560,26 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState { Protocol_ObjectRespawn decoded(data); - if( this->privData->myId == decoded.objectID ) + C_Object *object; + object = (this->privData->players)[decoded.objectID]; + if( !object) { - // move player. Remember to change camera - this->privData->camera.SetPosition( decoded.position ); - this->privData->player.setPos( decoded.position ); - this->privData->player.updateWorld(); - // RB DEBUG - this->privData->player.setRBPos ( decoded.position ); - this->privData->player.updateRBWorld(); - // !RB DEBUG + // if it is not a player + object = (*this->privData->dynamicObjects)[decoded.objectID]; } - else - { - C_DynamicObj *object = (*this->privData->dynamicObjects)[decoded.objectID]; - if( object ) + if( object ) + { + if( this->privData->myId == decoded.objectID ) { - object->setPos( decoded.position ); - object->updateWorld(); - // RB DEBUG - object->setRBPos ( decoded.position ); - object->updateRBWorld(); - // !RB DEBUG + this->privData->camera.SetPosition( decoded.position ); } + object->setPos( decoded.position ); + object->updateWorld(); + // RB DEBUG + object->setRBPos ( decoded.position ); + object->updateRBWorld(); + // !RB DEBUG } this->currGameUI = this->gameUI; } diff --git a/Code/Game/GameServer/Implementation/GameClient.cpp b/Code/Game/GameServer/Implementation/GameClient.cpp index e8e78ab0..90b412ef 100644 --- a/Code/Game/GameServer/Implementation/GameClient.cpp +++ b/Code/Game/GameServer/Implementation/GameClient.cpp @@ -19,7 +19,7 @@ GameClient::GameClient(Utility::DynamicMemory::SmartPointerclient = nwClient; this->player = 0; isReady = false; - this->character = L"crate_colonists.dan"; + this->character = L"char_orca.dan"; this->alias = L"Unknown"; this->secondsSinceLastResponse = 0.0f; } @@ -29,7 +29,7 @@ GameClient::~GameClient() this->player->Inactivate(); this->isReady = false; - this->character = L"crate_colonists.dan"; + this->character = L"char_orca.dan"; this->alias = L"Unknown"; this->secondsSinceLastResponse = 0.0f; this->client = 0; diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index 1b3f6cb5..bc839554 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -62,31 +62,24 @@ using namespace DanBias; { case NetworkClient::ClientEventArgs::EventType_Disconnect: { - printf("\t(%i : %s) - EventType_Disconnect\n", cl->GetClient()->GetID(), e.sender->GetIpAddress().c_str()); - Protocol_ObjectDisconnectPlayer prot(this->gClients[temp]->GetPlayer()->GetID()); - for (unsigned int i = 0; i < this->gClients.Size(); i++) + //Send disconnect message to all the other players so the player can be removed from the client. + Protocol_ObjectDisconnectPlayer dp(cl->GetClient()->GetID()); + for(int i = 0; i < this->gClients.Size(); i++) { - if(i != temp && this->gClients[i]) this->gClients[i]->GetClient()->Send(prot); + if(this->gClients[i] && this->gClients[i] != cl) + { + this->gClients[i]->GetClient()->Send(dp); + } } - + printf("\t(%i : %s) - EventType_Disconnect\n", cl->GetClient()->GetID(), e.sender->GetIpAddress().c_str()); this->gClients[temp]->Invalidate(); } break; case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToRecieve: break; case NetworkClient::ClientEventArgs::EventType_ProtocolFailedToSend: - { if(this->gClients[temp]->IncrementFailedProtocol() >= 5/*client->threshold*/) - { - printf("\t(%i : %s) - EventType_Disconnect\n", cl->GetClient()->GetID(), e.sender->GetIpAddress().c_str()); - Protocol_ObjectDisconnectPlayer prot(this->gClients[temp]->GetPlayer()->GetID()); - for (unsigned int i = 0; i < this->gClients.Size(); i++) - { - if(i != temp && this->gClients[i]) this->gClients[i]->GetClient()->Send(prot); - } this->gClients[temp]->Invalidate(); - } - } break; case NetworkClient::ClientEventArgs::EventType_ProtocolRecieved: this->ParseProtocol(e.args.data.protocol, cl); @@ -150,9 +143,6 @@ using namespace DanBias; Oyster::Math::Float3 temp = movedObject->GetPosition(); - if(temp.x < -300) - id = 0; - GameSession::gameSession->Send(p.GetProtocol()); //} } @@ -231,7 +221,7 @@ using namespace DanBias; void GameSession::Gameplay_PlayerLeftTurn ( Protocol_PlayerLeftTurn& p, DanBias::GameClient* c ) { c->GetPlayer()->TurnLeft( p.deltaRadian ); - c->GetPlayer()->SetLookDir(p.lookdir); + c->GetPlayer()->SetLookDir( p.lookdir ) ; } void GameSession::Gameplay_PlayerChangeWeapon ( Protocol_PlayerChangeWeapon& p, DanBias::GameClient* c ) { @@ -275,17 +265,10 @@ using namespace DanBias; switch (p.status) { case GameLogic::Protocol_General_Status::States_disconected: - { printf("Client with ID [%i] dissconnected\n", c->GetClient()->GetID()); - - Protocol_ObjectDisconnectPlayer prot(c->GetPlayer()->GetID()); - for (unsigned int i = 0; i < this->gClients.Size(); i++) - { - if( this->gClients[i] && c->GetClient()->GetID() != this->gClients[i]->GetClient()->GetID() ) this->gClients[i]->GetClient()->Send(prot); - } - c->Invalidate(); + //TODO: Tell other clients + //Protocol_ this->Detach(c->GetClient()->GetID()); - } break; case GameLogic::Protocol_General_Status::States_idle: From 87cf2d8ac562a19b2f43cf2ac495480a3227ad3a Mon Sep 17 00:00:00 2001 From: Erik Persson Date: Fri, 21 Feb 2014 12:59:04 +0100 Subject: [PATCH 06/25] GL - stuff --- Code/Game/GameClient/GameClientState/LanMenuState.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Code/Game/GameClient/GameClientState/LanMenuState.cpp b/Code/Game/GameClient/GameClientState/LanMenuState.cpp index 8c096617..1baed344 100644 --- a/Code/Game/GameClient/GameClientState/LanMenuState.cpp +++ b/Code/Game/GameClient/GameClientState/LanMenuState.cpp @@ -62,6 +62,8 @@ bool LanMenuState::Init( SharedStateContent &shared ) this->privData->connectIP->ReserveLines( 1 ); this->privData->connectIP->AppendText( L"127.0.0.1" ); //this->privData->connectIP->AppendText( L"194.47.150.206" ); // HACK: connecting to Dennis's server + //this->privData->connectIP->AppendText( L"194.47.150.189" ); // HACK: connecting to Robins server + this->privData->connectIP->SetFontHeight( 0.08f ); this->privData->connectIP->SetLineSpacing( 0.005f ); this->privData->connectIP->SetTopAligned(); From ed3152057c27d9e862d104bbdcb4a11203316536 Mon Sep 17 00:00:00 2001 From: Erik Persson Date: Fri, 21 Feb 2014 15:02:42 +0100 Subject: [PATCH 07/25] GL - fixing with explosivecrate and massdriver --- Code/Game/GameLogic/AttatchmentMassDriver.cpp | 9 +-- Code/Game/GameLogic/CollisionManager.cpp | 59 ++++++++++--------- Code/Game/GameLogic/ExplosiveCrate.cpp | 2 + Code/Game/GameLogic/ExplosiveCrate.h | 1 + Code/Game/GameLogic/Level.cpp | 4 +- .../Implementation/GameSession_General.cpp | 4 +- .../GameServerDebugEnvironment/Source.cpp | 2 +- 7 files changed, 42 insertions(+), 39 deletions(-) diff --git a/Code/Game/GameLogic/AttatchmentMassDriver.cpp b/Code/Game/GameLogic/AttatchmentMassDriver.cpp index a092c81e..b988451f 100644 --- a/Code/Game/GameLogic/AttatchmentMassDriver.cpp +++ b/Code/Game/GameLogic/AttatchmentMassDriver.cpp @@ -56,19 +56,14 @@ void AttatchmentMassDriver::Update(float dt) //update position of heldObject if there is an object being held if(hasObject) { - //Oyster::Physics::ICustomBody::State state; - //state = heldObject->GetState(); Oyster::Math::Float3 ownerPos = owner->GetPosition(); Oyster::Physics::ICustomBody::State ownerState = owner->GetRigidBody()->GetState(); Oyster::Math::Float3 up = -ownerState.GetOrientation().v[2]; up *= -0.3f; - Oyster::Math::Float3 pos = ownerPos + (owner->GetLookDir().GetNormalized()*5); - - //state.centerPos = pos; + Oyster::Math::Float3 pos = ownerPos + (owner->GetLookDir().GetNormalized()*2); heldObject->SetPosition(pos); heldObject->SetLinearVelocity(Oyster::Math::Float3::null); - //heldObject->SetState(state); } } @@ -149,7 +144,7 @@ void AttatchmentMassDriver::ForcePull(const WEAPON_FIRE &usage, float dt) void AttatchmentMassDriver::PickUpObject(const WEAPON_FIRE &usage, float dt) { - Oyster::Math::Float3 pos = owner->GetPosition() + owner->GetLookDir().GetNormalized()*5; + Oyster::Math::Float3 pos = owner->GetPosition() + owner->GetLookDir().GetNormalized()*2; Oyster::Collision3D::Sphere *hitSphere = new Oyster::Collision3D::Sphere(pos,10); Oyster::Physics::API::Instance().ApplyEffect(hitSphere,this,AttemptPickUp); diff --git a/Code/Game/GameLogic/CollisionManager.cpp b/Code/Game/GameLogic/CollisionManager.cpp index 3e042765..1ab9afbd 100644 --- a/Code/Game/GameLogic/CollisionManager.cpp +++ b/Code/Game/GameLogic/CollisionManager.cpp @@ -108,13 +108,31 @@ using namespace GameLogic; obj.SetPosition(target); } - void ExplosiveCrate::ExplosiveCrateCollision(Oyster::Physics::ICustomBody *rigidBodyCrate, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss) + void ExplosiveCrate::ExplosiveCrateCollision(Oyster::Physics::ICustomBody *objA, Oyster::Physics::ICustomBody *objB, Oyster::Math::Float kineticEnergyLoss) { - int forceThreashHold = 200000; //how much force for the box to explode of the impact + - Object *realObj = (Object*)obj->GetCustomTag(); //needs to be changed? + Object *realObjA = ((Object*)(objA->GetCustomTag())); + Object *realObjB = (Object*)objB->GetCustomTag(); //needs to be changed? + ExplosiveCrate* crate; - switch (realObj->GetObjectType()) + if(!realObjA) + return; + if(!realObjB) + return; + + //check who is player and who is the object + if(realObjA->GetObjectType() == ObjectSpecialType::ObjectSpecialType_RedExplosiveBox) + { + crate = (ExplosiveCrate*)realObjA; + } + else + { + crate = (ExplosiveCrate*)realObjB; + realObjB = realObjA; + } + + switch (realObjB->GetObjectType()) { case ObjectSpecialType::ObjectSpecialType_Generic: break; @@ -122,29 +140,15 @@ using namespace GameLogic; break; case ObjectSpecialType::ObjectSpecialType_Player: - ExplosiveCrate* crate = ((ExplosiveCrate*)rigidBodyCrate->GetCustomTag()); - - - Oyster::Math::Float3 pos = rigidBodyCrate->GetState().centerPos; + if(crate->hasExploaded) return; + Oyster::Math::Float3 pos = crate->GetRigidBody()->GetState().centerPos; Oyster::Collision3D::Sphere *hitSphere = new Oyster::Collision3D::Sphere(pos,crate->ExplosionRadius); Oyster::Physics::API::Instance().ApplyEffect(hitSphere,crate,Explode); - + crate->hasExploaded = true; delete hitSphere; break; } - /*if(kineticEnergyLoss > forceThreashHold) - { - ExplosiveCrate* crate = ((ExplosiveCrate*)rigidBodyCrate->GetCustomTag()); - - - Oyster::Math::Float3 pos = rigidBodyCrate->GetState().centerPos; - Oyster::Collision3D::Sphere *hitSphere = new Oyster::Collision3D::Sphere(pos,crate->ExplosionRadius); - - Oyster::Physics::API::Instance().ApplyEffect(hitSphere,crate,Explode); - - delete hitSphere; - }*/ } void ExplosiveCrate::Explode(Oyster::Physics::ICustomBody *obj, void* args) @@ -155,16 +159,17 @@ using namespace GameLogic; Oyster::Math::Float3 explosionCenterPos = ExplosionSource->GetPosition(); Oyster::Math::Float3 hitObjectPos = obj->GetState().centerPos; Oyster::Math::Float3 force = (((hitObjectPos- explosionCenterPos).GetNormalized()) * ExplosionSource->pushForceMagnitude); - + + if(realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_Player) { Player *hitPlayer = (Player*)realObj; - //hitPlayer->DamageLife(ExplosionSource->getExtraDamageOnCollision()); + hitPlayer->GetRigidBody()->ApplyImpulse(force); //do shredding damage } - realObj->GetRigidBody()->ApplyImpulse(force); + } @@ -181,11 +186,11 @@ using namespace GameLogic; Oyster::Math::Float angularFactor = deltaPos.GetNormalized().Dot( (objPrevVel - playerPrevVel).GetNormalized()); Oyster::Math::Float impactPower = deltaSpeed * angularFactor; - Oyster::Math::Float damageFactor = 0.1f; + Oyster::Math::Float damageFactor = 0.01f; int damageDone = 0; - int forceThreashHold = 100; //FIX: balance this + int forceThreashHold = 30; //FIX: balance this if(impactPower > forceThreashHold) //should only take damage if the force is high enough { @@ -198,7 +203,7 @@ using namespace GameLogic; damageDone = (impactPower * obj.GetRigidBody()->GetState().mass)* damageFactor; } - //player.DamageLife(damageDone); + player.DamageLife(damageDone); } } diff --git a/Code/Game/GameLogic/ExplosiveCrate.cpp b/Code/Game/GameLogic/ExplosiveCrate.cpp index d236d400..cf011ce4 100644 --- a/Code/Game/GameLogic/ExplosiveCrate.cpp +++ b/Code/Game/GameLogic/ExplosiveCrate.cpp @@ -7,6 +7,7 @@ ExplosiveCrate::ExplosiveCrate(void) { this->pushForceMagnitude = 0; this->ExplosionRadius = 0; + this->hasExploaded = false; } ExplosiveCrate::ExplosiveCrate(Oyster::Physics::ICustomBody *rigidBody,ObjectSpecialType type, int objectID,Oyster::Math::Float extraDamageOnCollision, Oyster::Math::Float pushForceMagnitude, Oyster::Math::Float ExplosionRadius) @@ -15,6 +16,7 @@ ExplosiveCrate::ExplosiveCrate(Oyster::Physics::ICustomBody *rigidBody,ObjectSpe this->extraDamageOnCollision = extraDamageOnCollision; this->pushForceMagnitude = pushForceMagnitude; this->ExplosionRadius = ExplosionRadius; + this->hasExploaded = false; } ExplosiveCrate::~ExplosiveCrate(void) diff --git a/Code/Game/GameLogic/ExplosiveCrate.h b/Code/Game/GameLogic/ExplosiveCrate.h index 75afdc4a..b6054266 100644 --- a/Code/Game/GameLogic/ExplosiveCrate.h +++ b/Code/Game/GameLogic/ExplosiveCrate.h @@ -18,6 +18,7 @@ namespace GameLogic private: Oyster::Math::Float pushForceMagnitude; Oyster::Math::Float ExplosionRadius; + bool hasExploaded; }; diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index c9938dbd..ca5ccf32 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -70,8 +70,8 @@ Object* Level::CreateGameObj(ObjectHeader* obj, ICustomBody* rigidBody) case ObjectSpecialType_RedExplosiveBox: { Oyster::Math::Float dmg = 50; - Oyster::Math::Float force = 50; - Oyster::Math::Float radie = 50; + Oyster::Math::Float force = 500; + Oyster::Math::Float radie = 3; gameObj = new ExplosiveCrate(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++, dmg, force, radie); } break; diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index fb4c9246..11e80a9f 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -36,8 +36,8 @@ GameSession::GameSession() this->isCreated = false; this->isRunning = false; this->gameSession = this; - this->logicFrameTime = DELTA_TIME_20; - this->networkFrameTime = DELTA_TIME_20; + this->logicFrameTime = DELTA_TIME_60; + this->networkFrameTime = DELTA_TIME_60; this->networkTimer.reset(); this->logicTimer.reset(); diff --git a/Code/Game/LanServer/GameServerDebugEnvironment/Source.cpp b/Code/Game/LanServer/GameServerDebugEnvironment/Source.cpp index 62332541..3357f52c 100644 --- a/Code/Game/LanServer/GameServerDebugEnvironment/Source.cpp +++ b/Code/Game/LanServer/GameServerDebugEnvironment/Source.cpp @@ -32,7 +32,7 @@ int WINAPI WinMain( HINSTANCE hinst, HINSTANCE prevInst, PSTR cmdLine, int cmdSh GameServerAPI::GameSetGameMode(L"free-for-all"); GameServerAPI::GameSetGameName(L"DebugServer"); GameServerAPI::GameSetGameTime(15); - GameServerAPI::GameSetMapName(L"2ofAll.bias"); + GameServerAPI::GameSetMapName(L"erik_250.bias"); GameServerAPI::GameSetMaxClients(10); if(GameServerAPI::GameStart(true)) From 22f52150d563e4b9387b5479a0865b1694a2659d Mon Sep 17 00:00:00 2001 From: lindaandersson Date: Fri, 21 Feb 2014 15:42:09 +0100 Subject: [PATCH 08/25] Sending dmg, respawn and dead from player to client --- .../GameClient/GameClientState/GamingUI.cpp | 2 +- Code/Game/GameLogic/Game.cpp | 16 +- Code/Game/GameLogic/Game.h | 12 +- Code/Game/GameLogic/GameAPI.h | 6 + Code/Game/GameLogic/Level.cpp | 2 +- Code/Game/GameLogic/Level.h | 1 + Code/Game/GameLogic/Player.cpp | 237 ++++++++++-------- Code/Game/GameLogic/Player.h | 2 + Code/Game/GameProtocols/ObjectProtocols.h | 6 +- Code/Game/GameServer/GameSession.h | 5 +- .../Implementation/GameSession_Gameplay.cpp | 13 +- .../Implementation/GameSession_General.cpp | 3 + 12 files changed, 185 insertions(+), 120 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GamingUI.cpp b/Code/Game/GameClient/GameClientState/GamingUI.cpp index 6d8c0d37..d356028a 100644 --- a/Code/Game/GameClient/GameClientState/GamingUI.cpp +++ b/Code/Game/GameClient/GameClientState/GamingUI.cpp @@ -33,7 +33,7 @@ bool GamingUI::Init() // z value should be between 0.5 - 0.9 so that it will be behind other states // add textures and text this->plane = new Plane_UI(L"box_tex.png", Float3(0.5f, 0.0f, 0.5f), Float2(0.3f, 0.1f)); - this->text = new Text_UI(L"hej", Float3(0.5f,0.0f,0.1f), Float2(0.1f,0.1f)); + this->text = new Text_UI(L"hej", Float3(0.3f,0.0f,0.1f), Float2(0.1f,0.1f)); return true; } diff --git a/Code/Game/GameLogic/Game.cpp b/Code/Game/GameLogic/Game.cpp index c599fecf..0e1ab178 100644 --- a/Code/Game/GameLogic/Game.cpp +++ b/Code/Game/GameLogic/Game.cpp @@ -43,6 +43,9 @@ Game::Game(void) : initiated(false) , onMoveFnc(0) , onDisableFnc(0) + , onDamageTakenFnc(0) + , onRespawnFnc(0) + , onDeadFnc(0) , frameTime(1.0f/120.0f) {} @@ -156,7 +159,18 @@ void Game::SetSubscription(GameEvent::ObjectMovedFunction functionPointer) void Game::SetSubscription(GameEvent::ObjectDisabledFunction functionPointer) { this->onDisableFnc = functionPointer; - +} +void Game::SetHpSubscription(GameEvent::ObjectHpFunction functionPointer) +{ + this->onDamageTakenFnc = functionPointer; +} +void Game::SetRespawnSubscription(GameEvent::ObjectRespawnedFunction functionPointer) +{ + this->onRespawnFnc = functionPointer; +} +void Game::SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer) +{ + this->onDeadFnc = functionPointer; } bool Game::Initiate() diff --git a/Code/Game/GameLogic/Game.h b/Code/Game/GameLogic/Game.h index 81410ac8..37abe97f 100644 --- a/Code/Game/GameLogic/Game.h +++ b/Code/Game/GameLogic/Game.h @@ -80,6 +80,10 @@ namespace GameLogic void SetFrameTimeLength( float seconds ) override; void SetSubscription(GameEvent::ObjectMovedFunction functionPointer) override; void SetSubscription(GameEvent::ObjectDisabledFunction functionPointer) override; + void SetHpSubscription(GameEvent::ObjectHpFunction functionPointer) override; + void SetRespawnSubscription(GameEvent::ObjectRespawnedFunction functionPointer) override; + void SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer) override; + bool Initiate() override; float GetFrameTime() const; @@ -91,9 +95,11 @@ namespace GameLogic LevelData* level; float frameTime; bool initiated; - GameEvent::ObjectDisabledFunction onDisableFnc; - GameEvent::ObjectMovedFunction onMoveFnc; - + GameEvent::ObjectDisabledFunction onDisableFnc; + GameEvent::ObjectMovedFunction onMoveFnc; + GameEvent::ObjectHpFunction onDamageTakenFnc; + GameEvent::ObjectRespawnedFunction onRespawnFnc; + GameEvent::ObjectDeadFunction onDeadFnc; }; } diff --git a/Code/Game/GameLogic/GameAPI.h b/Code/Game/GameLogic/GameAPI.h index 290b1c30..0c79f33d 100644 --- a/Code/Game/GameLogic/GameAPI.h +++ b/Code/Game/GameLogic/GameAPI.h @@ -27,6 +27,9 @@ namespace GameLogic { typedef void(*ObjectMovedFunction)(IObjectData* object); // Callback method that recieves and object typedef void(*ObjectDisabledFunction)(IObjectData* object, float seconds); // Callback method that recieves and object + typedef void(*ObjectHpFunction)(IObjectData* object, float hp); // Callback method that sends obj HP + typedef void(*ObjectRespawnedFunction)(IObjectData* object, Oyster::Math::Float3 spawnPos ); // Callback method that sends spawnPos + typedef void(*ObjectDeadFunction)(IObjectData* object, float seconds); // Callback method that sends death timer //etc... }; @@ -178,6 +181,9 @@ namespace GameLogic * @param */ virtual void SetSubscription(GameEvent::ObjectDisabledFunction functionPointer) = 0; + virtual void SetHpSubscription(GameEvent::ObjectHpFunction functionPointer) = 0; + virtual void SetRespawnSubscription(GameEvent::ObjectRespawnedFunction functionPointer) = 0; + virtual void SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer) = 0; }; } diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index c9938dbd..30b6f965 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -422,5 +422,5 @@ void Level::PhysicsOnMoveLevel(const ICustomBody *object) // function call from physics update when object was moved Object* temp = (Object*)object->GetCustomTag(); ((Game*)&Game::Instance())->onMoveFnc(temp); - } + diff --git a/Code/Game/GameLogic/Level.h b/Code/Game/GameLogic/Level.h index 9dce227d..27f0bab6 100644 --- a/Code/Game/GameLogic/Level.h +++ b/Code/Game/GameLogic/Level.h @@ -66,6 +66,7 @@ namespace GameLogic int getNrOfDynamicObj(); Object* GetObj( int ID ) const; + static void PhysicsOnMoveLevel(const Oyster::Physics::ICustomBody *object); diff --git a/Code/Game/GameLogic/Player.cpp b/Code/Game/GameLogic/Player.cpp index 7166f539..16f7f922 100644 --- a/Code/Game/GameLogic/Player.cpp +++ b/Code/Game/GameLogic/Player.cpp @@ -29,6 +29,8 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, void (*EventOnCollision) key_strafeLeft = 0; key_jump = 0; invincibleCooldown = 0; + this->deathTimeLeft = 0; + this->deathTime = 1; this->previousPosition = Oyster::Math::Float3(0,0,0); @@ -54,7 +56,8 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, Oyster::Physics::ICustom key_strafeLeft = 0; key_jump = 0; invincibleCooldown = 0; - + this->deathTimeLeft = 0; + this->deathTime = 1; this->previousPosition = Oyster::Math::Float3(0,0,0); this->moveDir = Oyster::Math::Float3(0,0,0); this->moveSpeed = 20; @@ -74,137 +77,142 @@ Player::~Player(void) void Player::BeginFrame() { - weapon->Update(0.002f); - //Object::BeginFrame(); + if( this->playerState != PLAYER_STATE_DEAD) + { + weapon->Update(0.002f); - Oyster::Math::Float maxSpeed = 30; + Oyster::Math::Float maxSpeed = 30; - // Rotate player accordingly - this->rigidBody->SetUp(this->rigidBody->GetState().centerPos.GetNormalized()); - Oyster::Math::Quaternion firstUp = this->rigidBody->GetState().quaternion; - this->rigidBody->SetRotationAsAngularAxis(Oyster::Math3D::Float4(this->rigidBody->GetState().centerPos.GetNormalized(), this->rotationUp)); - Oyster::Math::Quaternion secondTurn = this->rigidBody->GetState().quaternion; + // Rotate player accordingly + this->rigidBody->SetUp(this->rigidBody->GetState().centerPos.GetNormalized()); + Oyster::Math::Quaternion firstUp = this->rigidBody->GetState().quaternion; + this->rigidBody->SetRotationAsAngularAxis(Oyster::Math3D::Float4(this->rigidBody->GetState().centerPos.GetNormalized(), this->rotationUp)); + Oyster::Math::Quaternion secondTurn = this->rigidBody->GetState().quaternion; - this->rigidBody->SetRotation(secondTurn*firstUp); + this->rigidBody->SetRotation(secondTurn*firstUp); - // Direction data - Oyster::Math::Float4x4 xform; - xform = this->rigidBody->GetState().GetOrientation(); + // Direction data + Oyster::Math::Float4x4 xform; + xform = this->rigidBody->GetState().GetOrientation(); - Oyster::Math::Float3 forwardDir = xform.v[2]; - Oyster::Math::Float3 upDir = xform.v[1]; - Oyster::Math::Float3 rightDir = xform.v[0]; - forwardDir.Normalize(); - upDir.Normalize(); - rightDir.Normalize(); + Oyster::Math::Float3 forwardDir = xform.v[2]; + Oyster::Math::Float3 upDir = xform.v[1]; + Oyster::Math::Float3 rightDir = xform.v[0]; + forwardDir.Normalize(); + upDir.Normalize(); + rightDir.Normalize(); - // Previous velocities data - Oyster::Math::Float3 linearVelocity = this->rigidBody->GetLinearVelocity(); - Oyster::Math::Float3 forwardVelocity = linearVelocity*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)); - Oyster::Math::Float forwardSpeed = (linearVelocity*forwardDir).GetLength(); - Oyster::Math::Float3 rightVelocity = linearVelocity*Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z)); - Oyster::Math::Float rightSpeed = (linearVelocity*rightDir).GetLength(); - Oyster::Math::Float3 upVelocity = linearVelocity*Oyster::Math::Float3(fabs(upDir.x), fabs(upDir.y), fabs(upDir.z)); + // Previous velocities data + Oyster::Math::Float3 linearVelocity = this->rigidBody->GetLinearVelocity(); + Oyster::Math::Float3 forwardVelocity = linearVelocity*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)); + Oyster::Math::Float forwardSpeed = (linearVelocity*forwardDir).GetLength(); + Oyster::Math::Float3 rightVelocity = linearVelocity*Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z)); + Oyster::Math::Float rightSpeed = (linearVelocity*rightDir).GetLength(); + Oyster::Math::Float3 upVelocity = linearVelocity*Oyster::Math::Float3(fabs(upDir.x), fabs(upDir.y), fabs(upDir.z)); - // Walking data - Oyster::Math::Float3 walkDirection = Oyster::Math::Float3(0.0, 0.0, 0.0); - Oyster::Math::Float walkSpeed = this->moveSpeed*0.2f; + // Walking data + Oyster::Math::Float3 walkDirection = Oyster::Math::Float3(0.0, 0.0, 0.0); + Oyster::Math::Float walkSpeed = this->moveSpeed*0.2f; - // Check for input - if(key_forward > 0.001) - { - key_forward -= gameInstance->GetFrameTime(); - walkDirection += forwardDir; - } - if(key_backward > 0.001) - { - key_backward -= gameInstance->GetFrameTime(); - walkDirection -= forwardDir; - } - if(key_strafeRight > 0.001) - { - key_strafeRight -= gameInstance->GetFrameTime(); - walkDirection += rightDir; - } - if(key_strafeLeft > 0.001) - { - key_strafeLeft -= gameInstance->GetFrameTime(); - walkDirection -= rightDir; - } - - // Dampen velocity if certain keys are not pressed - if(key_jump <= 0.001 && this->rigidBody->GetLambda() < 0.9f) - { - if(key_forward <= 0.001 && key_backward <= 0.001) + // Check for input + if(key_forward > 0.001) { - forwardVelocity *= Oyster::Math::Float3(0.2f*fabs(forwardDir.x), 0.2f*fabs(forwardDir.y), 0.2f*fabs(forwardDir.z)); + key_forward -= gameInstance->GetFrameTime(); + walkDirection += forwardDir; } - if(key_strafeRight <= 0.001 && key_strafeLeft <= 0.001) + if(key_backward > 0.001) { - rightVelocity *= Oyster::Math::Float3(0.2f*fabs(rightDir.x), 0.2f*fabs(rightDir.y), 0.2f*fabs(rightDir.z)); + key_backward -= gameInstance->GetFrameTime(); + walkDirection -= forwardDir; } - } - - // Walk if walkdirection is something - if(walkDirection != Oyster::Math::Float3::null) - { - walkDirection.Normalize(); - - // If on the ground, accelerate normally - if(this->rigidBody->GetLambda() < 0.9f) + if(key_strafeRight > 0.001) { - if(forwardSpeed < maxSpeed) + key_strafeRight -= gameInstance->GetFrameTime(); + walkDirection += rightDir; + } + if(key_strafeLeft > 0.001) + { + key_strafeLeft -= gameInstance->GetFrameTime(); + walkDirection -= rightDir; + } + + // Dampen velocity if certain keys are not pressed + if(key_jump <= 0.001 && this->rigidBody->GetLambda() < 0.9f) + { + if(key_forward <= 0.001 && key_backward <= 0.001) { - forwardVelocity += walkDirection*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)) * walkSpeed; + forwardVelocity *= Oyster::Math::Float3(0.2f*fabs(forwardDir.x), 0.2f*fabs(forwardDir.y), 0.2f*fabs(forwardDir.z)); } - if(rightSpeed < maxSpeed) + if(key_strafeRight <= 0.001 && key_strafeLeft <= 0.001) { - rightVelocity += walkDirection*Oyster::Math::Float3(fabs(rightDir.x), abs(rightDir.y), fabs(rightDir.z)) * walkSpeed; + rightVelocity *= Oyster::Math::Float3(0.2f*fabs(rightDir.x), 0.2f*fabs(rightDir.y), 0.2f*fabs(rightDir.z)); } } - // If in the air, accelerate slower - if(this->rigidBody->GetLambda() >= 0.9f) + + // Walk if walkdirection is something + if(walkDirection != Oyster::Math::Float3::null) { - if(forwardSpeed < maxSpeed) + walkDirection.Normalize(); + + // If on the ground, accelerate normally + if(this->rigidBody->GetLambda() < 0.9f) { - forwardVelocity += walkDirection*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)) * walkSpeed*0.2f; + if(forwardSpeed < maxSpeed) + { + forwardVelocity += walkDirection*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)) * walkSpeed; + } + if(rightSpeed < maxSpeed) + { + rightVelocity += walkDirection*Oyster::Math::Float3(fabs(rightDir.x), abs(rightDir.y), fabs(rightDir.z)) * walkSpeed; + } } - if(rightSpeed < maxSpeed) + // If in the air, accelerate slower + if(this->rigidBody->GetLambda() >= 0.9f) { - rightVelocity += walkDirection*Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z)) * walkSpeed*0.2f; + if(forwardSpeed < maxSpeed) + { + forwardVelocity += walkDirection*Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)) * walkSpeed*0.2f; + } + if(rightSpeed < maxSpeed) + { + rightVelocity += walkDirection*Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z)) * walkSpeed*0.2f; + } + } + } + + // Adjust velocities so no squaring occurs + forwardVelocity *= Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)); + rightVelocity *= Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z)); + upVelocity *= Oyster::Math::Float3(fabs(upDir.x), fabs(upDir.y), fabs(upDir.z)); + + this->rigidBody->SetLinearVelocity(forwardVelocity+rightVelocity+upVelocity); + + //Jump + if(key_jump > 0.001) + { + this->key_jump -= this->gameInstance->GetFrameTime(); + if(this->rigidBody->GetLambda() < 0.9f) + { + Oyster::Math::Float3 up = this->rigidBody->GetState().centerPos.GetNormalized(); + this->rigidBody->ApplyImpulse(up*this->rigidBody->GetState().mass*20); + this->playerState = PLAYER_STATE::PLAYER_STATE_JUMPING; } } } - - // Adjust velocities so no squaring occurs - forwardVelocity *= Oyster::Math::Float3(fabs(forwardDir.x), fabs(forwardDir.y), fabs(forwardDir.z)); - rightVelocity *= Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z)); - upVelocity *= Oyster::Math::Float3(fabs(upDir.x), fabs(upDir.y), fabs(upDir.z)); - - this->rigidBody->SetLinearVelocity(forwardVelocity+rightVelocity+upVelocity); - - //Jump - if(key_jump > 0.001) + else { - this->key_jump -= this->gameInstance->GetFrameTime(); - if(this->rigidBody->GetLambda() < 0.9f) + // player is dead + // TODO move this logic to lvl + this->deathTimeLeft -= gameInstance->GetFrameTime(); + if( this->deathTimeLeft <= 0) { - Oyster::Math::Float3 up = this->rigidBody->GetState().centerPos.GetNormalized(); - this->rigidBody->ApplyImpulse(up*this->rigidBody->GetState().mass*20); - this->playerState = PLAYER_STATE::PLAYER_STATE_JUMPING; + Respawn( Oyster::Math::Float3( -50, 180, 0)); } } - - - - - //this->weapon->Update(0.01f); } void Player::EndFrame() { - - //Object::EndFrame(); } @@ -258,10 +266,15 @@ void Player::UseWeapon(const WEAPON_FIRE &usage) void Player::Respawn(Oyster::Math::Float3 spawnPoint) { - this->life = 100; - this->playerState = PLAYER_STATE::PLAYER_STATE_IDLE; - this->lookDir = Oyster::Math::Float4(1,0,0); - this->rigidBody->SetPosition(spawnPoint); + if( this->playerState == PLAYER_STATE_DEAD) + { + this->life = 100; + this->playerState = PLAYER_STATE::PLAYER_STATE_IDLE; + //this->lookDir = Oyster::Math::Float4(1,0,0); + this->rigidBody->SetPosition(spawnPoint); + this->gameInstance->onRespawnFnc( this, spawnPoint); + this->gameInstance->onDamageTakenFnc( this, this->life); + } } void Player::SetLookDir(const Oyster::Math3D::Float3& lookDir) @@ -321,13 +334,17 @@ PLAYER_STATE Player::GetState() const void Player::DamageLife(int damage) { - this->life -= damage; - this->life = 0; - - if(this->life <= 0) + if( this->playerState != PLAYER_STATE_DEAD) { - this->life = 0; - playerState = PLAYER_STATE_DEAD; - this->gameInstance->onDisableFnc(this, 0.0f); + this->life -= damage; + this->gameInstance->onDamageTakenFnc( this, this->life); + + if(this->life <= 0) + { + this->life = 0; + playerState = PLAYER_STATE_DEAD; + this->deathTimeLeft = this->deathTime; + this->gameInstance->onDeadFnc(this, this->deathTimeLeft); + } } } diff --git a/Code/Game/GameLogic/Player.h b/Code/Game/GameLogic/Player.h index 1fc3443a..001c9141 100644 --- a/Code/Game/GameLogic/Player.h +++ b/Code/Game/GameLogic/Player.h @@ -100,6 +100,8 @@ namespace GameLogic Oyster::Math::Float rotationUp; + float deathTime; + float deathTimeLeft; bool hasTakenDamage; float invincibleCooldown; diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index 3dfdf8f4..47c2dddc 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -75,13 +75,15 @@ namespace GameLogic } Protocol_ObjectDamage(Oyster::Network::CustomNetProtocol& p) { - + this->object_ID = p[1].value.netInt; + this->healthLost = p[2].value.netFloat; } Protocol_ObjectDamage(int id, float hp) { this->protocol[0].value = protocol_Gameplay_ObjectDamage; this->protocol[0].type = Oyster::Network::NetAttributeType_Short; - + + this->protocol[1].type = Oyster::Network::NetAttributeType_Int; this->protocol[2].type = Oyster::Network::NetAttributeType_Float; object_ID = id; diff --git a/Code/Game/GameServer/GameSession.h b/Code/Game/GameServer/GameSession.h index ad9440e9..12067c2b 100644 --- a/Code/Game/GameServer/GameSession.h +++ b/Code/Game/GameServer/GameSession.h @@ -99,7 +99,10 @@ namespace DanBias //Callback method recieving from gamelogic static void ObjectMove ( GameLogic::IObjectData* movedObject ); static void ObjectDisabled ( GameLogic::IObjectData* movedObject, float seconds ); - + static void ObjectDamaged ( GameLogic::IObjectData* movedObject, float hp ); + static void ObjectRespawned ( GameLogic::IObjectData* movedObject, Oyster::Math::Float3 spawnPos ); + static void ObjectDead ( GameLogic::IObjectData* movedObject, float seconds ); + //Private member variables private: Utility::DynamicMemory::DynamicArray gClients; diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index bc839554..7567b920 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -150,7 +150,18 @@ using namespace DanBias; { GameSession::gameSession->Send(Protocol_ObjectDisable(movedObject->GetID(), seconds).GetProtocol()); } - + void GameSession::ObjectDamaged( GameLogic::IObjectData* movedObject, float hp ) + { + GameSession::gameSession->Send(Protocol_ObjectDamage(movedObject->GetID(), hp).GetProtocol()); + } + void GameSession::ObjectRespawned( GameLogic::IObjectData* movedObject, Oyster::Math::Float3 spawnPos ) + { + GameSession::gameSession->Send(Protocol_ObjectRespawn(movedObject->GetID(), spawnPos).GetProtocol()); + } + void GameSession::ObjectDead( GameLogic::IObjectData* movedObject, float seconds ) + { + GameSession::gameSession->Send(Protocol_ObjectDie(movedObject->GetID(), seconds).GetProtocol()); + } //*****************************************************// //****************** Protocol methods *****************// //******************************************************************************************************************// diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index fb4c9246..1324bcf5 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -108,6 +108,9 @@ bool GameSession::Create(GameDescription& desc, bool forceStart) /* Set some game instance data options */ this->gameInstance.SetSubscription(GameSession::ObjectMove); this->gameInstance.SetSubscription(GameSession::ObjectDisabled); + this->gameInstance.SetHpSubscription(GameSession::ObjectDamaged); + this->gameInstance.SetRespawnSubscription(GameSession::ObjectRespawned); + this->gameInstance.SetDeadSubscription(GameSession::ObjectDead); this->gameInstance.SetFPS(60); this->description.clients.Clear(); From 1d147004a27598aad9db989525ebfc7fce3e0d06 Mon Sep 17 00:00:00 2001 From: lindaandersson Date: Fri, 21 Feb 2014 15:54:43 +0100 Subject: [PATCH 09/25] small fixes and explosive crate do 90 dmg --- .../GameClientState/C_obj/C_DynamicObj.cpp | 1 + .../GameClientState/C_obj/C_StaticObj.cpp | 1 + .../Game/GameClient/GameClientState/GameState.cpp | 15 +++++++++------ Code/Game/GameLogic/CollisionManager.cpp | 4 ++-- Code/Game/GameLogic/Level.cpp | 2 +- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/C_obj/C_DynamicObj.cpp b/Code/Game/GameClient/GameClientState/C_obj/C_DynamicObj.cpp index 73dd20b5..26619c0e 100644 --- a/Code/Game/GameClient/GameClientState/C_obj/C_DynamicObj.cpp +++ b/Code/Game/GameClient/GameClientState/C_obj/C_DynamicObj.cpp @@ -3,6 +3,7 @@ using namespace DanBias::Client; C_DynamicObj::C_DynamicObj(void) + :C_Object() { } diff --git a/Code/Game/GameClient/GameClientState/C_obj/C_StaticObj.cpp b/Code/Game/GameClient/GameClientState/C_obj/C_StaticObj.cpp index 42a12acd..22734a96 100644 --- a/Code/Game/GameClient/GameClientState/C_obj/C_StaticObj.cpp +++ b/Code/Game/GameClient/GameClientState/C_obj/C_StaticObj.cpp @@ -3,6 +3,7 @@ using namespace DanBias::Client; C_StaticObj::C_StaticObj(void) + :C_Object() { } diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index cd4083b7..d08b1101 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -218,13 +218,16 @@ bool GameState::Render() playerObject = this->privData->players.begin(); for( ; playerObject != this->privData->players.end(); ++playerObject ) { - if( playerObject->second->getBRtype() == RB_Type_Cube) + if(playerObject->second) { - Oyster::Graphics::API::RenderDebugCube( playerObject->second->getRBWorld()); - } - if( playerObject->second->getBRtype() == RB_Type_Sphere) - { - Oyster::Graphics::API::RenderDebugSphere( playerObject->second->getRBWorld()); + if( playerObject->second->getBRtype() == RB_Type_Cube) + { + Oyster::Graphics::API::RenderDebugCube( playerObject->second->getRBWorld()); + } + if( playerObject->second->getBRtype() == RB_Type_Sphere) + { + Oyster::Graphics::API::RenderDebugSphere( playerObject->second->getRBWorld()); + } } } diff --git a/Code/Game/GameLogic/CollisionManager.cpp b/Code/Game/GameLogic/CollisionManager.cpp index 1ab9afbd..90a2aefe 100644 --- a/Code/Game/GameLogic/CollisionManager.cpp +++ b/Code/Game/GameLogic/CollisionManager.cpp @@ -164,8 +164,8 @@ using namespace GameLogic; if(realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_Player) { Player *hitPlayer = (Player*)realObj; - //hitPlayer->DamageLife(ExplosionSource->getExtraDamageOnCollision()); - hitPlayer->GetRigidBody()->ApplyImpulse(force); + hitPlayer->DamageLife(ExplosionSource->extraDamageOnCollision); + //hitPlayer->GetRigidBody()->ApplyImpulse(force); //do shredding damage } diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 801c6931..922d2a8f 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -69,7 +69,7 @@ Object* Level::CreateGameObj(ObjectHeader* obj, ICustomBody* rigidBody) break; case ObjectSpecialType_RedExplosiveBox: { - Oyster::Math::Float dmg = 50; + Oyster::Math::Float dmg = 90; Oyster::Math::Float force = 500; Oyster::Math::Float radie = 3; gameObj = new ExplosiveCrate(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++, dmg, force, radie); From 7bb67b6a8519bd0fd6d9edbd593569ad6510114b Mon Sep 17 00:00:00 2001 From: lindaandersson Date: Fri, 21 Feb 2014 15:56:32 +0100 Subject: [PATCH 10/25] sec respawn --- Code/Game/GameLogic/Player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Game/GameLogic/Player.cpp b/Code/Game/GameLogic/Player.cpp index 16f7f922..69569d44 100644 --- a/Code/Game/GameLogic/Player.cpp +++ b/Code/Game/GameLogic/Player.cpp @@ -30,7 +30,7 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, void (*EventOnCollision) key_jump = 0; invincibleCooldown = 0; this->deathTimeLeft = 0; - this->deathTime = 1; + this->deathTime = 5; this->previousPosition = Oyster::Math::Float3(0,0,0); @@ -57,7 +57,7 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, Oyster::Physics::ICustom key_jump = 0; invincibleCooldown = 0; this->deathTimeLeft = 0; - this->deathTime = 1; + this->deathTime = 5; this->previousPosition = Oyster::Math::Float3(0,0,0); this->moveDir = Oyster::Math::Float3(0,0,0); this->moveSpeed = 20; From 6e0338ee6bb61d16052aeb2ee766d80ca50c86a8 Mon Sep 17 00:00:00 2001 From: Dander7BD Date: Mon, 24 Feb 2014 14:35:38 +0100 Subject: [PATCH 11/25] Minor mathematical fix AngularAxis had a bug. SnapAngularAxis is determined broken. Do not use. :( --- Code/Misc/OysterMath/LinearMath.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Code/Misc/OysterMath/LinearMath.h b/Code/Misc/OysterMath/LinearMath.h index 25b65331..5b87d83d 100644 --- a/Code/Misc/OysterMath/LinearMath.h +++ b/Code/Misc/OysterMath/LinearMath.h @@ -376,9 +376,13 @@ namespace LinearAlgebra3D template inline ::LinearAlgebra::Vector3 AngularAxis( const ::LinearAlgebra::Quaternion &rotation ) { // see http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm - ScalarType angle = ScalarType(2) * (ScalarType)::std::acos( rotation.real ), - multiplier = angle / (ScalarType)::std::sqrt( ScalarType(1) - rotation.real * rotation.real ); - return multiplier * rotation.imaginary; + if( rotation.real < ScalarType(1) ) + { + ScalarType angle = ScalarType(2) * ScalarType( ::std::acos(rotation.real) ), + multiplier = angle / ScalarType( ::std::sqrt(ScalarType(1) - rotation.real * rotation.real) ); + return multiplier * rotation.imaginary; + } + else return ::LinearAlgebra::Vector3::null; } // All Matrix to AngularAxis conversions here is incorrect @@ -838,7 +842,7 @@ namespace LinearAlgebra3D template ::LinearAlgebra::Vector3 & SnapAngularAxis( const ::LinearAlgebra::Vector3 &startAngularAxis, const ::LinearAlgebra::Vector3 &localStartNormal, const ::LinearAlgebra::Vector3 &worldEndNormal, ::LinearAlgebra::Vector3 &targetMem = ::LinearAlgebra::Vector3() ) - { + { //! @todo TODO: This code is broken and do not work! ::LinearAlgebra::Vector3 worldStartNormal( WorldAxisOf(Rotation(startAngularAxis), localStartNormal) ); targetMem = worldStartNormal.Cross( worldEndNormal ); targetMem *= (ScalarType)::std::acos( ::Utility::Value::Clamp(worldStartNormal.Dot(worldEndNormal), (ScalarType)0, (ScalarType)1) ); From 37e9d4720761f5be87cd2eb14d300684554fac53 Mon Sep 17 00:00:00 2001 From: lanariel Date: Mon, 24 Feb 2014 14:44:36 +0100 Subject: [PATCH 12/25] Instanced Rendering --- .../GameClientState/NetLoadState.cpp | 2 + .../Definitions/GraphicalDefinition.h | 3 +- Code/OysterGraphics/DllInterfaces/GFXAPI.cpp | 46 +++- Code/OysterGraphics/OysterGraphics.vcxproj | 19 +- .../OysterGraphics.vcxproj.filters | 9 +- .../OysterGraphics/Render/DefaultRenderer.cpp | 67 +++++- Code/OysterGraphics/Render/Resources.cpp | 204 +++++++++++++++--- Code/OysterGraphics/Render/Resources.h | 4 +- .../Gather/{Header.hlsli => AnimHeader.hlsli} | 2 +- ...{GatherPixel.hlsl => GatherAnimPixel.hlsl} | 4 +- ...atherVertex.hlsl => GatherAnimVertex.hlsl} | 4 +- .../Shader/Passes/Gather/GatherInstPixel.hlsl | 63 ++++++ .../Passes/Gather/GatherInstVertex.hlsl | 18 ++ .../Shader/Passes/Gather/InstHeader.hlsli | 44 ++++ 14 files changed, 439 insertions(+), 50 deletions(-) rename Code/OysterGraphics/Shader/Passes/Gather/{Header.hlsli => AnimHeader.hlsli} (97%) rename Code/OysterGraphics/Shader/Passes/Gather/{GatherPixel.hlsl => GatherAnimPixel.hlsl} (95%) rename Code/OysterGraphics/Shader/Passes/Gather/{GatherVertex.hlsl => GatherAnimVertex.hlsl} (90%) create mode 100644 Code/OysterGraphics/Shader/Passes/Gather/GatherInstPixel.hlsl create mode 100644 Code/OysterGraphics/Shader/Passes/Gather/GatherInstVertex.hlsl create mode 100644 Code/OysterGraphics/Shader/Passes/Gather/InstHeader.hlsli diff --git a/Code/Game/GameClient/GameClientState/NetLoadState.cpp b/Code/Game/GameClient/GameClientState/NetLoadState.cpp index 9ef0dac9..b9256fd1 100644 --- a/Code/Game/GameClient/GameClientState/NetLoadState.cpp +++ b/Code/Game/GameClient/GameClientState/NetLoadState.cpp @@ -242,5 +242,7 @@ void NetLoadState::LoadGame( const ::std::string &fileName ) } } + Graphics::API::EndLoadingModels(); + this->privData->nextState = ClientState::ClientState_Game; } diff --git a/Code/OysterGraphics/Definitions/GraphicalDefinition.h b/Code/OysterGraphics/Definitions/GraphicalDefinition.h index 9d7d4301..77aecdc8 100644 --- a/Code/OysterGraphics/Definitions/GraphicalDefinition.h +++ b/Code/OysterGraphics/Definitions/GraphicalDefinition.h @@ -95,7 +95,8 @@ namespace Oyster { Math::Matrix WV; Math::Matrix WVP; - TintData td; + Math::Float3 Tint; + Math::Float3 GTint; }; } } diff --git a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp index 4e61c7f3..d4c48957 100644 --- a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp +++ b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp @@ -141,7 +141,26 @@ namespace Oyster void API::EndLoadingModels() { //TODO finalize instance buffers and create rendering map; + int maxModels = 0; + for(auto i = Render::Resources::RenderData.begin(); i != Render::Resources::RenderData.end(); i++ ) + { + if((*i).second->Models > maxModels) + { + maxModels = (*i).second->Models; + } + (*i).second->rid = new Definitions::RenderInstanceData[(*i).second->Models+1]; + } + + Core::Buffer::BUFFER_INIT_DESC desc; + + desc.ElementSize = sizeof(Definitions::RenderInstanceData); + desc.Type = Core::Buffer::VERTEX_BUFFER; + desc.Usage = Core::Buffer::BUFFER_CPU_WRITE_DISCARD; + desc.InitData = 0; + desc.NumElements = maxModels; + + Render::Resources::Gather::InstancedData.Init(desc); } //returns null for invalid filenames @@ -163,14 +182,17 @@ namespace Oyster delete mi; return NULL; } - - if(Core::loader.GetResourceCount(m->info) == 1) + + if(!m->info->Animated) { - Render::Resources::RenderData[m->info] = new Render::Resources::ModelDataWrapper(); - } - else - { - Render::Resources::RenderData[m->info]->Models++; + if(Core::loader.GetResourceCount(m->info) == 1) + { + Render::Resources::RenderData[m->info] = new Render::Resources::ModelDataWrapper(); + } + else + { + Render::Resources::RenderData[m->info]->Models++; + } } return m; @@ -207,6 +229,12 @@ namespace Oyster SAFE_RELEASE(Core::deviceContext); SAFE_RELEASE(Core::device); + for(auto i = Render::Resources::RenderData.begin(); i != Render::Resources::RenderData.end(); i++ ) + { + SAFE_DELETE((*i).second->rid); + SAFE_DELETE((*i).second); + } + } void API::AddLight(Definitions::Pointlight light) @@ -228,9 +256,9 @@ namespace Oyster void API::StartRenderWireFrame() { - Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::Pass.RTV.size(),&Render::Resources::Gather::Pass.RTV[0],NULL); + Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::AnimatedPass.RTV.size(),&Render::Resources::Gather::AnimatedPass.RTV[0],NULL); Core::deviceContext->RSSetState(wire); - Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::Pass.RTV.size(),&Render::Resources::Gather::Pass.RTV[0],NULL); + Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::AnimatedPass.RTV.size(),&Render::Resources::Gather::AnimatedPass.RTV[0],NULL); } void API::RenderDebugCube(Math::Matrix world) diff --git a/Code/OysterGraphics/OysterGraphics.vcxproj b/Code/OysterGraphics/OysterGraphics.vcxproj index 8faf4d0f..f4a3d130 100644 --- a/Code/OysterGraphics/OysterGraphics.vcxproj +++ b/Code/OysterGraphics/OysterGraphics.vcxproj @@ -239,13 +239,25 @@ Vertex Vertex + + Pixel + Pixel + Pixel + Pixel + + + Vertex + Vertex + Vertex + Vertex + Compute Compute Compute Compute - + Pixel Pixel Pixel @@ -281,7 +293,7 @@ Compute 5.0 - + Vertex Vertex Vertex @@ -328,8 +340,9 @@ + - + diff --git a/Code/OysterGraphics/OysterGraphics.vcxproj.filters b/Code/OysterGraphics/OysterGraphics.vcxproj.filters index d76a066f..83731090 100644 --- a/Code/OysterGraphics/OysterGraphics.vcxproj.filters +++ b/Code/OysterGraphics/OysterGraphics.vcxproj.filters @@ -100,8 +100,6 @@ - - @@ -109,6 +107,10 @@ + + + + @@ -117,8 +119,9 @@ - + + \ No newline at end of file diff --git a/Code/OysterGraphics/Render/DefaultRenderer.cpp b/Code/OysterGraphics/Render/DefaultRenderer.cpp index 7d0d987b..a735f4b3 100644 --- a/Code/OysterGraphics/Render/DefaultRenderer.cpp +++ b/Code/OysterGraphics/Render/DefaultRenderer.cpp @@ -19,7 +19,6 @@ namespace Oyster Preparations::Basic::ClearBackBuffer(Oyster::Math::Float4(0,0,0,0)); Preparations::Basic::ClearDepthStencil(Resources::Gui::depth); Preparations::Basic::ClearRTV(Resources::GBufferRTV,Resources::GBufferSize,Math::Float4(0,0,0,0)); - Core::PipelineManager::SetRenderPass(Graphics::Render::Resources::Gather::Pass); Lights[1]; void* data; @@ -39,15 +38,37 @@ namespace Oyster data = Resources::Light::PointLightsData.Map(); memcpy(data, Lights, sizeof(Definitions::Pointlight) * numLights); Resources::Light::PointLightsData.Unmap(); + + for(auto i = Render::Resources::RenderData.begin(); i != Render::Resources::RenderData.end(); i++ ) + { + (*i).second->Models=0; + } } void DefaultRenderer::RenderScene(Model::Model* models, int count, Math::Matrix View, Math::Matrix Projection, float deltaTime) { for(int i = 0; i < count; ++i) { - if(&models[i] == NULL) + if(&models[i] == NULL || !models[i].Visible) continue; - if(models[i].Visible) + + Model::ModelInfo* info = models[i].info; + if(!info->Animated) + { + Definitions::RenderInstanceData rid; + Math::Float3x3 normalTransform; + normalTransform = Math::Float3x3(models[i].WorldMatrix.v[0].xyz, models[i].WorldMatrix.v[1].xyz, models[i].WorldMatrix.v[2].xyz); + normalTransform.Transpose().Invert(); + Math::Matrix m = Math::Matrix(Math::Vector4(normalTransform.v[0],0.0f), Math::Vector4(normalTransform.v[1],0.0f), Math::Vector4(normalTransform.v[2],0.0f), Math::Vector4(0.0f)); + rid.WV = View * m; + rid.WVP = Projection * View * models[i].WorldMatrix; + + rid.Tint = models[i].Tint; + rid.GTint = models[i].GlowTint; + + Resources::RenderData[info]->rid[Resources::RenderData[info]->Models++] = rid; + } + else { Definitions::PerModel pm; Math::Float3x3 normalTransform; @@ -55,7 +76,6 @@ namespace Oyster normalTransform.Transpose().Invert(); Math::Matrix m = Math::Matrix(Math::Vector4(normalTransform.v[0],0.0f), Math::Vector4(normalTransform.v[1],0.0f), Math::Vector4(normalTransform.v[2],0.0f), Math::Vector4(0.0f)); pm.WV = View * m; - //pm.WV = models[i].WorldMatrix.GetTranspose().GetInverse(); pm.WVP = Projection * View * models[i].WorldMatrix; Model::ModelInfo* info = models[i].info; @@ -207,9 +227,48 @@ namespace Oyster Core::deviceContext->Dispatch((UINT)(Core::resolution.x/2), (UINT)((Core::resolution.y/2 + 127U) / 128U), 1); } + void RenderModel(Model::ModelInfo* info, Definitions::RenderInstanceData* rid , int count) + { + if(info->Material.size()) + { + Core::deviceContext->PSSetShaderResources(0,(UINT)info->Material.size(),&(info->Material[0])); + } + info->Vertices->Apply(); + if(info->Indexed) + { + info->Indecies->Apply(); + } + + void* data = Resources::Gather::InstancedData.Map(); + memcpy(data, rid, sizeof(Definitions::RenderInstanceData)*count); + Resources::Gather::InstancedData.Unmap(); + + if(info->Indexed) + { + Core::deviceContext->DrawIndexedInstanced(info->IndexCount,count,0,0,0); + //Core::deviceContext->DrawIndexed(info->IndexCount,0,0); + } + else + { + Core::deviceContext->DrawInstanced(info->VertexCount,count,0,0); + //Core::deviceContext->Draw(info->VertexCount,0); + } + } + void DefaultRenderer::EndFrame() { + Core::PipelineManager::SetRenderPass(Graphics::Render::Resources::Gather::InstancedPass); + Resources::Gather::InstancedData.Apply(1); + + for(auto i = Render::Resources::RenderData.begin(); i != Render::Resources::RenderData.end(); i++ ) + { + for(int m = 0; m <(*i).second->Models; ++m) + { + RenderModel((*i).first,(*i).second->rid, (*i).second->Models); + } + } + Core::PipelineManager::SetRenderPass(Resources::Light::Pass); Core::deviceContext->Dispatch((UINT)((Core::resolution.x + 15U) / 16U), (UINT)((Core::resolution.y + 15U) / 16U), 1); diff --git a/Code/OysterGraphics/Render/Resources.cpp b/Code/OysterGraphics/Render/Resources.cpp index 4c203cf9..91317114 100644 --- a/Code/OysterGraphics/Render/Resources.cpp +++ b/Code/OysterGraphics/Render/Resources.cpp @@ -33,7 +33,8 @@ namespace Oyster ID3D11UnorderedAccessView* Resources::Blur::BufferUAV = {0}; ID3D11ShaderResourceView* Resources::Blur::BufferSRV = {0}; - Shader::RenderPass Resources::Gather::Pass; + Shader::RenderPass Resources::Gather::AnimatedPass; + Shader::RenderPass Resources::Gather::InstancedPass; Shader::RenderPass Resources::Light::Pass; Shader::RenderPass Resources::Post::Pass; Shader::RenderPass Resources::Gui::Pass; @@ -43,6 +44,7 @@ namespace Oyster Buffer Resources::Gather::ModelData = Buffer(); Buffer Resources::Gather::AnimationData = Buffer(); + Buffer Resources::Gather::InstancedData = Buffer(); Buffer Resources::Light::LightConstantsData = Buffer(); Buffer Resources::Gui::Data = Buffer(); Buffer Resources::Color = Buffer(); @@ -78,8 +80,12 @@ namespace Oyster std::wstring end = L".cso"; #endif //Load Shaders - Core::PipelineManager::Init(path + L"GatherPixel" + end, ShaderType::Pixel, L"Gather"); - Core::PipelineManager::Init(path + L"GatherVertex" + end, ShaderType::Vertex, L"Gather"); + Core::PipelineManager::Init(path + L"GatherAnimPixel" + end, ShaderType::Pixel, L"AGather"); + Core::PipelineManager::Init(path + L"GatherAnimVertex" + end, ShaderType::Vertex, L"AGather"); + + + Core::PipelineManager::Init(path + L"GatherInstPixel" + end, ShaderType::Pixel, L"IGather"); + Core::PipelineManager::Init(path + L"GatherInstVertex" + end, ShaderType::Vertex, L"IGather"); #ifdef _DEBUG path = PathToHLSL+L"Light\\"; #endif @@ -153,6 +159,7 @@ namespace Oyster desc.NumElements = MAX_LETTER_COUNT; Gui::Text::Vertex.Init(desc); + return Core::Init::Success; } @@ -358,10 +365,11 @@ namespace Oyster { ////---------------- Geometry Pass Setup ---------------------------- - Gather::Pass.Shaders.Pixel = GetShader::Pixel(L"Gather"); - Gather::Pass.Shaders.Vertex = GetShader::Vertex(L"Gather"); +#pragma region Animated Pass + Gather::AnimatedPass.Shaders.Pixel = GetShader::Pixel(L"Gather"); + Gather::AnimatedPass.Shaders.Vertex = GetShader::Vertex(L"Gather"); - D3D11_INPUT_ELEMENT_DESC indesc[] = + D3D11_INPUT_ELEMENT_DESC AnimInDesc[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, @@ -370,20 +378,166 @@ namespace Oyster { "BONEWEIGHT", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 48, D3D11_INPUT_PER_VERTEX_DATA, 0 } }; - Shader::CreateInputLayout(indesc,5,GetShader::Vertex(L"Gather"),Gather::Pass.IAStage.Layout); - Gather::Pass.IAStage.Topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; - Gather::Pass.CBuffers.Vertex.push_back(Gather::AnimationData); - Gather::Pass.CBuffers.Vertex.push_back(Gather::ModelData); - Gather::Pass.CBuffers.Pixel.push_back(Color); - Gather::Pass.RenderStates.Rasterizer = RenderStates::rs; - Gather::Pass.RenderStates.SampleCount = 1; - Gather::Pass.RenderStates.SampleState = RenderStates::ss; - Gather::Pass.RenderStates.DepthStencil = RenderStates::dsState; + Shader::CreateInputLayout(AnimInDesc,5,GetShader::Vertex(L"Gather"),Gather::AnimatedPass.IAStage.Layout); + Gather::AnimatedPass.IAStage.Topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; + Gather::AnimatedPass.CBuffers.Vertex.push_back(Gather::AnimationData); + Gather::AnimatedPass.CBuffers.Vertex.push_back(Gather::ModelData); + Gather::AnimatedPass.CBuffers.Pixel.push_back(Color); + Gather::AnimatedPass.RenderStates.Rasterizer = RenderStates::rs; + Gather::AnimatedPass.RenderStates.SampleCount = 1; + Gather::AnimatedPass.RenderStates.SampleState = RenderStates::ss; + Gather::AnimatedPass.RenderStates.DepthStencil = RenderStates::dsState; for(int i = 0; i Date: Mon, 24 Feb 2014 14:59:01 +0100 Subject: [PATCH 13/25] Player action protocol added --- Code/Game/GameProtocols/ObjectProtocols.h | 40 +++++++++++++++++++ .../GameProtocols/ProtocolIdentificationID.h | 1 + 2 files changed, 41 insertions(+) diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index 47c2dddc..234a5301 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -937,5 +937,45 @@ namespace GameLogic Oyster::Network::CustomNetProtocol protocol; }; } +//#define protocol_Gameplay_ObjectAction 368 + struct Protocol_ObjectAction :public Oyster::Network::CustomProtocolObject + { + short objectID; + float animationID; + + Protocol_ObjectAction() + { + this->protocol[0].value = protocol_Gameplay_ObjectAction; + this->protocol[0].type = Oyster::Network::NetAttributeType_Short; + this->protocol[1].type = Oyster::Network::NetAttributeType_Short; + this->protocol[2].type = Oyster::Network::NetAttributeType_Float; + + objectID = 0; + animationID = -1; + } + Protocol_ObjectAction(Oyster::Network::CustomNetProtocol& p) + { + objectID = p[1].value.netShort; + animationID = p[2].value.netFloat; + } + Protocol_ObjectAction(float animID, int id) + { + this->protocol[0].value = protocol_Gameplay_ObjectAction; + this->protocol[0].type = Oyster::Network::NetAttributeType_Short; + this->protocol[1].type = Oyster::Network::NetAttributeType_Short; + this->protocol[2].type = Oyster::Network::NetAttributeType_Float; + objectID = id; + animationID = animID; + } + Oyster::Network::CustomNetProtocol GetProtocol() override + { + this->protocol[1].value = objectID; + this->protocol[2].value = animationID; + return protocol; + } + + private: + Oyster::Network::CustomNetProtocol protocol; + }; #endif // !GAMELOGIC_PLAYER_PROTOCOLS_H \ No newline at end of file diff --git a/Code/Game/GameProtocols/ProtocolIdentificationID.h b/Code/Game/GameProtocols/ProtocolIdentificationID.h index 79235e2f..7aaf2eee 100644 --- a/Code/Game/GameProtocols/ProtocolIdentificationID.h +++ b/Code/Game/GameProtocols/ProtocolIdentificationID.h @@ -70,6 +70,7 @@ #define protocol_Gameplay_ObjectRespawn 365 #define protocol_Gameplay_ObjectDie 366 #define protocol_Gameplay_ObjectDisconnectPlayer 367 +#define protocol_Gameplay_ObjectAction 368 #define protocol_GameplayMAX 399 From f35f96b8f2104f2b117c94785f50c0ec3ff90bdc Mon Sep 17 00:00:00 2001 From: lanariel Date: Tue, 25 Feb 2014 09:45:02 +0100 Subject: [PATCH 14/25] Instanced fix, render char, manual instanced flag per model, wireframe fix --- .../GameClient/GameClientState/GameState.cpp | 8 +- Code/OysterGraphics/DllInterfaces/GFXAPI.cpp | 11 ++- Code/OysterGraphics/Model/Model.h | 1 + .../OysterGraphics/Render/DefaultRenderer.cpp | 11 +-- Code/OysterGraphics/Render/Resources.cpp | 9 +-- .../Shader/Passes/Light/Defines.hlsli | 10 +++ .../Shader/Passes/Light/LightCalc.hlsli | 5 ++ .../Shader/Passes/Light/LightPass.hlsl | 78 ++++++++++++++++++- 8 files changed, 111 insertions(+), 22 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index d08b1101..b608a4f3 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -114,8 +114,8 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa modelData.position = position; modelData.rotation = ArrayToQuaternion( rotation ); modelData.scale = scale; - StringToWstring( modelName, modelData.modelPath ); modelData.id = id; + StringToWstring(modelName,modelData.modelPath); // RB DEBUG RBInitData RBData; @@ -141,8 +141,8 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa this->privData->camera.SetPosition( p->getPos() ); Float3 offset = Float3( 0.0f ); // DEBUG position of camera so we can see the player model - //offset.y = p->getScale().y * 5.0f; - //offset.z = p->getScale().z * -5.0f; + offset.y = p->getScale().y * 5.0f; + offset.z = p->getScale().z * -5.0f; // !DEBUG this->privData->camera.SetHeadOffset( offset ); this->privData->camera.UpdateOrientation(); @@ -186,7 +186,7 @@ bool GameState::Render() { if(playerObject->second) { - if( this->privData->myId != playerObject->second->GetId() ) + //if( this->privData->myId != playerObject->second->GetId() ) { playerObject->second->Render(); } diff --git a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp index d4c48957..ee3d9f8a 100644 --- a/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp +++ b/Code/OysterGraphics/DllInterfaces/GFXAPI.cpp @@ -58,9 +58,11 @@ namespace Oyster debugSRV = (ID3D11ShaderResourceView*)API::CreateTexture(L"color_white.png"); cube = CreateModel(L"generic_cube.dan"); - cube->Tint = Math::Float3(0.0f,0.0f,1.0f); + cube->Tint = Math::Float3(1.0f,0.0f,0.0f); + cube->Instanced = false; sphere = CreateModel(L"generic_sphere.dan"); sphere->Tint = Math::Float3(1.0f,0.5f,182/255.0f); + sphere->Instanced = false; D3D11_RASTERIZER_DESC desc; @@ -158,7 +160,7 @@ namespace Oyster desc.Type = Core::Buffer::VERTEX_BUFFER; desc.Usage = Core::Buffer::BUFFER_CPU_WRITE_DISCARD; desc.InitData = 0; - desc.NumElements = maxModels; + desc.NumElements = maxModels+1; Render::Resources::Gather::InstancedData.Init(desc); } @@ -172,6 +174,7 @@ namespace Oyster m->Animation.AnimationPlaying = NULL; m->Tint = Math::Float3(1); m->GlowTint = Math::Float3(1); + m->Instanced = true; m->info = (Model::ModelInfo*)Core::loader.LoadResource((Core::modelPath + filename).c_str(),Oyster::Graphics::Loading::LoadDAN, Oyster::Graphics::Loading::UnloadDAN); Model::ModelInfo* mi = (Model::ModelInfo*)m->info; @@ -256,9 +259,9 @@ namespace Oyster void API::StartRenderWireFrame() { - Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::AnimatedPass.RTV.size(),&Render::Resources::Gather::AnimatedPass.RTV[0],NULL); + //Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::AnimatedPass.RTV.size(),&Render::Resources::Gather::AnimatedPass.RTV[0],NULL); Core::deviceContext->RSSetState(wire); - Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::AnimatedPass.RTV.size(),&Render::Resources::Gather::AnimatedPass.RTV[0],NULL); + //Core::deviceContext->OMSetRenderTargets((UINT)Render::Resources::Gather::AnimatedPass.RTV.size(),&Render::Resources::Gather::AnimatedPass.RTV[0],NULL); } void API::RenderDebugCube(Math::Matrix world) diff --git a/Code/OysterGraphics/Model/Model.h b/Code/OysterGraphics/Model/Model.h index 5985dbcd..6d4e96f2 100644 --- a/Code/OysterGraphics/Model/Model.h +++ b/Code/OysterGraphics/Model/Model.h @@ -26,6 +26,7 @@ namespace Oyster Oyster::Math::Float3 Tint; Oyster::Math::Float3 GlowTint; bool Visible; + bool Instanced; AnimationData Animation; }; } diff --git a/Code/OysterGraphics/Render/DefaultRenderer.cpp b/Code/OysterGraphics/Render/DefaultRenderer.cpp index a735f4b3..4b979be8 100644 --- a/Code/OysterGraphics/Render/DefaultRenderer.cpp +++ b/Code/OysterGraphics/Render/DefaultRenderer.cpp @@ -43,6 +43,8 @@ namespace Oyster { (*i).second->Models=0; } + + Core::PipelineManager::SetRenderPass(Resources::Gather::AnimatedPass); } void DefaultRenderer::RenderScene(Model::Model* models, int count, Math::Matrix View, Math::Matrix Projection, float deltaTime) @@ -53,7 +55,7 @@ namespace Oyster continue; Model::ModelInfo* info = models[i].info; - if(!info->Animated) + if(!info->Animated && models[i].Instanced) { Definitions::RenderInstanceData rid; Math::Float3x3 normalTransform; @@ -229,6 +231,8 @@ namespace Oyster void RenderModel(Model::ModelInfo* info, Definitions::RenderInstanceData* rid , int count) { + if(count < 1) + return; if(info->Material.size()) { Core::deviceContext->PSSetShaderResources(0,(UINT)info->Material.size(),&(info->Material[0])); @@ -263,10 +267,7 @@ namespace Oyster for(auto i = Render::Resources::RenderData.begin(); i != Render::Resources::RenderData.end(); i++ ) { - for(int m = 0; m <(*i).second->Models; ++m) - { - RenderModel((*i).first,(*i).second->rid, (*i).second->Models); - } + RenderModel((*i).first,(*i).second->rid, (*i).second->Models); } Core::PipelineManager::SetRenderPass(Resources::Light::Pass); diff --git a/Code/OysterGraphics/Render/Resources.cpp b/Code/OysterGraphics/Render/Resources.cpp index 91317114..cced13e9 100644 --- a/Code/OysterGraphics/Render/Resources.cpp +++ b/Code/OysterGraphics/Render/Resources.cpp @@ -366,8 +366,8 @@ namespace Oyster ////---------------- Geometry Pass Setup ---------------------------- #pragma region Animated Pass - Gather::AnimatedPass.Shaders.Pixel = GetShader::Pixel(L"Gather"); - Gather::AnimatedPass.Shaders.Vertex = GetShader::Vertex(L"Gather"); + Gather::AnimatedPass.Shaders.Pixel = GetShader::Pixel(L"AGather"); + Gather::AnimatedPass.Shaders.Vertex = GetShader::Vertex(L"AGather"); D3D11_INPUT_ELEMENT_DESC AnimInDesc[] = { @@ -378,7 +378,7 @@ namespace Oyster { "BONEWEIGHT", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 48, D3D11_INPUT_PER_VERTEX_DATA, 0 } }; - Shader::CreateInputLayout(AnimInDesc,5,GetShader::Vertex(L"Gather"),Gather::AnimatedPass.IAStage.Layout); + Shader::CreateInputLayout(AnimInDesc,5,GetShader::Vertex(L"AGather"),Gather::AnimatedPass.IAStage.Layout); Gather::AnimatedPass.IAStage.Topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; Gather::AnimatedPass.CBuffers.Vertex.push_back(Gather::AnimationData); Gather::AnimatedPass.CBuffers.Vertex.push_back(Gather::ModelData); @@ -525,9 +525,6 @@ namespace Oyster Shader::CreateInputLayout(InstInDesc,15,GetShader::Vertex(L"IGather"),Gather::InstancedPass.IAStage.Layout); Gather::InstancedPass.IAStage.Topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; - Gather::InstancedPass.CBuffers.Vertex.push_back(Gather::AnimationData); - Gather::InstancedPass.CBuffers.Vertex.push_back(Gather::ModelData); - Gather::InstancedPass.CBuffers.Pixel.push_back(Color); Gather::InstancedPass.RenderStates.Rasterizer = RenderStates::rs; Gather::InstancedPass.RenderStates.SampleCount = 1; Gather::InstancedPass.RenderStates.SampleState = RenderStates::ss; diff --git a/Code/OysterGraphics/Shader/Passes/Light/Defines.hlsli b/Code/OysterGraphics/Shader/Passes/Light/Defines.hlsli index adf01e9d..fb125b12 100644 --- a/Code/OysterGraphics/Shader/Passes/Light/Defines.hlsli +++ b/Code/OysterGraphics/Shader/Passes/Light/Defines.hlsli @@ -25,6 +25,16 @@ cbuffer LightConstants : register(b0) float4x4 View; } +struct FrustrumPoints +{ + float3 v0; + float3 v1; + float3 v2; + float3 v3; + float3 v4; + float3 v5; +}; + Texture2D DiffuseGlow : register(t0); Texture2D NormalSpec : register(t1); Texture2D GUI : register(t2); diff --git a/Code/OysterGraphics/Shader/Passes/Light/LightCalc.hlsli b/Code/OysterGraphics/Shader/Passes/Light/LightCalc.hlsli index 3dc2b45e..81fa2fa1 100644 --- a/Code/OysterGraphics/Shader/Passes/Light/LightCalc.hlsli +++ b/Code/OysterGraphics/Shader/Passes/Light/LightCalc.hlsli @@ -27,4 +27,9 @@ DiffSpec LightCalc(PointLight pl, float3 pos, int2 texCoord) float SpecCo = normalSpec.w < 1 ? 0.0f : 1.0f; output.Specular = output.Specular * SpecCo; return output; +} + +bool intersects(FrustrumPoints box, int Index) +{ + return true; } \ No newline at end of file diff --git a/Code/OysterGraphics/Shader/Passes/Light/LightPass.hlsl b/Code/OysterGraphics/Shader/Passes/Light/LightPass.hlsl index 89ed06d3..ddaed99e 100644 --- a/Code/OysterGraphics/Shader/Passes/Light/LightPass.hlsl +++ b/Code/OysterGraphics/Shader/Passes/Light/LightPass.hlsl @@ -8,13 +8,85 @@ //Calc Ambience Done //Write Glow +#define EXPAND 1024.0f +#define SHRINK 1.0f/EXPAND +#define UINT_MAX 0xFFFFFFFF +#define FLOAT_MAX 3.402823466e+38 +#define BLOCKSIZE 16 +#define NUMTHREADS BLOCKSIZE * BLOCKSIZE +#define MAXLIGHTS 100 -[numthreads(16, 16, 1)] -void main( uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID ) + +// -- Shared Memory ------------------------------------------------- // + +groupshared uint iMinDepth = UINT_MAX, + iMaxDepth = 0; +groupshared uint numVisiblePointLights = 0, + visiblePointlightIndex[MAXLIGHTS]; + +// ------------------------------------------------------------------ // + +[numthreads(BLOCKSIZE, BLOCKSIZE, 1)] +void main( uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint3 Gid : SV_GroupID, uint GI : SV_GroupIndex ) { float2 UV = DTid.xy / Pixels; UV.x = UV.x * 2 - 1; UV.y = 1 - 2 * UV.y; + + float3 posN = float3(UV, DepthTexture[DTid.xy].x); + + // store and load shared minDepth and maxDepth + float minDepth = 0.0f, maxDepth = 0.0f, + depth = posN.z; + { + uint uidepth = (uint)( depth * EXPAND); + InterlockedMin( iMinDepth, uidepth ); + InterlockedMax( iMaxDepth, uidepth ); + + GroupMemoryBarrierWithGroupSync(); + minDepth = (float)( iMinDepth ) * SHRINK; + maxDepth = (float)( iMaxDepth ) * SHRINK; + } + + + // -- Switching to LightCulling ------------------------------------- // + + //define collision volume + float2 size = BLOCKSIZE / Pixels; + FrustrumPoints tile; + tile.v0 = float3(size * Gid,minDepth); + tile.v1 = float3(tile.v0.xy+size,maxDepth); + tile.v2 = float3(tile.v1.xy, minDepth); + tile.v3 = float3(tile.v0.x,tile.v1.y,minDepth); + tile.v4 = float3(tile.v1.x, tile.v0.y, minDepth); + tile.v5 = float3(tile.v0.xy, maxDepth); + + + + // culling the tile's near and far to minDepth & maxDepth ( with tolerance ) + + + uint numPass = (Lights + NUMTHREADS - 1) / NUMTHREADS; + numPass = min( numPass, MAXLIGHTS / NUMTHREADS ); + + for( uint passI = 0; passI < numPass; ++passI ) + { + uint lightIndex = (passI * NUMTHREADS) + GI; + lightIndex = min( lightIndex, Lights ); + + if( lightIndex < Lights ) + if( intersects(tile, lightIndex) ) + { + uint offset; + InterlockedAdd( numVisiblePointLights, 1, offset ); + visiblePointlightIndex[offset] = lightIndex; + } + } + + GroupMemoryBarrierWithGroupSync(); + + + float3 ViewPos = ToVpos(DTid.xy, UV); DiffSpec Shaded; Shaded.Diffuse = float3(0,0,0); @@ -47,7 +119,7 @@ void main( uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID ) DepthBase = DepthBase /4; Ambient[DTid.xy/2] = float4(DiffBase.xyz, AmbValue); Ambient[DTid.xy/2 + float2(Pixels.x/2, 0)] = GUI[DTid.xy]; - Ambient[DTid.xy/2 + float2(0, Pixels.y/2)] = float4(DiffBase.xyz * DiffBase.w /* * (2-DepthBase) */,DiffBase.w); + Ambient[DTid.xy/2 + float2(0, Pixels.y/2)] = float4(DiffBase.xyz * DiffBase.w ,DiffBase.w); Ambient[DTid.xy/2 + Pixels/2] = float4(NormalSpec[DTid.xy].xyz * float3(1,1,-1),1); } From bc17a9f09ee3f2bc61b1ab7d367a40768c22379f Mon Sep 17 00:00:00 2001 From: Erik Persson Date: Tue, 25 Feb 2014 10:37:33 +0100 Subject: [PATCH 15/25] merge --- Code/Game/GameLogic/AttatchmentMassDriver.cpp | 2 + Code/Game/GameLogic/CollisionManager.cpp | 67 ++++++++++++++++++- Code/Game/GameLogic/DynamicObject.cpp | 26 +++++++ Code/Game/GameLogic/DynamicObject.h | 9 +++ Code/Game/GameLogic/GameLogicStates.h | 3 + Code/Game/GameLogic/Level.cpp | 10 +-- Code/Game/GameLogic/Player.cpp | 47 ++++++++++--- Code/Game/GameLogic/Player.h | 7 ++ 8 files changed, 156 insertions(+), 15 deletions(-) diff --git a/Code/Game/GameLogic/AttatchmentMassDriver.cpp b/Code/Game/GameLogic/AttatchmentMassDriver.cpp index b988451f..c6b0df0a 100644 --- a/Code/Game/GameLogic/AttatchmentMassDriver.cpp +++ b/Code/Game/GameLogic/AttatchmentMassDriver.cpp @@ -99,6 +99,7 @@ void AttatchmentMassDriver::ForcePush(const GameLogic::WEAPON_FIRE &usage, float forcePushData args; args.pushForce = pushForce; + args.p = this->owner; Oyster::Physics::API::Instance().ApplyEffect(hitCone,&args,ForcePushAction); @@ -136,6 +137,7 @@ void AttatchmentMassDriver::ForcePull(const WEAPON_FIRE &usage, float dt) Oyster::Collision3D::Cone *hitCone = new Oyster::Collision3D::Cone(lenght,pos,(Oyster::Math::Float4)owner->GetRigidBody()->GetState().quaternion,radius); forcePushData args; args.pushForce = -pushForce; + args.p = this->owner; Oyster::Physics::API::Instance().ApplyEffect(hitCone,&args,ForcePushAction); diff --git a/Code/Game/GameLogic/CollisionManager.cpp b/Code/Game/GameLogic/CollisionManager.cpp index 90a2aefe..8a360059 100644 --- a/Code/Game/GameLogic/CollisionManager.cpp +++ b/Code/Game/GameLogic/CollisionManager.cpp @@ -113,7 +113,7 @@ using namespace GameLogic; Object *realObjA = ((Object*)(objA->GetCustomTag())); - Object *realObjB = (Object*)objB->GetCustomTag(); //needs to be changed? + Object *realObjB = (Object*)objB->GetCustomTag(); ExplosiveCrate* crate; if(!realObjA) @@ -166,9 +166,13 @@ using namespace GameLogic; Player *hitPlayer = (Player*)realObj; hitPlayer->DamageLife(ExplosionSource->extraDamageOnCollision); //hitPlayer->GetRigidBody()->ApplyImpulse(force); + + //hitPlayer->DamageLife(ExplosionSource->getExtraDamageOnCollision()); + realObj->GetRigidBody()->ApplyImpulse(force * 5); //do shredding damage } + } @@ -226,6 +230,58 @@ using namespace GameLogic; { return Physics::ICustomBody::SubscriptMessage_none; } + + void DynamicObject::DynamicDefaultOnCollision(Oyster::Physics::ICustomBody *objA, Oyster::Physics::ICustomBody *objB, Oyster::Math::Float kineticEnergyLoss) + { + + DynamicObject *realObjA = dynamic_cast((Object*)objA->GetCustomTag()); + + DynamicObject *realObjB = dynamic_cast((Object*)objB->GetCustomTag()); + + if(!realObjA || !realObjB) // one of the objects cannot be cast into a dynamicObject and so we leave the function + { + return; + } + + //check which obj is the one that is already affected, if both are then use the special case of changing ownership. + if(realObjA->getAffectingPlayer() == NULL && realObjB->getAffectingPlayer() == NULL) //None of the objects have a player affecting them + { + return;//leave function as the are not to transfer any ownership + } + + if(realObjA->getAffectingPlayer() != NULL && realObjB->getAffectingPlayer() == NULL) + { + //realobjA is the affectedObject, transfer this to realobjB + realObjB->SetAffectedBy(*realObjA->getAffectingPlayer()); + + } + if(realObjB->getAffectingPlayer() != NULL && realObjA->getAffectingPlayer() == NULL) + { + //realobjB is the affectedObject, transfer this to realobjA + realObjA->SetAffectedBy(*realObjB->getAffectingPlayer()); + + } + + if(realObjA->getAffectingPlayer() != NULL && realObjB->getAffectingPlayer() != NULL) + { + //Both objects have a player affecting them, now use the special case + if(realObjA->GetRigidBody()->GetState().previousVelocity.GetMagnitude() > realObjB->GetRigidBody()->GetState().previousVelocity.GetMagnitude() ) + { + //realObjA is the winner and will change Bs ownership to A + realObjB->SetAffectedBy(*realObjA->getAffectingPlayer()); + } + else + { + realObjA->SetAffectedBy(*realObjB->getAffectingPlayer()); + //realObjB is the winner and will change As ownership to B + } + } + + + + + } + Oyster::Physics::ICustomBody::SubscriptMessage Player::PlayerCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss) { return Physics::ICustomBody::SubscriptMessage_none; @@ -250,7 +306,16 @@ using namespace GameLogic; if(realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_Player || realObj->GetObjectType() == ObjectSpecialType::ObjectSpecialType_World) return; + + obj->ApplyImpulse(((forcePushData*)(args))->pushForce); + + DynamicObject *dynamicObj = dynamic_cast(realObj); + + if(dynamicObj) + { + dynamicObj->SetAffectedBy(*((forcePushData*)(args))->p); + } } void AttatchmentMassDriver::AttemptPickUp(Oyster::Physics::ICustomBody *obj, void* args) diff --git a/Code/Game/GameLogic/DynamicObject.cpp b/Code/Game/GameLogic/DynamicObject.cpp index e6d9ff49..961d29fc 100644 --- a/Code/Game/GameLogic/DynamicObject.cpp +++ b/Code/Game/GameLogic/DynamicObject.cpp @@ -1,5 +1,6 @@ #include "DynamicObject.h" #include "CollisionManager.h" +#include "Player.h" using namespace GameLogic; using namespace Oyster::Math; @@ -10,6 +11,7 @@ DynamicObject::DynamicObject() { this->isReleased = false; this->isActive = true; + this->affectedBy = NULL; } DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID) @@ -17,12 +19,14 @@ DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*Ev { this->isReleased = false; this->isActive = true; + this->affectedBy = NULL; } DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::Physics::ICustomBody::SubscriptMessage (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID) :Object(rigidBody, EventOnCollision, type, objectID) { this->isReleased = false; this->isActive = true; + this->affectedBy = NULL; } DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, Oyster::Math::Float extraDamageOnCollision) @@ -31,6 +35,7 @@ DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*Ev this->extraDamageOnCollision = extraDamageOnCollision; this->isReleased = false; this->isActive = true; + this->affectedBy = NULL; } DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::Physics::ICustomBody::SubscriptMessage (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, Oyster::Math::Float extraDamageOnCollision) @@ -39,6 +44,7 @@ DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::P this->extraDamageOnCollision = extraDamageOnCollision; this->isReleased = false; this->isActive = true; + this->affectedBy = NULL; } DynamicObject::~DynamicObject(void) { @@ -74,4 +80,24 @@ void DynamicObject::Activate() { this->isActive = true; this->isReleased = false; +} + +void DynamicObject::SetAffectedBy(Player &player) +{ + this->affectedBy = &player; + if(this->type != ObjectSpecialType::ObjectSpecialType_Player) //should not add itself to its own list if its a player + { + player.AddAffectedObject(*this); + } + +} + +Player* DynamicObject::getAffectingPlayer() +{ + return this->affectedBy; +} + +void DynamicObject::RemoveAffectedBy() +{ + this->affectedBy = NULL; } \ No newline at end of file diff --git a/Code/Game/GameLogic/DynamicObject.h b/Code/Game/GameLogic/DynamicObject.h index 8a32e849..d1bb63bc 100644 --- a/Code/Game/GameLogic/DynamicObject.h +++ b/Code/Game/GameLogic/DynamicObject.h @@ -9,6 +9,7 @@ namespace GameLogic { + class Player; class DynamicObject : public Object { @@ -28,9 +29,17 @@ namespace GameLogic void Inactivate(); void Activate(); + void SetAffectedBy(GameLogic::Player &player); + void RemoveAffectedBy(); + GameLogic::Player* getAffectingPlayer(); + + static void DynamicObject::DynamicDefaultOnCollision(Oyster::Physics::ICustomBody *rigidBodyObject, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss); + private: bool isActive; bool isReleased; + protected: + GameLogic::Player *affectedBy; }; diff --git a/Code/Game/GameLogic/GameLogicStates.h b/Code/Game/GameLogic/GameLogicStates.h index 9ae0d482..ae4e192f 100644 --- a/Code/Game/GameLogic/GameLogicStates.h +++ b/Code/Game/GameLogic/GameLogicStates.h @@ -2,8 +2,10 @@ #define GAMELOGICSTATES_H #include "OysterMath.h" + namespace GameLogic { + class Player; enum PLAYER_MOVEMENT { PLAYER_MOVEMENT_FORWARD = 0, @@ -41,6 +43,7 @@ namespace GameLogic struct forcePushData { Oyster::Math::Float3 pushForce; + Player *p; }; diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 922d2a8f..a4252bc4 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -59,12 +59,12 @@ Object* Level::CreateGameObj(ObjectHeader* obj, ICustomBody* rigidBody) break; case ObjectSpecialType_Stone: { - gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); + gameObj = new DynamicObject(rigidBody, DynamicObject::DynamicDefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_StandardBox: { - gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); + gameObj = new DynamicObject(rigidBody, DynamicObject::DynamicDefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_RedExplosiveBox: @@ -81,12 +81,12 @@ Object* Level::CreateGameObj(ObjectHeader* obj, ICustomBody* rigidBody) // break; case ObjectSpecialType_SpikeBox: { - gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); + gameObj = new DynamicObject(rigidBody, DynamicObject::DynamicDefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_Spike: { - gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); + gameObj = new DynamicObject(rigidBody, DynamicObject::DynamicDefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_CrystalFormation: @@ -98,7 +98,7 @@ Object* Level::CreateGameObj(ObjectHeader* obj, ICustomBody* rigidBody) break; case ObjectSpecialType_CrystalShard: { - gameObj = new DynamicObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); + gameObj = new DynamicObject(rigidBody, DynamicObject::DynamicDefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); } break; case ObjectSpecialType_JumpPad: diff --git a/Code/Game/GameLogic/Player.cpp b/Code/Game/GameLogic/Player.cpp index 69569d44..4dcdacaa 100644 --- a/Code/Game/GameLogic/Player.cpp +++ b/Code/Game/GameLogic/Player.cpp @@ -18,6 +18,8 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, void (*EventOnCollision) :DynamicObject(rigidBody, EventOnCollision, type, objectID) { weapon = new Weapon(2,this); + AffectedObjects.Reserve(15); + this->life = 100; this->teamID = teamID; @@ -46,6 +48,9 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, Oyster::Physics::ICustom { weapon = new Weapon(2,this); + AffectedObjects.Reserve(15); + + this->life = 100; this->teamID = teamID; this->playerState = PLAYER_STATE_IDLE; @@ -213,6 +218,16 @@ void Player::BeginFrame() void Player::EndFrame() { + //check if there are any objects that can be removed from the AffectedObjects list + for(int i = 0; i < this->AffectedObjects.Size(); i++) + { + if((this->AffectedObjects[i]->GetRigidBody()->GetState().previousVelocity).GetMagnitude() <= 0.1f) + { + this->AffectedObjects[i]->RemoveAffectedBy(); + this->AffectedObjects.Remove(i); + } + + } } @@ -334,17 +349,31 @@ PLAYER_STATE Player::GetState() const void Player::DamageLife(int damage) { - if( this->playerState != PLAYER_STATE_DEAD) - { - this->life -= damage; - this->gameInstance->onDamageTakenFnc( this, this->life); - if(this->life <= 0) + this->life -= damage; + this->gameInstance->onDamageTakenFnc( this, this->life); + + if(this->life <= 0) + { + this->life = 0; + playerState = PLAYER_STATE_DEAD; + this->deathTimeLeft = this->deathTime; + this->gameInstance->onDeadFnc(this, this->deathTimeLeft); + } + +} + +void Player::AddAffectedObject(DynamicObject &AffectedObject) +{ + //check if object already exists in the list, if so then do not add + for(int i = 0; i < AffectedObjects.Size(); i++) + { + if(AffectedObjects[i]->GetID() == AffectedObject.GetID()) { - this->life = 0; - playerState = PLAYER_STATE_DEAD; - this->deathTimeLeft = this->deathTime; - this->gameInstance->onDeadFnc(this, this->deathTimeLeft); + //object already exists, exit function + return; } } + //else you add the object to the stack + AffectedObjects.Push(&AffectedObject); } diff --git a/Code/Game/GameLogic/Player.h b/Code/Game/GameLogic/Player.h index 001c9141..99af52c5 100644 --- a/Code/Game/GameLogic/Player.h +++ b/Code/Game/GameLogic/Player.h @@ -7,6 +7,7 @@ #include "GameLogicStates.h" #include "OysterMath.h" #include "DynamicObject.h" +#include "DynamicArray.h" namespace GameLogic @@ -49,6 +50,8 @@ namespace GameLogic void SetLookDir(const Oyster::Math3D::Float3& lookDir); void TurnLeft(Oyster::Math3D::Float deltaRadians); + + void AddAffectedObject(DynamicObject &AffectedObject); /******************************************************** * Collision function for player, this is to be sent to physics through the subscribe function with the rigidbody @@ -77,10 +80,14 @@ namespace GameLogic void EndFrame(); static Oyster::Physics::ICustomBody::SubscriptMessage PlayerCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss); + + private: void Jump(); private: + Utility::DynamicMemory::DynamicArray AffectedObjects; + Oyster::Math::Float life; int teamID; Weapon *weapon; From 8a359bd1baca45e4e2528b0f7aee12dd92361ae5 Mon Sep 17 00:00:00 2001 From: Erik Persson Date: Tue, 25 Feb 2014 11:20:46 +0100 Subject: [PATCH 16/25] GL - only 1 player can manipulate a object at a time --- Code/Game/GameLogic/AttatchmentMassDriver.cpp | 2 +- Code/Game/GameLogic/CollisionManager.cpp | 14 +++++++++++-- Code/Game/GameLogic/DynamicObject.cpp | 20 +++++++++++++++++++ Code/Game/GameLogic/DynamicObject.h | 5 +++++ Code/Game/GameLogic/Player.cpp | 2 +- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Code/Game/GameLogic/AttatchmentMassDriver.cpp b/Code/Game/GameLogic/AttatchmentMassDriver.cpp index c6b0df0a..1f86bf60 100644 --- a/Code/Game/GameLogic/AttatchmentMassDriver.cpp +++ b/Code/Game/GameLogic/AttatchmentMassDriver.cpp @@ -80,7 +80,7 @@ void AttatchmentMassDriver::ForcePush(const GameLogic::WEAPON_FIRE &usage, float { pushForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (800); heldObject->ApplyImpulse((Oyster::Math::Float3)pushForce); - + ((DynamicObject*)(heldObject->GetCustomTag()))->RemoveManipulation(); hasObject = false; heldObject = NULL; return; diff --git a/Code/Game/GameLogic/CollisionManager.cpp b/Code/Game/GameLogic/CollisionManager.cpp index 8a360059..d60d16ce 100644 --- a/Code/Game/GameLogic/CollisionManager.cpp +++ b/Code/Game/GameLogic/CollisionManager.cpp @@ -309,6 +309,7 @@ using namespace GameLogic; obj->ApplyImpulse(((forcePushData*)(args))->pushForce); + DynamicObject *dynamicObj = dynamic_cast(realObj); @@ -333,12 +334,21 @@ using namespace GameLogic; Object* realObj = (Object*)(obj->GetCustomTag()); //check so that it is an object that you can pickup - switch(realObj->GetObjectType()) + DynamicObject *dynamicObj = dynamic_cast(realObj); + + if(!dynamicObj) return; + + if(dynamicObj->getManipulatingPlayer() != NULL) + { + return; + } + + switch(dynamicObj->GetObjectType()) { case ObjectSpecialType::ObjectSpecialType_StandardBox: weapon->heldObject = obj; //weapon now holds the object weapon->hasObject = true; - + dynamicObj->SetManipulatingPlayer(*weapon->owner); //TODO: add if this is to be a struggle of who has the most power in its weapon, the player that is already manipulating the object or you. if you then you take the object from the other player, if not then you do not take the object break; } diff --git a/Code/Game/GameLogic/DynamicObject.cpp b/Code/Game/GameLogic/DynamicObject.cpp index 961d29fc..844deaf2 100644 --- a/Code/Game/GameLogic/DynamicObject.cpp +++ b/Code/Game/GameLogic/DynamicObject.cpp @@ -12,6 +12,7 @@ DynamicObject::DynamicObject() this->isReleased = false; this->isActive = true; this->affectedBy = NULL; + this->manipulatedBy = NULL; } DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID) @@ -20,6 +21,7 @@ DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*Ev this->isReleased = false; this->isActive = true; this->affectedBy = NULL; + this->manipulatedBy = NULL; } DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::Physics::ICustomBody::SubscriptMessage (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID) :Object(rigidBody, EventOnCollision, type, objectID) @@ -27,6 +29,7 @@ DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::P this->isReleased = false; this->isActive = true; this->affectedBy = NULL; + this->manipulatedBy = NULL; } DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, Oyster::Math::Float extraDamageOnCollision) @@ -36,6 +39,7 @@ DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , void (*Ev this->isReleased = false; this->isActive = true; this->affectedBy = NULL; + this->manipulatedBy = NULL; } DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::Physics::ICustomBody::SubscriptMessage (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, Oyster::Math::Float extraDamageOnCollision) @@ -45,6 +49,7 @@ DynamicObject::DynamicObject(Oyster::Physics::ICustomBody *rigidBody , Oyster::P this->isReleased = false; this->isActive = true; this->affectedBy = NULL; + this->manipulatedBy = NULL; } DynamicObject::~DynamicObject(void) { @@ -100,4 +105,19 @@ Player* DynamicObject::getAffectingPlayer() void DynamicObject::RemoveAffectedBy() { this->affectedBy = NULL; +} + +GameLogic::Player* DynamicObject::getManipulatingPlayer() +{ + return this->manipulatedBy; +} + +void DynamicObject::SetManipulatingPlayer(GameLogic::Player &player) +{ + this->manipulatedBy = &player; +} + +void DynamicObject::RemoveManipulation() +{ + this->manipulatedBy = NULL; } \ No newline at end of file diff --git a/Code/Game/GameLogic/DynamicObject.h b/Code/Game/GameLogic/DynamicObject.h index d1bb63bc..03a03ad6 100644 --- a/Code/Game/GameLogic/DynamicObject.h +++ b/Code/Game/GameLogic/DynamicObject.h @@ -30,8 +30,11 @@ namespace GameLogic void Activate(); void SetAffectedBy(GameLogic::Player &player); + void SetManipulatingPlayer(GameLogic::Player &player); void RemoveAffectedBy(); + void RemoveManipulation(); GameLogic::Player* getAffectingPlayer(); + GameLogic::Player* getManipulatingPlayer(); static void DynamicObject::DynamicDefaultOnCollision(Oyster::Physics::ICustomBody *rigidBodyObject, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss); @@ -40,6 +43,8 @@ namespace GameLogic bool isReleased; protected: GameLogic::Player *affectedBy; + GameLogic::Player *manipulatedBy; + }; diff --git a/Code/Game/GameLogic/Player.cpp b/Code/Game/GameLogic/Player.cpp index 4dcdacaa..d8ba38ba 100644 --- a/Code/Game/GameLogic/Player.cpp +++ b/Code/Game/GameLogic/Player.cpp @@ -221,7 +221,7 @@ void Player::EndFrame() //check if there are any objects that can be removed from the AffectedObjects list for(int i = 0; i < this->AffectedObjects.Size(); i++) { - if((this->AffectedObjects[i]->GetRigidBody()->GetState().previousVelocity).GetMagnitude() <= 0.1f) + if(this->AffectedObjects[i] && (this->AffectedObjects[i]->GetRigidBody()->GetState().previousVelocity).GetMagnitude() <= 0.1f) { this->AffectedObjects[i]->RemoveAffectedBy(); this->AffectedObjects.Remove(i); From 7460f16512752721054f79c5513a86dcf83c1792 Mon Sep 17 00:00:00 2001 From: Linda Andersson Date: Tue, 25 Feb 2014 11:46:05 +0100 Subject: [PATCH 17/25] Added player stats. Added players to level. Respawn logic in level. --- .../GameClient/GameClientState/GamingUI.cpp | 2 +- Code/Game/GameLogic/Game.cpp | 5 +- Code/Game/GameLogic/Game.h | 13 ++- Code/Game/GameLogic/GameAPI.h | 2 + Code/Game/GameLogic/GameLogicStates.h | 3 +- Code/Game/GameLogic/Game_LevelData.cpp | 14 ++- Code/Game/GameLogic/Game_PlayerData.cpp | 4 + Code/Game/GameLogic/Level.cpp | 56 ++++++++- Code/Game/GameLogic/Level.h | 14 ++- Code/Game/GameLogic/Player.cpp | 110 ++++++++---------- Code/Game/GameLogic/Player.h | 34 ++++-- .../Implementation/GameSession_Gameplay.cpp | 5 - 12 files changed, 167 insertions(+), 95 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GamingUI.cpp b/Code/Game/GameClient/GameClientState/GamingUI.cpp index d356028a..1486fdda 100644 --- a/Code/Game/GameClient/GameClientState/GamingUI.cpp +++ b/Code/Game/GameClient/GameClientState/GamingUI.cpp @@ -105,7 +105,7 @@ void GamingUI::ReadKeyInput() float yaw = this->input->GetYaw(); //if( yaw != 0.0f ) //This made the camera reset to a specific rotation. { - this->netClient->Send( Protocol_PlayerLeftTurn(yaw * mouseSensitivity,camera->GetLook()) ); + this->netClient->Send( Protocol_PlayerLeftTurn(yaw * mouseSensitivity, camera->GetLook()) ); } } diff --git a/Code/Game/GameLogic/Game.cpp b/Code/Game/GameLogic/Game.cpp index 0e1ab178..a33ce03c 100644 --- a/Code/Game/GameLogic/Game.cpp +++ b/Code/Game/GameLogic/Game.cpp @@ -108,6 +108,7 @@ Game::PlayerData* Game::CreatePlayer() this->players[insert] = new PlayerData(freeID, 0); // user constructor with objectID and teamID this->players[insert]->player->GetRigidBody()->SetSubscription(Game::PhysicsOnMove); + this->level->AddPlayerToGame(this->players[insert]); return this->players[insert]; } @@ -128,6 +129,9 @@ void Game::CreateTeam() bool Game::NewFrame() { + // HACK need dynamic delta time + this->level->Update(this->frameTime); + for (unsigned int i = 0; i < this->players.Size(); i++) { if(this->players[i] && this->players[i]->player) this->players[i]->player->BeginFrame(); @@ -202,4 +206,3 @@ void Game::PhysicsOnDestroy(::Utility::DynamicMemory::UniquePointer { if(gameInstance.onDisableFnc) gameInstance.onDisableFnc(0, 0); } - diff --git a/Code/Game/GameLogic/Game.h b/Code/Game/GameLogic/Game.h index 37abe97f..c03de2ed 100644 --- a/Code/Game/GameLogic/Game.h +++ b/Code/Game/GameLogic/Game.h @@ -45,7 +45,7 @@ namespace GameLogic ObjectSpecialType GetObjectType() const override; void Inactivate() override; void Release() override; - + Player* GetPlayer(); Player *player; }; @@ -63,7 +63,8 @@ namespace GameLogic int getNrOfDynamicObj()const override; IObjectData* GetObjectAt(int ID) const override; void GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray& mem) const override; - + void Update(float deltaTime); + void AddPlayerToGame(IPlayerData *player); Level *level; }; @@ -80,16 +81,16 @@ namespace GameLogic void SetFrameTimeLength( float seconds ) override; void SetSubscription(GameEvent::ObjectMovedFunction functionPointer) override; void SetSubscription(GameEvent::ObjectDisabledFunction functionPointer) override; - void SetHpSubscription(GameEvent::ObjectHpFunction functionPointer) override; - void SetRespawnSubscription(GameEvent::ObjectRespawnedFunction functionPointer) override; - void SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer) override; - + void SetHpSubscription(GameEvent::ObjectHpFunction functionPointer) override; + void SetRespawnSubscription(GameEvent::ObjectRespawnedFunction functionPointer) override; + void SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer) override; bool Initiate() override; float GetFrameTime() const; static void PhysicsOnMove(const Oyster::Physics::ICustomBody *object); static void PhysicsOnDestroy(::Utility::DynamicMemory::UniquePointer proto); + static void PhysicsOnDead(const Oyster::Physics::ICustomBody *object); Utility::DynamicMemory::DynamicArray players; LevelData* level; diff --git a/Code/Game/GameLogic/GameAPI.h b/Code/Game/GameLogic/GameAPI.h index 0c79f33d..627ea547 100644 --- a/Code/Game/GameLogic/GameAPI.h +++ b/Code/Game/GameLogic/GameAPI.h @@ -117,8 +117,10 @@ namespace GameLogic class ILevelData :public IObjectData { public: + virtual void Update(float deltaTime) = 0; virtual int getNrOfDynamicObj()const = 0; virtual IObjectData* GetObjectAt(int ID) const = 0; + virtual void AddPlayerToGame(IPlayerData *player) = 0; virtual void GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray& destMem) const = 0; }; diff --git a/Code/Game/GameLogic/GameLogicStates.h b/Code/Game/GameLogic/GameLogicStates.h index 9ae0d482..be4bd60e 100644 --- a/Code/Game/GameLogic/GameLogicStates.h +++ b/Code/Game/GameLogic/GameLogicStates.h @@ -18,7 +18,8 @@ namespace GameLogic PLAYER_STATE_WALKING = 1, PLAYER_STATE_IDLE = 2, PLAYER_STATE_DEAD = 4, - PLAYER_STATE_INVALID = 8, + PLAYER_STATE_DIED = 8, + PLAYER_STATE_INVALID = 16, }; enum WEAPON_FIRE diff --git a/Code/Game/GameLogic/Game_LevelData.cpp b/Code/Game/GameLogic/Game_LevelData.cpp index 903cb959..f16f4072 100644 --- a/Code/Game/GameLogic/Game_LevelData.cpp +++ b/Code/Game/GameLogic/Game_LevelData.cpp @@ -54,9 +54,17 @@ IObjectData* Game::LevelData::GetObjectAt(int ID) const void Game::LevelData::GetAllDynamicObjects(Utility::DynamicMemory::DynamicArray& mem) const { - mem.Resize(level->dynamicObjects.Size()); - for(int i = 0; i < (int)level->dynamicObjects.Size(); i++) + mem.Resize(level->GetDynamicObject().Size()); + for(int i = 0; i < (int)level->GetDynamicObject().Size(); i++) { - mem[i] = level->dynamicObjects[i]; + mem[i] = level->GetDynamicObject()[i]; } +} +void Game::LevelData::Update(float deltaTime) +{ + this->level->Update(deltaTime); +} +void Game::LevelData::AddPlayerToGame(IPlayerData *player) +{ + this->level->AddPlayerToGame(((PlayerData*)player)->GetPlayer()); } \ No newline at end of file diff --git a/Code/Game/GameLogic/Game_PlayerData.cpp b/Code/Game/GameLogic/Game_PlayerData.cpp index ad409e3b..88b4bbbe 100644 --- a/Code/Game/GameLogic/Game_PlayerData.cpp +++ b/Code/Game/GameLogic/Game_PlayerData.cpp @@ -101,4 +101,8 @@ void Game::PlayerData::Inactivate() void Game::PlayerData::Release() { this->player->ReleaseDynamicObject(); +} +Player* Game::PlayerData::GetPlayer() +{ + return this->player; } \ No newline at end of file diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 922d2a8f..3eb57bf5 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -12,7 +12,7 @@ using namespace GameLogic; using namespace Utility::DynamicMemory; using namespace Oyster::Physics; - +using namespace Oyster::Math; Level::Level(void) { @@ -69,7 +69,7 @@ Object* Level::CreateGameObj(ObjectHeader* obj, ICustomBody* rigidBody) break; case ObjectSpecialType_RedExplosiveBox: { - Oyster::Math::Float dmg = 90; + Oyster::Math::Float dmg = 120; Oyster::Math::Float force = 500; Oyster::Math::Float radie = 3; gameObj = new ExplosiveCrate(rigidBody, (ObjectSpecialType)obj->specialTypeID, objID++, dmg, force, radie); @@ -393,7 +393,20 @@ void Level::AddPlayerToTeam(Player *player, int teamID) { this->teamManager.AddPlayerToTeam(player,teamID); } - +void Level::AddPlayerToGame(Player *player) +{ + this->playerObjects.Push(player); +} +void Level::RemovePlayerFromGame(Player *player) +{ + for(int i = 0; i < (int)this->playerObjects.Size(); i++) + { + if ((Player*)this->playerObjects[i] == player) + { + //this->playerObjects[i]. + } + } +} void Level::CreateTeam(int teamSize) { this->teamManager.CreateTeam(teamSize); @@ -401,9 +414,29 @@ void Level::CreateTeam(int teamSize) void Level::RespawnPlayer(Player *player) { - this->teamManager.RespawnPlayerRandom(player); -} + //this->teamManager.RespawnPlayerRandom(player); + Float3 spawnPoint = spawnPoints[0]; + player->Respawn(spawnPoint); +} +void Level::Update(float deltaTime) +{ + // update lvl-things + for(int i = 0; i < (int)this->playerObjects.Size(); i++) + { + if (this->playerObjects[i]->GetState() == PLAYER_STATE::PLAYER_STATE_DEAD) + { + // true when timer reaches 0 + if(this->playerObjects[i]->deathTimerTick(deltaTime)) + RespawnPlayer(this->playerObjects[i]); + } + else if (this->playerObjects[i]->GetState() == PLAYER_STATE::PLAYER_STATE_DIED) + { + this->playerObjects[i]->setDeathTimer(DEATH_TIMER); + ((Game*)&Game::Instance())->onDeadFnc(this->playerObjects[i], DEATH_TIMER); // add killer ID + } + } +} int Level::getNrOfDynamicObj() { return this->dynamicObjects.Size(); @@ -417,10 +450,23 @@ Object* Level::GetObj( int ID) const } return NULL; } + void Level::PhysicsOnMoveLevel(const ICustomBody *object) { // function call from physics update when object was moved Object* temp = (Object*)object->GetCustomTag(); ((Game*)&Game::Instance())->onMoveFnc(temp); } +Utility::DynamicMemory::DynamicArray> Level::GetPlayers() +{ + return this->playerObjects; +} +Utility::DynamicMemory::DynamicArray> Level::GetStaticObjects() +{ + return this->staticObjects; +} +Utility::DynamicMemory::DynamicArray> Level::GetDynamicObject() +{ + return this->dynamicObjects; +} diff --git a/Code/Game/GameLogic/Level.h b/Code/Game/GameLogic/Level.h index 27f0bab6..9fb3dbad 100644 --- a/Code/Game/GameLogic/Level.h +++ b/Code/Game/GameLogic/Level.h @@ -16,6 +16,7 @@ #include "DynamicArray.h" #include "LevelLoader.h" +const int DEATH_TIMER = 5; namespace GameLogic { @@ -48,7 +49,8 @@ namespace GameLogic * @param teamID: ArrayPos of the team you want to add the player to ********************************************************/ void AddPlayerToTeam(Player *player, int teamID); - + void AddPlayerToGame(Player *player); + void RemovePlayerFromGame(Player *player); /******************************************************** * Respawns a player on a random teammate @@ -64,13 +66,21 @@ namespace GameLogic ********************************************************/ static Oyster::Physics::ICustomBody::SubscriptMessage LevelCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss); + void Update(float deltaTime); + int getNrOfDynamicObj(); Object* GetObj( int ID ) const; + static void PlayerDied( Player* player ); static void PhysicsOnMoveLevel(const Oyster::Physics::ICustomBody *object); + Utility::DynamicMemory::DynamicArray> GetPlayers(); + Utility::DynamicMemory::DynamicArray> GetStaticObjects(); + Utility::DynamicMemory::DynamicArray> GetDynamicObject(); - //private: + private: + Utility::DynamicMemory::DynamicArray> playerObjects; + Utility::DynamicMemory::DynamicArray> deadPlayerObjects; TeamManager teamManager; Utility::DynamicMemory::DynamicArray> staticObjects; Utility::DynamicMemory::DynamicArray> dynamicObjects; diff --git a/Code/Game/GameLogic/Player.cpp b/Code/Game/GameLogic/Player.cpp index 69569d44..91f09c56 100644 --- a/Code/Game/GameLogic/Player.cpp +++ b/Code/Game/GameLogic/Player.cpp @@ -11,7 +11,8 @@ const float KEY_TIMER = 0.03f; Player::Player() :DynamicObject() { - + Player::initPlayerData(); + this->teamID = -1; } Player::Player(Oyster::Physics::ICustomBody *rigidBody, void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, int teamID) @@ -19,26 +20,8 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, void (*EventOnCollision) { weapon = new Weapon(2,this); - this->life = 100; + Player::initPlayerData(); this->teamID = teamID; - this->playerState = PLAYER_STATE_IDLE; - this->lookDir = Oyster::Math::Float3(0,0,-1); - key_forward = 0; - key_backward = 0; - key_strafeRight = 0; - key_strafeLeft = 0; - key_jump = 0; - invincibleCooldown = 0; - this->deathTimeLeft = 0; - this->deathTime = 5; - - this->previousPosition = Oyster::Math::Float3(0,0,0); - - this->moveDir = Oyster::Math::Float3(0,0,0); - this->moveSpeed = 100; - this->previousMoveSpeed = Oyster::Math::Float3(0,0,0); - - this->rotationUp = 0; } Player::Player(Oyster::Physics::ICustomBody *rigidBody, Oyster::Physics::ICustomBody::SubscriptMessage (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, int teamID) @@ -46,24 +29,8 @@ Player::Player(Oyster::Physics::ICustomBody *rigidBody, Oyster::Physics::ICustom { weapon = new Weapon(2,this); - this->life = 100; + Player::initPlayerData(); this->teamID = teamID; - this->playerState = PLAYER_STATE_IDLE; - this->lookDir = Oyster::Math::Float3(0,0,-1); - key_forward = 0; - key_backward = 0; - key_strafeRight = 0; - key_strafeLeft = 0; - key_jump = 0; - invincibleCooldown = 0; - this->deathTimeLeft = 0; - this->deathTime = 5; - this->previousPosition = Oyster::Math::Float3(0,0,0); - this->moveDir = Oyster::Math::Float3(0,0,0); - this->moveSpeed = 20; - this->previousMoveSpeed = Oyster::Math::Float3(0,0,0); - - this->rotationUp = 0; } Player::~Player(void) @@ -74,10 +41,29 @@ Player::~Player(void) weapon = NULL; } } +void Player::initPlayerData() +{ + this->playerStats.hp = MAX_HP; + this->playerStats.movementSpeed = BASIC_SPEED; + this->playerScore.killScore = 0; + this->playerScore.deathScore = 0; + this->playerState = PLAYER_STATE_IDLE; + this->lookDir = Oyster::Math::Float3(0,0,-1); + + this->key_forward = 0; + this->key_backward = 0; + this->key_strafeRight = 0; + this->key_strafeLeft = 0; + this->key_jump = 0; + this->invincibleCooldown = 0; + this->deathTimer = 0; + + this->rotationUp = 0; +} void Player::BeginFrame() { - if( this->playerState != PLAYER_STATE_DEAD) + if( this->playerState != PLAYER_STATE_DEAD && PLAYER_STATE_DIED) { weapon->Update(0.002f); @@ -112,7 +98,7 @@ void Player::BeginFrame() // Walking data Oyster::Math::Float3 walkDirection = Oyster::Math::Float3(0.0, 0.0, 0.0); - Oyster::Math::Float walkSpeed = this->moveSpeed*0.2f; + Oyster::Math::Float walkSpeed = this->playerStats.movementSpeed*0.2f; // Check for input if(key_forward > 0.001) @@ -194,26 +180,15 @@ void Player::BeginFrame() if(this->rigidBody->GetLambda() < 0.9f) { Oyster::Math::Float3 up = this->rigidBody->GetState().centerPos.GetNormalized(); - this->rigidBody->ApplyImpulse(up*this->rigidBody->GetState().mass*20); + this->rigidBody->ApplyImpulse(up*this->rigidBody->GetState().mass * 20); this->playerState = PLAYER_STATE::PLAYER_STATE_JUMPING; } } } - else - { - // player is dead - // TODO move this logic to lvl - this->deathTimeLeft -= gameInstance->GetFrameTime(); - if( this->deathTimeLeft <= 0) - { - Respawn( Oyster::Math::Float3( -50, 180, 0)); - } - } } void Player::EndFrame() { - } void Player::Move(const PLAYER_MOVEMENT &movement) @@ -268,12 +243,10 @@ void Player::Respawn(Oyster::Math::Float3 spawnPoint) { if( this->playerState == PLAYER_STATE_DEAD) { - this->life = 100; - this->playerState = PLAYER_STATE::PLAYER_STATE_IDLE; - //this->lookDir = Oyster::Math::Float4(1,0,0); + Player::initPlayerData(); this->rigidBody->SetPosition(spawnPoint); this->gameInstance->onRespawnFnc( this, spawnPoint); - this->gameInstance->onDamageTakenFnc( this, this->life); + this->gameInstance->onDamageTakenFnc( this, this->playerStats.hp); } } @@ -336,15 +309,28 @@ void Player::DamageLife(int damage) { if( this->playerState != PLAYER_STATE_DEAD) { - this->life -= damage; - this->gameInstance->onDamageTakenFnc( this, this->life); + this->playerStats.hp -= damage; + // send hp to client + this->gameInstance->onDamageTakenFnc( this, this->playerStats.hp); - if(this->life <= 0) + if(this->playerStats.hp <= 0) { - this->life = 0; - playerState = PLAYER_STATE_DEAD; - this->deathTimeLeft = this->deathTime; - this->gameInstance->onDeadFnc(this, this->deathTimeLeft); + this->playerStats.hp = 0; + this->playerState = PLAYER_STATE_DIED; } } } +bool Player::deathTimerTick(float dt) +{ + this->deathTimer -= dt; + if( this->deathTimer <= 0) + { + return true; + } + return false; +} +void Player::setDeathTimer(float deathTimer) +{ + this->deathTimer = deathTimer; + this->playerState = PLAYER_STATE_DEAD; +} \ No newline at end of file diff --git a/Code/Game/GameLogic/Player.h b/Code/Game/GameLogic/Player.h index 001c9141..c7900d5f 100644 --- a/Code/Game/GameLogic/Player.h +++ b/Code/Game/GameLogic/Player.h @@ -8,6 +8,8 @@ #include "OysterMath.h" #include "DynamicObject.h" +const float MAX_HP = 100.0f; +const float BASIC_SPEED = 30.0f; namespace GameLogic { @@ -15,6 +17,21 @@ namespace GameLogic class Player : public DynamicObject { public: + struct PlayerStats + { + Oyster::Math::Float hp; + Oyster::Math::Float movementSpeed; + //Oyster::Math::Float resistance; + }; + + struct PlayerScore + { + int killScore; + int deathScore; + // int assistScore; + // int suicideScore; + }; + Player(void); Player(Oyster::Physics::ICustomBody *rigidBody, void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss), ObjectSpecialType type, int objectID, int teamID); @@ -72,16 +89,18 @@ namespace GameLogic PLAYER_STATE GetState() const; void DamageLife(int damage); + void setDeathTimer(float deathTimer); + bool deathTimerTick(float dt); void BeginFrame(); void EndFrame(); static Oyster::Physics::ICustomBody::SubscriptMessage PlayerCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss); - private: void Jump(); + void initPlayerData(); private: - Oyster::Math::Float life; + int teamID; Weapon *weapon; PLAYER_STATE playerState; @@ -93,18 +112,15 @@ namespace GameLogic float key_jump; - Oyster::Math::Float3 previousPosition; - Oyster::Math::Float3 moveDir; - Oyster::Math::Float moveSpeed; - Oyster::Math::Float3 previousMoveSpeed; - Oyster::Math::Float rotationUp; - float deathTime; - float deathTimeLeft; + float deathTimer; bool hasTakenDamage; float invincibleCooldown; + PlayerStats playerStats; + PlayerScore playerScore; + }; } #endif \ No newline at end of file diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index 8cc47dcc..5d3f2a71 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -188,7 +188,6 @@ using namespace DanBias; break; case protocol_Gameplay_PlayerShot: this->Gameplay_PlayerShot ( Protocol_PlayerShot (p), c ); break; - case protocol_Gameplay_ObjectPickup: this->Gameplay_ObjectPickup ( Protocol_ObjectPickup (p), c ); break; case protocol_Gameplay_ObjectDamage: this->Gameplay_ObjectDamage ( Protocol_ObjectDamage (p), c ); @@ -201,7 +200,6 @@ using namespace DanBias; break; case protocol_Gameplay_ObjectCreate: this->Gameplay_ObjectCreate ( Protocol_ObjectCreate (p), c ); break; - case protocol_General_Status: this->General_Status ( Protocol_General_Status (p), c ); break; case protocol_General_Text: this->General_Text ( Protocol_General_Text (p), c ); @@ -242,11 +240,8 @@ using namespace DanBias; { if(p.secondaryPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_SECONDARY_PRESS); if(p.primaryPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_PRIMARY_PRESS); - if(p.utilityPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_UTILLITY_PRESS); } - - void GameSession::Gameplay_ObjectPickup ( Protocol_ObjectPickup& p, DanBias::GameClient* c ) { From 31bf73c2fd4204b14d23f28c6a0733b2c4a1454a Mon Sep 17 00:00:00 2001 From: Erik Persson Date: Tue, 25 Feb 2014 13:56:35 +0100 Subject: [PATCH 18/25] GL - weapon energy, force etc inside weapon --- Code/Game/GameLogic/AttatchmentMassDriver.cpp | 45 ++++++++++++++----- Code/Game/GameLogic/AttatchmentMassDriver.h | 19 ++++++++ 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/Code/Game/GameLogic/AttatchmentMassDriver.cpp b/Code/Game/GameLogic/AttatchmentMassDriver.cpp index 1f86bf60..62f3599e 100644 --- a/Code/Game/GameLogic/AttatchmentMassDriver.cpp +++ b/Code/Game/GameLogic/AttatchmentMassDriver.cpp @@ -11,10 +11,18 @@ AttatchmentMassDriver::AttatchmentMassDriver(void) this->owner = 0; this->heldObject = NULL; this->hasObject = false; + this->currentEnergy = StandardMaxEnergy; + this->maxEnergy = StandardMaxEnergy; + this->rechargeRate = StandardrechargeRate; + this->force = Standardforce; } AttatchmentMassDriver::AttatchmentMassDriver(Player &owner) { + this->currentEnergy = StandardMaxEnergy; + this->maxEnergy = StandardMaxEnergy; + this->rechargeRate = StandardrechargeRate; + this->force = Standardforce; this->owner = &owner; this->heldObject = NULL; @@ -36,15 +44,27 @@ void AttatchmentMassDriver::UseAttatchment(const GameLogic::WEAPON_FIRE &usage, switch (usage) { case WEAPON_FIRE::WEAPON_USE_PRIMARY_PRESS: - ForcePush(usage,dt); + if(currentEnergy >= 90.0f) + { + currentEnergy -= 90.0f; + ForcePush(usage,dt); + } break; case WEAPON_FIRE::WEAPON_USE_SECONDARY_PRESS: - ForcePull(usage,dt); + if(currentEnergy >= 1.0f) + { + currentEnergy -= 1.0f; + ForcePull(usage,dt); + } break; case WEAPON_FIRE::WEAPON_USE_UTILLITY_PRESS: - ForceZip(usage,dt); + if(currentEnergy >= 90.0f) + { + currentEnergy -= 90.0f; + ForceZip(usage,dt); + } break; } @@ -64,7 +84,14 @@ void AttatchmentMassDriver::Update(float dt) heldObject->SetPosition(pos); heldObject->SetLinearVelocity(Oyster::Math::Float3::null); + currentEnergy += rechargeRate * 0.5f; //rechargeRate is halfed if you are holding an object } + else + { + currentEnergy += rechargeRate; + } + + } /******************************************************** @@ -78,7 +105,7 @@ void AttatchmentMassDriver::ForcePush(const GameLogic::WEAPON_FIRE &usage, float if(hasObject) { - pushForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (800); + pushForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (this->force); heldObject->ApplyImpulse((Oyster::Math::Float3)pushForce); ((DynamicObject*)(heldObject->GetCustomTag()))->RemoveManipulation(); hasObject = false; @@ -91,12 +118,10 @@ void AttatchmentMassDriver::ForcePush(const GameLogic::WEAPON_FIRE &usage, float Oyster::Math::Float lenght = 10; Oyster::Math::Float3 pos = owner->GetRigidBody()->GetState().centerPos; - pushForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (400); + pushForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (this->force * 0.6f); Oyster::Collision3D::Cone *hitCone = new Oyster::Collision3D::Cone(lenght,pos,(Oyster::Math::Float4)owner->GetRigidBody()->GetState().quaternion,radius); - - forcePushData args; args.pushForce = pushForce; args.p = this->owner; @@ -111,7 +136,7 @@ void AttatchmentMassDriver::ForcePush(const GameLogic::WEAPON_FIRE &usage, float ********************************************************/ void AttatchmentMassDriver::ForceZip(const WEAPON_FIRE &usage, float dt) { - Oyster::Math::Float3 force = Oyster::Math::Float4(this->owner->GetLookDir()) * (1000); + Oyster::Math::Float3 force = Oyster::Math::Float4(this->owner->GetLookDir()) * (this->force); this->owner->GetRigidBody()->ApplyImpulse(force); } @@ -132,11 +157,11 @@ void AttatchmentMassDriver::ForcePull(const WEAPON_FIRE &usage, float dt) Oyster::Math::Float lenght = 10; Oyster::Math::Float3 pos = owner->GetRigidBody()->GetState().centerPos; - Oyster::Math::Float4 pushForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (100); + Oyster::Math::Float4 pullForce = Oyster::Math::Float4(this->owner->GetLookDir()) * (this->force * 0.2); Oyster::Collision3D::Cone *hitCone = new Oyster::Collision3D::Cone(lenght,pos,(Oyster::Math::Float4)owner->GetRigidBody()->GetState().quaternion,radius); forcePushData args; - args.pushForce = -pushForce; + args.pushForce = -pullForce; args.p = this->owner; Oyster::Physics::API::Instance().ApplyEffect(hitCone,&args,ForcePushAction); diff --git a/Code/Game/GameLogic/AttatchmentMassDriver.h b/Code/Game/GameLogic/AttatchmentMassDriver.h index 51368e91..385fcca3 100644 --- a/Code/Game/GameLogic/AttatchmentMassDriver.h +++ b/Code/Game/GameLogic/AttatchmentMassDriver.h @@ -4,8 +4,14 @@ #ifndef ATTATCHMENTMASSDRIVER_H #define ATTATCHMENTMASSDRIVER_H #include "IAttatchment.h" + + + namespace GameLogic { + const Oyster::Math::Float StandardMaxEnergy = 100.0f; + const Oyster::Math::Float StandardrechargeRate = 0.5f; + const Oyster::Math::Float Standardforce = 1000.0f; class AttatchmentMassDriver : public IAttatchment { @@ -53,6 +59,19 @@ namespace GameLogic Oyster::Physics::ICustomBody *heldObject; bool hasObject; + Oyster::Math::Float force; + + Oyster::Math::Float maxEnergy; + Oyster::Math::Float currentEnergy; + + Oyster::Math::Float rechargeRate; + + struct Aim + { + + }; + + }; } #endif From b8395e9af7b0cdd6c7914fb98b10c3ea9cb117c3 Mon Sep 17 00:00:00 2001 From: Linda Andersson Date: Tue, 25 Feb 2014 14:35:27 +0100 Subject: [PATCH 19/25] Added eventfunctions for PlayerAction and PickupEvent --- Code/Game/GameLogic/Game.cpp | 19 +++++++++++++++---- Code/Game/GameLogic/Game.h | 19 +++++++++++++------ Code/Game/GameLogic/GameAPI.h | 16 +++++++++------- Code/Game/GameLogic/Level.cpp | 3 +++ Code/Game/GameServer/GameSession.h | 6 ++++-- .../Implementation/GameSession_Gameplay.cpp | 18 ++++++++++++++++-- .../Implementation/GameSession_General.cpp | 7 +++++-- Code/Game/LevelLoader/ObjectDefines.h | 12 ++++++++++++ 8 files changed, 77 insertions(+), 23 deletions(-) diff --git a/Code/Game/GameLogic/Game.cpp b/Code/Game/GameLogic/Game.cpp index a33ce03c..e4782582 100644 --- a/Code/Game/GameLogic/Game.cpp +++ b/Code/Game/GameLogic/Game.cpp @@ -156,14 +156,18 @@ void Game::SetFrameTimeLength( float seconds ) this->frameTime = seconds; } -void Game::SetSubscription(GameEvent::ObjectMovedFunction functionPointer) +void Game::SetMoveSubscription(GameEvent::ObjectMovedFunction functionPointer) { this->onMoveFnc = functionPointer; } -void Game::SetSubscription(GameEvent::ObjectDisabledFunction functionPointer) +void Game::SetDisableSubscription(GameEvent::ObjectDisabledFunction functionPointer) { this->onDisableFnc = functionPointer; } +void Game::SetEnableSubscription(GameEvent::ObjectEnabledFunction functionPointer) +{ + this->onEnableFnc = functionPointer; +} void Game::SetHpSubscription(GameEvent::ObjectHpFunction functionPointer) { this->onDamageTakenFnc = functionPointer; @@ -176,7 +180,14 @@ void Game::SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer) { this->onDeadFnc = functionPointer; } - +void Game::SetActionSubscription(GameEvent::AnimationEventFunction functionPointer) +{ + this->onPlayerActionEventFnc = functionPointer; +} +void Game::SetPickupSubscription(GameEvent::PickupEventFunction functionPointer) +{ + this->onPickupEventFnc = functionPointer; +} bool Game::Initiate() { API::Instance().Init(); @@ -204,5 +215,5 @@ void Game::PhysicsOnMove(const ICustomBody *object) } void Game::PhysicsOnDestroy(::Utility::DynamicMemory::UniquePointer proto) { - if(gameInstance.onDisableFnc) gameInstance.onDisableFnc(0, 0); + if(gameInstance.onDisableFnc) gameInstance.onDisableFnc(0); } diff --git a/Code/Game/GameLogic/Game.h b/Code/Game/GameLogic/Game.h index c03de2ed..22b9fbda 100644 --- a/Code/Game/GameLogic/Game.h +++ b/Code/Game/GameLogic/Game.h @@ -79,11 +79,14 @@ namespace GameLogic bool NewFrame() override; void SetFPS( int FPS ) override; void SetFrameTimeLength( float seconds ) override; - void SetSubscription(GameEvent::ObjectMovedFunction functionPointer) override; - void SetSubscription(GameEvent::ObjectDisabledFunction functionPointer) override; - void SetHpSubscription(GameEvent::ObjectHpFunction functionPointer) override; - void SetRespawnSubscription(GameEvent::ObjectRespawnedFunction functionPointer) override; - void SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer) override; + void SetMoveSubscription(GameEvent::ObjectMovedFunction functionPointer) override; + void SetDisableSubscription(GameEvent::ObjectDisabledFunction functionPointer) override; + void SetEnableSubscription(GameEvent::ObjectEnabledFunction functionPointer) override; + void SetHpSubscription(GameEvent::ObjectHpFunction functionPointer) override; + void SetRespawnSubscription(GameEvent::ObjectRespawnedFunction functionPointer) override; + void SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer) override; + void SetActionSubscription(GameEvent::AnimationEventFunction functionPointer) override; + void SetPickupSubscription(GameEvent::PickupEventFunction functionPointer) override; bool Initiate() override; float GetFrameTime() const; @@ -96,11 +99,15 @@ namespace GameLogic LevelData* level; float frameTime; bool initiated; - GameEvent::ObjectDisabledFunction onDisableFnc; + GameEvent::ObjectMovedFunction onMoveFnc; + GameEvent::ObjectDisabledFunction onDisableFnc; + GameEvent::ObjectEnabledFunction onEnableFnc; GameEvent::ObjectHpFunction onDamageTakenFnc; GameEvent::ObjectRespawnedFunction onRespawnFnc; GameEvent::ObjectDeadFunction onDeadFnc; + GameEvent::AnimationEventFunction onPlayerActionEventFnc; + GameEvent::PickupEventFunction onPickupEventFnc; }; } diff --git a/Code/Game/GameLogic/GameAPI.h b/Code/Game/GameLogic/GameAPI.h index 8d0ff695..653fc26b 100644 --- a/Code/Game/GameLogic/GameAPI.h +++ b/Code/Game/GameLogic/GameAPI.h @@ -26,10 +26,13 @@ namespace GameLogic namespace GameEvent { typedef void(*ObjectMovedFunction)(IObjectData* object); // Callback method that recieves and object - typedef void(*ObjectDisabledFunction)(IObjectData* object, float seconds); // Callback method that recieves and object + typedef void(*ObjectDisabledFunction)(IObjectData* object); // Callback method that recieves and object + typedef void(*ObjectEnabledFunction)(IObjectData* object); // Callback method that recieves and object typedef void(*ObjectHpFunction)(IObjectData* object, float hp); // Callback method that sends obj HP typedef void(*ObjectRespawnedFunction)(IObjectData* object, Oyster::Math::Float3 spawnPos ); // Callback method that sends spawnPos typedef void(*ObjectDeadFunction)(IObjectData* victim, IObjectData* killer, float seconds); // Callback method that sends killer and death timer + typedef void(*PickupEventFunction)(IObjectData* player, int pickupEffectID ); // Callback method that sends killer and death timer + typedef void(*AnimationEventFunction)(IObjectData* player, int actionID ); // Callback method that sends killer and death timer //etc... }; @@ -177,15 +180,14 @@ namespace GameLogic /** Set a specific object event subscription callback * @param */ - virtual void SetSubscription(GameEvent::ObjectMovedFunction functionPointer) = 0; - - /** Set a specific object event subscription callback - * @param - */ - virtual void SetSubscription(GameEvent::ObjectDisabledFunction functionPointer) = 0; + virtual void SetMoveSubscription(GameEvent::ObjectMovedFunction functionPointer) = 0; + virtual void SetDisableSubscription(GameEvent::ObjectDisabledFunction functionPointer) = 0; + virtual void SetEnableSubscription(GameEvent::ObjectEnabledFunction functionPointer) = 0; virtual void SetHpSubscription(GameEvent::ObjectHpFunction functionPointer) = 0; virtual void SetRespawnSubscription(GameEvent::ObjectRespawnedFunction functionPointer) = 0; virtual void SetDeadSubscription(GameEvent::ObjectDeadFunction functionPointer) = 0; + virtual void SetActionSubscription(GameEvent::AnimationEventFunction functionPointer) = 0; + virtual void SetPickupSubscription(GameEvent::PickupEventFunction functionPointer) = 0; }; } diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index d258cc27..439f3ac8 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -434,10 +434,13 @@ void Level::Update(float deltaTime) { this->playerObjects[i]->setDeathTimer(DEATH_TIMER); // HACK to avoid crasch. affected by tag is NULL + Player* killer = this->playerObjects[i]->getAffectingPlayer(); ((Game*)&Game::Instance())->onDeadFnc(this->playerObjects[i], this->playerObjects[i], DEATH_TIMER); // add killer ID //((Game*)&Game::Instance())->onDeadFnc(this->playerObjects[i], this->playerObjects[i]->getAffectingPlayer(), DEATH_TIMER); // add killer ID } } + + } int Level::getNrOfDynamicObj() { diff --git a/Code/Game/GameServer/GameSession.h b/Code/Game/GameServer/GameSession.h index 0247571d..79b50395 100644 --- a/Code/Game/GameServer/GameSession.h +++ b/Code/Game/GameServer/GameSession.h @@ -98,11 +98,13 @@ namespace DanBias //Callback method receiving from game logic static void ObjectMove ( GameLogic::IObjectData* movedObject ); - static void ObjectDisabled ( GameLogic::IObjectData* movedObject, float seconds ); + static void ObjectDisabled ( GameLogic::IObjectData* movedObject ); + static void ObjectEnabled ( GameLogic::IObjectData* movedObject ); static void ObjectDamaged ( GameLogic::IObjectData* movedObject, float hp ); static void ObjectRespawned ( GameLogic::IObjectData* movedObject, Oyster::Math::Float3 spawnPos ); static void ObjectDead ( GameLogic::IObjectData* victim, GameLogic::IObjectData* killer, float seconds ); - + static void PickupEvent ( GameLogic::IObjectData* movedObject, int pickupEffectID ); + static void ActionEvent ( GameLogic::IObjectData* movedObject , int actionID ); //Private member variables private: Utility::DynamicMemory::DynamicArray gClients; diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index 6c8e6dc3..8e55f08b 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -146,9 +146,13 @@ using namespace DanBias; GameSession::gameSession->Send(p.GetProtocol()); //} } - void GameSession::ObjectDisabled( GameLogic::IObjectData* movedObject, float seconds ) + void GameSession::ObjectDisabled( GameLogic::IObjectData* movedObject ) { - GameSession::gameSession->Send(Protocol_ObjectDisable(movedObject->GetID(), seconds).GetProtocol()); + //GameSession::gameSession->Send(Protocol_ObjectDisable(movedObject->GetID()).GetProtocol()); + } + void GameSession::ObjectEnabled( GameLogic::IObjectData* movedObject ) + { + //GameSession::gameSession->Send(Protocol_ObjectDisable(movedObject->GetID()).GetProtocol()); } void GameSession::ObjectDamaged( GameLogic::IObjectData* movedObject, float hp ) { @@ -162,6 +166,16 @@ using namespace DanBias; { GameSession::gameSession->Send(Protocol_ObjectDie(victim->GetID(), killer->GetID(), seconds).GetProtocol()); } + void GameSession::PickupEvent( GameLogic::IObjectData* movedObject, int pickupEffectID ) + { + // send pickup protocol + GameSession::gameSession->Send(Protocol_ObjectPickup(movedObject->GetID(), pickupEffectID).GetProtocol()); + } + void GameSession::ActionEvent( GameLogic::IObjectData* movedObject , int actionID ) + { + // send action protocol + GameSession::gameSession->Send(Protocol_ObjectAction(movedObject->GetID(), actionID).GetProtocol()); + } //*****************************************************// //****************** Protocol methods *****************// //******************************************************************************************************************// diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index 0ad12987..ca869fb7 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -106,11 +106,14 @@ bool GameSession::Create(GameDescription& desc, bool forceStart) } /* Set some game instance data options */ - this->gameInstance.SetSubscription(GameSession::ObjectMove); - this->gameInstance.SetSubscription(GameSession::ObjectDisabled); + this->gameInstance.SetMoveSubscription(GameSession::ObjectMove); + this->gameInstance.SetDisableSubscription(GameSession::ObjectDisabled); + this->gameInstance.SetEnableSubscription(GameSession::ObjectEnabled); this->gameInstance.SetHpSubscription(GameSession::ObjectDamaged); this->gameInstance.SetRespawnSubscription(GameSession::ObjectRespawned); this->gameInstance.SetDeadSubscription(GameSession::ObjectDead); + this->gameInstance.SetActionSubscription(GameSession::ActionEvent); + this->gameInstance.SetPickupSubscription(GameSession::PickupEvent); this->gameInstance.SetFPS(60); this->description.clients.Clear(); diff --git a/Code/Game/LevelLoader/ObjectDefines.h b/Code/Game/LevelLoader/ObjectDefines.h index 52f0e088..8ff3a0af 100644 --- a/Code/Game/LevelLoader/ObjectDefines.h +++ b/Code/Game/LevelLoader/ObjectDefines.h @@ -92,6 +92,18 @@ namespace GameLogic WorldSize_Unknown = -1 }; + enum PlayerAction + { + PlayerAction_Jump, + PlayerAction_Walk, + PlayerAction_Idle, + }; + + enum PickupType + { + PickupType_Health, + PickupType_SpeedBoost + }; /************************************ Structs From 0369d8cf199f0d05ed13e0ee9900e6aad4c2af43 Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Tue, 25 Feb 2014 14:36:54 +0100 Subject: [PATCH 20/25] Not finished Pickup system. --- Code/Game/GameLogic/CollisionManager.cpp | 29 +++++++++++++++ Code/Game/GameLogic/GameLogic.vcxproj | 6 ++++ Code/Game/GameLogic/PickupSystem/Pickup.cpp | 29 +++++++++++++++ Code/Game/GameLogic/PickupSystem/Pickup.h | 35 +++++++++++++++++++ .../GameLogic/PickupSystem/PickupHealth.cpp | 18 ++++++++++ .../GameLogic/PickupSystem/PickupHealth.h | 27 ++++++++++++++ .../GameLogic/PickupSystem/PickupSystem.cpp | 22 ++++++++++++ .../GameLogic/PickupSystem/PickupSystem.h | 30 ++++++++++++++++ Code/Game/LevelLoader/ObjectDefines.h | 1 + 9 files changed, 197 insertions(+) create mode 100644 Code/Game/GameLogic/PickupSystem/Pickup.cpp create mode 100644 Code/Game/GameLogic/PickupSystem/Pickup.h create mode 100644 Code/Game/GameLogic/PickupSystem/PickupHealth.cpp create mode 100644 Code/Game/GameLogic/PickupSystem/PickupHealth.h create mode 100644 Code/Game/GameLogic/PickupSystem/PickupSystem.cpp create mode 100644 Code/Game/GameLogic/PickupSystem/PickupSystem.h diff --git a/Code/Game/GameLogic/CollisionManager.cpp b/Code/Game/GameLogic/CollisionManager.cpp index 1ab9afbd..a5ae6380 100644 --- a/Code/Game/GameLogic/CollisionManager.cpp +++ b/Code/Game/GameLogic/CollisionManager.cpp @@ -10,6 +10,8 @@ #include "Portal.h" #include "ExplosiveCrate.h" +#include "PickupSystem/PickupHealth.h" + using namespace Oyster; using namespace GameLogic; @@ -281,4 +283,31 @@ using namespace GameLogic; } + } + + //General collision collision for pickups + //It calls the collision function defined in each pickup. + void Pickup::PickupCollision(Oyster::Physics::ICustomBody* objA, Oyster::Physics::ICustomBody* objB, Oyster::Math::Float kineticEnergyLoss) + { + //Check if player is a player. + Object* a = (Object*)objA->GetCustomTag(); + Object* b = (Object*)objB->GetCustomTag(); + + if(!a) + return; + if(!b) + return; + + if(b->GetObjectType() == ObjectSpecialType_Player) + { + ((Pickup*)a)->OnCollision((Player*)(b)); + } + else if(a->GetObjectType() != ObjectSpecialType_Player) + { + //One of the objects are not a player. + //Do nothing. + return; + } + + ((Pickup*)b)->OnCollision((Player*)a); } \ No newline at end of file diff --git a/Code/Game/GameLogic/GameLogic.vcxproj b/Code/Game/GameLogic/GameLogic.vcxproj index 52b7722b..08a932d2 100644 --- a/Code/Game/GameLogic/GameLogic.vcxproj +++ b/Code/Game/GameLogic/GameLogic.vcxproj @@ -173,6 +173,9 @@ + + + @@ -194,6 +197,9 @@ + + + diff --git a/Code/Game/GameLogic/PickupSystem/Pickup.cpp b/Code/Game/GameLogic/PickupSystem/Pickup.cpp new file mode 100644 index 00000000..84b95e87 --- /dev/null +++ b/Code/Game/GameLogic/PickupSystem/Pickup.cpp @@ -0,0 +1,29 @@ +#include "Pickup.h" + +using namespace GameLogic; + +Pickup::Pickup(Oyster::Physics::ICustomBody *rigidBody, EventOnCollision collisionFunc, ObjectSpecialType type, int objectID, Oyster::Math::Float spawnTime) + : StaticObject(rigidBody, collisionFunc, type, objectID) +{ + this->active = true; + this->spawnTime = spawnTime; +} + +Pickup::~Pickup() +{} + +void Pickup::Update() +{ + if(!active) + { + if(timer.getElapsedSeconds() >= spawnTime) + { + active = true; + } + } +} + +bool Pickup::IsActive() +{ + return active; +} \ No newline at end of file diff --git a/Code/Game/GameLogic/PickupSystem/Pickup.h b/Code/Game/GameLogic/PickupSystem/Pickup.h new file mode 100644 index 00000000..e48017fc --- /dev/null +++ b/Code/Game/GameLogic/PickupSystem/Pickup.h @@ -0,0 +1,35 @@ +#ifndef PICKUP_H +#define PICKUP_H + +#include "../StaticObject.h" +#include "../Player.h" +#include "WinTimer.h" + +typedef void (*EventOnCollision)(Oyster::Physics::ICustomBody *proto,Oyster::Physics::ICustomBody *deuter,Oyster::Math::Float kineticEnergyLoss); + +namespace GameLogic +{ + class Pickup : public StaticObject + { + public: + Pickup(Oyster::Physics::ICustomBody *rigidBody, EventOnCollision collisionFunc, ObjectSpecialType type, int objectID, Oyster::Math::Float spawnTime); + virtual ~Pickup(); + + virtual void Update(); + + bool IsActive(); + + virtual void OnCollision(Player *player) = 0; + + static void PickupCollision(Oyster::Physics::ICustomBody *rigidBodyCrate, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss); + + protected: + bool active; + + Utility::WinTimer timer; + double spawnTime; + + }; +} + +#endif \ No newline at end of file diff --git a/Code/Game/GameLogic/PickupSystem/PickupHealth.cpp b/Code/Game/GameLogic/PickupSystem/PickupHealth.cpp new file mode 100644 index 00000000..56cbef1e --- /dev/null +++ b/Code/Game/GameLogic/PickupSystem/PickupHealth.cpp @@ -0,0 +1,18 @@ +#include "PickupHealth.h" + +using namespace GameLogic; + +PickupHealth::PickupHealth(Oyster::Physics::ICustomBody *rigidBody, ObjectSpecialType type, int objectID, Oyster::Math::Float spawnTime, Oyster::Math::Float healthValue) + : Pickup(rigidBody, Pickup::PickupCollision, type, objectID, spawnTime) +{ + this->hpValue = healthValue; +} + +PickupHealth::~PickupHealth() +{} + +void PickupHealth::OnCollision(Player *player) +{ + timer.reset(); + player->DamageLife(-hpValue); +} \ No newline at end of file diff --git a/Code/Game/GameLogic/PickupSystem/PickupHealth.h b/Code/Game/GameLogic/PickupSystem/PickupHealth.h new file mode 100644 index 00000000..5d5db809 --- /dev/null +++ b/Code/Game/GameLogic/PickupSystem/PickupHealth.h @@ -0,0 +1,27 @@ +////////////////////////////////////// +// Created by Pontus Fransson 2014 // +////////////////////////////////////// + +#ifndef PICKUP_HEALTH_H +#define PICKUP_HEALTH_H + +#include "Pickup.h" + +namespace GameLogic +{ + class PickupHealth : public Pickup + { + public: + PickupHealth(Oyster::Physics::ICustomBody *rigidBody, ObjectSpecialType type, int objectID, Oyster::Math::Float spawnTime, Oyster::Math::Float HealthValue); + virtual ~PickupHealth(); + + + void OnCollision(Player *player); + + protected: + int hpValue; + + }; +} + +#endif \ No newline at end of file diff --git a/Code/Game/GameLogic/PickupSystem/PickupSystem.cpp b/Code/Game/GameLogic/PickupSystem/PickupSystem.cpp new file mode 100644 index 00000000..0f60ddc9 --- /dev/null +++ b/Code/Game/GameLogic/PickupSystem/PickupSystem.cpp @@ -0,0 +1,22 @@ +#include "PickupSystem.h" + +using namespace GameLogic; + +PickupSystem::PickupSystem() +{} + +PickupSystem::~PickupSystem() +{} + +void PickupSystem::CreatePickup(Pickup* pickup) +{ + pickups.push_back(pickup); +} + +void PickupSystem::Update() +{ + for(int i = 0; i < pickups.size(); i++) + { + pickups.at(i)->Update(); + } +} \ No newline at end of file diff --git a/Code/Game/GameLogic/PickupSystem/PickupSystem.h b/Code/Game/GameLogic/PickupSystem/PickupSystem.h new file mode 100644 index 00000000..4bd1e69e --- /dev/null +++ b/Code/Game/GameLogic/PickupSystem/PickupSystem.h @@ -0,0 +1,30 @@ +////////////////////////////////////// +// Created by Pontus Fransson 2014 // +////////////////////////////////////// + +#ifndef PICKUP_SYSTEM_H +#define PICKUP_SYSTEM_H + +#include + +#include "Pickup.h" + +namespace GameLogic +{ + class PickupSystem + { + public: + PickupSystem(); + ~PickupSystem(); + + void CreatePickup(Pickup* pickup); + + void Update(); + + private: + std::vector> pickups; + + }; +} + +#endif \ No newline at end of file diff --git a/Code/Game/LevelLoader/ObjectDefines.h b/Code/Game/LevelLoader/ObjectDefines.h index 918fb4e6..151bf27c 100644 --- a/Code/Game/LevelLoader/ObjectDefines.h +++ b/Code/Game/LevelLoader/ObjectDefines.h @@ -42,6 +42,7 @@ namespace GameLogic ObjectSpecialType_Player, ObjectSpecialType_Generic, + ObjectSpecialType_PickupHealth, ObjectSpecialType_Count, ObjectSpecialType_Unknown = -1 From d56d1d75694da7369481e499132b98b2beb6fe8a Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Tue, 25 Feb 2014 16:07:50 +0100 Subject: [PATCH 21/25] Fixed error with reading lights from level format. --- Code/Game/LevelLoader/ParseFunctions.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Code/Game/LevelLoader/ParseFunctions.cpp b/Code/Game/LevelLoader/ParseFunctions.cpp index ac361c46..060180a2 100644 --- a/Code/Game/LevelLoader/ParseFunctions.cpp +++ b/Code/Game/LevelLoader/ParseFunctions.cpp @@ -23,9 +23,9 @@ namespace GameLogic void ParseLight(char* buffer, BasicLight& header, int& size) { int start = 0; - memcpy(&header.typeID, &buffer[start], 40); - start += 40; - /* + memcpy(&header.typeID, &buffer[start], 4); + start += 4; + memcpy(&header.lightType, &buffer[start], 4); start += 4; @@ -39,7 +39,7 @@ namespace GameLogic start += 4; memcpy(&header.intensity, &buffer[start], 4); - start += 4;*/ + start += 4; size += start; From f2bb50804c8b39fd976f590a70d836320dbeb06d Mon Sep 17 00:00:00 2001 From: Linda Andersson Date: Tue, 25 Feb 2014 16:08:45 +0100 Subject: [PATCH 22/25] Play action animation --- .../GameClient/GameClientState/C_Object.cpp | 5 +- .../GameClient/GameClientState/C_Object.h | 2 +- .../GameClient/GameClientState/GameState.cpp | 198 +++++++++++++++--- Code/Game/GameLogic/Level.h | 1 - Code/Game/GameLogic/Player.cpp | 28 ++- Code/Game/GameProtocols/ObjectProtocols.h | 12 +- 6 files changed, 208 insertions(+), 38 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/C_Object.cpp b/Code/Game/GameClient/GameClientState/C_Object.cpp index 67146770..b168b92c 100644 --- a/Code/Game/GameClient/GameClientState/C_Object.cpp +++ b/Code/Game/GameClient/GameClientState/C_Object.cpp @@ -123,7 +123,10 @@ void C_Object::SetGlowTint(Oyster::Math::Float3 tint) model->GlowTint = tint; } - +void C_Object::SetVisible(bool visible) +{ + model->Visible = visible; +} //////////////////////////////////////////////// // RB DEBUG diff --git a/Code/Game/GameClient/GameClientState/C_Object.h b/Code/Game/GameClient/GameClientState/C_Object.h index fd118068..1a8f7517 100644 --- a/Code/Game/GameClient/GameClientState/C_Object.h +++ b/Code/Game/GameClient/GameClientState/C_Object.h @@ -72,7 +72,7 @@ namespace DanBias void SetTint(Oyster::Math::Float3); void SetGlowTint(Oyster::Math::Float3); - + void SetVisible(bool visible); // RB DEBUG void updateRBWorld(); diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 37dda789..9597d0ef 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -12,6 +12,7 @@ #include "GamingUI.h" #include "RespawnUI.h" #include "StatsUI.h" +#include using namespace ::DanBias::Client; using namespace ::Oyster; @@ -131,7 +132,7 @@ void GameState::InitiatePlayer( int id, const std::string &modelName, const floa p->InitRB( RBData ); // !RB DEBUG // start with runing animation - p->playAnimation( L"run_forwards", true ); + p->playAnimation( L"idle", true ); (this->privData->players)[id] = p; @@ -420,15 +421,59 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState switch(ID) { - case protocol_Gameplay_ObjectPickup: break; /** @todo TODO: implement */ + case protocol_Gameplay_ObjectPickup: + { + Protocol_ObjectPickup decoded(data); + decoded.object_ID; + C_Object *object; + object = (this->privData->players)[decoded.object_ID]; + if( !object) + { + // if it is not a player + object = (*this->privData->dynamicObjects)[decoded.object_ID]; + } + + if( object ) + { + if( this->privData->myId == decoded.object_ID ) + { + // I picked up the pickUp! + } + + if (decoded.pickup_ID == GameLogic::PickupType::PickupType_Health) + { + // object->PickupHealth(); + } + else if (decoded.pickup_ID == GameLogic::PickupType::PickupType_SpeedBoost) + { + // object->PickupSpeed(); + } + } + decoded.pickup_ID; + + + } + return GameClientState::event_processed; case protocol_Gameplay_ObjectDamage: { Protocol_ObjectDamage decoded(data); - if( this->privData->myId == decoded.object_ID ) + C_Object *object; + object = (this->privData->players)[decoded.object_ID]; + if( !object) { - if(currGameUI == gameUI) + // if it is not a player + object = (*this->privData->dynamicObjects)[decoded.object_ID]; + } + + if( object ) + { + if( this->privData->myId == decoded.object_ID ) { - ((GamingUI*)currGameUI)->SetHPtext(std::to_wstring(decoded.healthLost)); + if(currGameUI == gameUI) + { + // set my HP + ((GamingUI*)currGameUI)->SetHPtext(std::to_wstring(decoded.healthLost)); + } } } } @@ -441,38 +486,72 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState { Protocol_ObjectPosition decoded(data); - // if is this player. Remember to change camera - if( this->privData->myId == decoded.object_ID ) - this->privData->camera.SetPosition( decoded.position ); + C_Object *object; + object = (this->privData->players)[decoded.object_ID]; + if( !object) + { + // if it is not a player + object = (*this->privData->dynamicObjects)[decoded.object_ID]; + } - (*this->privData->dynamicObjects)[decoded.object_ID]->setPos( decoded.position ); - // RB DEBUG - (*this->privData->dynamicObjects)[decoded.object_ID]->setRBPos ( decoded.position ); - // !RB DEBUG + if( object ) + { + if( this->privData->myId == decoded.object_ID ) + { + this->privData->camera.SetPosition( decoded.position ); + } + + object->setPos( decoded.position ); + // RB DEBUG + object->setRBPos ( decoded.position ); + // !RB DEBUG + } } return GameClientState::event_processed; case protocol_Gameplay_ObjectScale: { Protocol_ObjectScale decoded(data); - (*this->privData->dynamicObjects)[decoded.object_ID]->setScale( decoded.scale ); - // RB DEBUG - (*this->privData->dynamicObjects)[decoded.object_ID]->setRBScale ( decoded.scale ); - // !RB DEBUG + C_Object *object; + object = (this->privData->players)[decoded.object_ID]; + if( !object) + { + // if it is not a player + object = (*this->privData->dynamicObjects)[decoded.object_ID]; + } + + if( object ) + { + object->setScale( decoded.scale ); + // RB DEBUG + object->setRBScale ( decoded.scale ); + // !RB DEBUG + } } return GameClientState::event_processed; case protocol_Gameplay_ObjectRotation: { Protocol_ObjectRotation decoded(data); Quaternion rotation = Quaternion( Float3(decoded.rotationQ), decoded.rotationQ[3] ); + C_Object *object; + object = (this->privData->players)[decoded.object_ID]; + if( !object) + { + // if it is not a player + object = (*this->privData->dynamicObjects)[decoded.object_ID]; + } - // if is this player. Remember to change camera - if( this->privData->myId == decoded.object_ID ) - this->privData->camera.SetRotation( rotation ); + if( object ) + { + if( this->privData->myId == decoded.object_ID ) + { + this->privData->camera.SetRotation( rotation ); + } - (*this->privData->dynamicObjects)[decoded.object_ID]->setRot( rotation ); - // RB DEBUG - (*this->privData->dynamicObjects)[decoded.object_ID]->setRBRot ( rotation ); - // !RB DEBUG + object->setRot( rotation ); + // RB DEBUG + object->setRBRot( rotation ); + // !RB DEBUG + } } return GameClientState::event_processed; case protocol_Gameplay_ObjectPositionRotation: @@ -506,17 +585,46 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState } } return GameClientState::event_processed; - case protocol_Gameplay_ObjectEnabled: break; /** @todo TODO: implement */ + case protocol_Gameplay_ObjectEnabled: + { + Protocol_ObjectEnable decoded(data); + C_Object *object; + object = (this->privData->players)[decoded.objectID]; + if( !object) + { + // if it is not a player + object = (*this->privData->dynamicObjects)[decoded.objectID]; + } + + if( object ) + { + object->SetVisible(true); + } + } + return GameClientState::event_processed; case protocol_Gameplay_ObjectDisabled: { Protocol_ObjectDisable decoded(data); + C_Object *object; + object = (this->privData->players)[decoded.objectID]; + if( !object) + { + // if it is not a player + object = (*this->privData->dynamicObjects)[decoded.objectID]; + } - auto object = this->privData->dynamicObjects->find( decoded.objectID ); + if( object ) + { + object->SetVisible(false); + } + + /*auto object = this->privData->dynamicObjects->find( decoded.objectID ); if( object != this->privData->dynamicObjects->end() ) { - object->second = nullptr; - this->privData->dynamicObjects->erase( object ); - } + object->second = nullptr; + this->privData->dynamicObjects->erase( object ); + }*/ + } return GameClientState::event_processed; case protocol_Gameplay_ObjectCreate: @@ -613,6 +721,40 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState } } return GameClientState::event_processed; + case protocol_Gameplay_ObjectAction: + { + Protocol_ObjectAction decoded(data); + + C_Player *player; + player = (this->privData->players)[decoded.objectID]; + + if( player ) + { + if( this->privData->myId == decoded.objectID ) + { + // my player animation + //} + //else + //{ + // HACK for now animate my char + switch (decoded.animationID) + { + case GameLogic::PlayerAction::PlayerAction_Walk: + player->playAnimation(L"run_forwards", true); + break; + case GameLogic::PlayerAction::PlayerAction_Jump: + player->playAnimation(L"movement", true); + break; + case GameLogic::PlayerAction::PlayerAction_Idle: + player->playAnimation(L"idle", true); + break; + default: + break; + } + } + } + } + return GameClientState::event_processed; default: break; } } diff --git a/Code/Game/GameLogic/Level.h b/Code/Game/GameLogic/Level.h index 9fb3dbad..f8d41ba9 100644 --- a/Code/Game/GameLogic/Level.h +++ b/Code/Game/GameLogic/Level.h @@ -80,7 +80,6 @@ namespace GameLogic private: Utility::DynamicMemory::DynamicArray> playerObjects; - Utility::DynamicMemory::DynamicArray> deadPlayerObjects; TeamManager teamManager; Utility::DynamicMemory::DynamicArray> staticObjects; Utility::DynamicMemory::DynamicArray> dynamicObjects; diff --git a/Code/Game/GameLogic/Player.cpp b/Code/Game/GameLogic/Player.cpp index 0ce95948..ddacf25b 100644 --- a/Code/Game/GameLogic/Player.cpp +++ b/Code/Game/GameLogic/Player.cpp @@ -136,7 +136,16 @@ void Player::BeginFrame() rightVelocity *= Oyster::Math::Float3(0.2f*fabs(rightDir.x), 0.2f*fabs(rightDir.y), 0.2f*fabs(rightDir.z)); } } - + + if(walkDirection == Oyster::Math::Float3::null) + { + if(this->playerState != PLAYER_STATE::PLAYER_STATE_JUMPING) + { + if(this->playerState != PLAYER_STATE::PLAYER_STATE_IDLE) + this->gameInstance->onPlayerActionEventFnc( this, PlayerAction::PlayerAction_Idle); + this->playerState = PLAYER_STATE::PLAYER_STATE_IDLE; + } + } // Walk if walkdirection is something if(walkDirection != Oyster::Math::Float3::null) { @@ -166,6 +175,12 @@ void Player::BeginFrame() rightVelocity += walkDirection*Oyster::Math::Float3(fabs(rightDir.x), fabs(rightDir.y), fabs(rightDir.z)) * walkSpeed*0.2f; } } + if(this->playerState != PLAYER_STATE::PLAYER_STATE_JUMPING) + { + if(this->playerState != PLAYER_STATE::PLAYER_STATE_WALKING) + this->gameInstance->onPlayerActionEventFnc( this, PlayerAction::PlayerAction_Walk); + this->playerState = PLAYER_STATE::PLAYER_STATE_WALKING; + } } // Adjust velocities so no squaring occurs @@ -183,9 +198,20 @@ void Player::BeginFrame() { Oyster::Math::Float3 up = this->rigidBody->GetState().centerPos.GetNormalized(); this->rigidBody->ApplyImpulse(up*this->rigidBody->GetState().mass * 20); + + if(this->playerState != PLAYER_STATE::PLAYER_STATE_JUMPING) + this->gameInstance->onPlayerActionEventFnc( this, PlayerAction::PlayerAction_Jump); this->playerState = PLAYER_STATE::PLAYER_STATE_JUMPING; } } + else + { + if(this->playerState == PLAYER_STATE::PLAYER_STATE_JUMPING) + { + this->gameInstance->onPlayerActionEventFnc( this, PlayerAction::PlayerAction_Idle); + this->playerState = PLAYER_STATE::PLAYER_STATE_IDLE; + } + } } } diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index 1ffc30ad..5b0408fa 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -948,29 +948,29 @@ namespace GameLogic struct Protocol_ObjectAction :public Oyster::Network::CustomProtocolObject { short objectID; - float animationID; + int animationID; Protocol_ObjectAction() { this->protocol[0].value = protocol_Gameplay_ObjectAction; this->protocol[0].type = Oyster::Network::NetAttributeType_Short; this->protocol[1].type = Oyster::Network::NetAttributeType_Short; - this->protocol[2].type = Oyster::Network::NetAttributeType_Float; + this->protocol[2].type = Oyster::Network::NetAttributeType_Int; - objectID = 0; + objectID = -1; animationID = -1; } Protocol_ObjectAction(Oyster::Network::CustomNetProtocol& p) { objectID = p[1].value.netShort; - animationID = p[2].value.netFloat; + animationID = p[2].value.netInt; } - Protocol_ObjectAction(float animID, int id) + Protocol_ObjectAction( int id, float animID) { this->protocol[0].value = protocol_Gameplay_ObjectAction; this->protocol[0].type = Oyster::Network::NetAttributeType_Short; this->protocol[1].type = Oyster::Network::NetAttributeType_Short; - this->protocol[2].type = Oyster::Network::NetAttributeType_Float; + this->protocol[2].type = Oyster::Network::NetAttributeType_Int; objectID = id; animationID = animID; From 11eda5065e09d9f5b114cf13ba67506943ab35ee Mon Sep 17 00:00:00 2001 From: Pontus Fransson Date: Tue, 25 Feb 2014 16:10:02 +0100 Subject: [PATCH 23/25] Reading hp pickups from levelformat. Updating pickups. --- Code/Game/GameLogic/Level.cpp | 16 +++++++++++++--- Code/Game/GameLogic/Level.h | 4 ++++ Code/Game/GameLogic/PickupSystem/Pickup.cpp | 3 +++ Code/Game/LevelLoader/LevelParser.cpp | 15 +++++++++++++++ Code/Game/LevelLoader/ObjectDefines.h | 6 +++++- 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 439f3ac8..0f0ab632 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -131,6 +131,11 @@ Object* Level::CreateGameObj(ObjectHeader* obj, ICustomBody* rigidBody) gameObj = new StaticObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); } break; + case ObjectSpecialType_PickupHealth: + { + gameObj = new PickupHealth(rigidBody, obj->specialTypeID, objID, ((PickupHealthAttributes*)obj)->spawnTime, ((PickupHealthAttributes*)obj)->healthValue); + } + break; default: { gameObj = new StaticObject(rigidBody, Object::DefaultOnCollision, (ObjectSpecialType)obj->specialTypeID, objID); @@ -216,7 +221,6 @@ bool Level::InitiateLevel(std::wstring levelPath) std::string convertedLevelPath = converterX.to_bytes(levelPath); objects = ll.LoadLevel(convertedLevelPath); - if(objects.size() == 0) return false; @@ -264,7 +268,12 @@ bool Level::InitiateLevel(std::wstring levelPath) { // create game object Object* staticGameObj = CreateGameObj(staticObjData, rigidBody_Static); - if(staticGameObj != NULL) + + if(staticObjData->specialTypeID == ObjectSpecialType_PickupHealth) + { + this->pickupSystem.CreatePickup((PickupHealth*)staticGameObj); + } + else if(staticGameObj != NULL) { this->staticObjects.Push((StaticObject*)staticGameObj); } @@ -321,6 +330,7 @@ bool Level::InitiateLevel(std::wstring levelPath) break; } } + return true; } bool Level::InitiateLevel(float radius) @@ -440,7 +450,7 @@ void Level::Update(float deltaTime) } } - + this->pickupSystem.Update(); } int Level::getNrOfDynamicObj() { diff --git a/Code/Game/GameLogic/Level.h b/Code/Game/GameLogic/Level.h index 9fb3dbad..cf7ab6d8 100644 --- a/Code/Game/GameLogic/Level.h +++ b/Code/Game/GameLogic/Level.h @@ -16,6 +16,9 @@ #include "DynamicArray.h" #include "LevelLoader.h" +#include "PickupSystem\PickupSystem.h" +#include "PickupSystem\PickupHealth.h" + const int DEATH_TIMER = 5; namespace GameLogic { @@ -89,6 +92,7 @@ namespace GameLogic StaticObject *levelObj; int objID; Utility::DynamicMemory::DynamicArray spawnPoints; + PickupSystem pickupSystem; }; diff --git a/Code/Game/GameLogic/PickupSystem/Pickup.cpp b/Code/Game/GameLogic/PickupSystem/Pickup.cpp index 84b95e87..73a319f8 100644 --- a/Code/Game/GameLogic/PickupSystem/Pickup.cpp +++ b/Code/Game/GameLogic/PickupSystem/Pickup.cpp @@ -1,4 +1,5 @@ #include "Pickup.h" +#include "../Game.h" using namespace GameLogic; @@ -7,6 +8,7 @@ Pickup::Pickup(Oyster::Physics::ICustomBody *rigidBody, EventOnCollision collisi { this->active = true; this->spawnTime = spawnTime; + timer.reset(); } Pickup::~Pickup() @@ -19,6 +21,7 @@ void Pickup::Update() if(timer.getElapsedSeconds() >= spawnTime) { active = true; + ((Game*)&Game::Instance())->onEnableFnc(this); } } } diff --git a/Code/Game/LevelLoader/LevelParser.cpp b/Code/Game/LevelLoader/LevelParser.cpp index fe349988..680b0358 100644 --- a/Code/Game/LevelLoader/LevelParser.cpp +++ b/Code/Game/LevelLoader/LevelParser.cpp @@ -156,6 +156,21 @@ std::vector> LevelParser::Parse(std::string filen objects.push_back(header); break; } + + case ObjectSpecialType_PickupHealth: + { + PickupHealthAttributes* header = new PickupHealthAttributes; + ParseObject(&buffer[counter], *header, counter, loadCgf); + + ParseObject(&buffer[counter], &header->spawnTime, 4); + counter += 4; + + ParseObject(&buffer[counter], &header->healthValue, 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 diff --git a/Code/Game/LevelLoader/ObjectDefines.h b/Code/Game/LevelLoader/ObjectDefines.h index 9ce7d86a..aadc3382 100644 --- a/Code/Game/LevelLoader/ObjectDefines.h +++ b/Code/Game/LevelLoader/ObjectDefines.h @@ -259,7 +259,11 @@ namespace GameLogic float skySize; }; - + struct PickupHealthAttributes : public ObjectHeader + { + float spawnTime; + float healthValue; + }; From 638f2f624180af36c382f3be1f88aac38bbb5427 Mon Sep 17 00:00:00 2001 From: Linda Andersson Date: Tue, 25 Feb 2014 16:26:37 +0100 Subject: [PATCH 24/25] Addded objectDelete protocol. Enable/ disable will be used for visibility on client --- .../GameClient/GameClientState/GameState.cpp | 40 ++--- Code/Game/GameProtocols/ObjectProtocols.h | 141 +++++++++++------- .../GameProtocols/ProtocolIdentificationID.h | 19 +-- .../Implementation/GameSession_Gameplay.cpp | 4 +- 4 files changed, 116 insertions(+), 88 deletions(-) diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 9597d0ef..7e8a0ee7 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -458,20 +458,21 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState { Protocol_ObjectDamage decoded(data); C_Object *object; - object = (this->privData->players)[decoded.object_ID]; + object = (this->privData->players)[decoded.objectID]; if( !object) { // if it is not a player - object = (*this->privData->dynamicObjects)[decoded.object_ID]; + object = (*this->privData->dynamicObjects)[decoded.objectID]; } if( object ) { - if( this->privData->myId == decoded.object_ID ) + if( this->privData->myId == decoded.objectID ) { + // show that you took dmg if(currGameUI == gameUI) { - // set my HP + // set given players HP ((GamingUI*)currGameUI)->SetHPtext(std::to_wstring(decoded.healthLost)); } } @@ -479,7 +480,8 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState } return GameClientState::event_processed; case protocol_Gameplay_ObjectHealthStatus: - { + { + // don't know if needed } return GameClientState::event_processed; case protocol_Gameplay_ObjectPosition: @@ -487,16 +489,16 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState Protocol_ObjectPosition decoded(data); C_Object *object; - object = (this->privData->players)[decoded.object_ID]; + object = (this->privData->players)[decoded.objectID]; if( !object) { // if it is not a player - object = (*this->privData->dynamicObjects)[decoded.object_ID]; + object = (*this->privData->dynamicObjects)[decoded.objectID]; } if( object ) { - if( this->privData->myId == decoded.object_ID ) + if( this->privData->myId == decoded.objectID ) { this->privData->camera.SetPosition( decoded.position ); } @@ -512,11 +514,11 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState { Protocol_ObjectScale decoded(data); C_Object *object; - object = (this->privData->players)[decoded.object_ID]; + object = (this->privData->players)[decoded.objectID]; if( !object) { // if it is not a player - object = (*this->privData->dynamicObjects)[decoded.object_ID]; + object = (*this->privData->dynamicObjects)[decoded.objectID]; } if( object ) @@ -533,16 +535,16 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState Protocol_ObjectRotation decoded(data); Quaternion rotation = Quaternion( Float3(decoded.rotationQ), decoded.rotationQ[3] ); C_Object *object; - object = (this->privData->players)[decoded.object_ID]; + object = (this->privData->players)[decoded.objectID]; if( !object) { // if it is not a player - object = (*this->privData->dynamicObjects)[decoded.object_ID]; + object = (*this->privData->dynamicObjects)[decoded.objectID]; } if( object ) { - if( this->privData->myId == decoded.object_ID ) + if( this->privData->myId == decoded.objectID ) { this->privData->camera.SetRotation( rotation ); } @@ -560,16 +562,16 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState Float3 position = decoded.position; Quaternion rotation = Quaternion( Float3(decoded.rotationQ), decoded.rotationQ[3] ); C_Object *object; - object = (this->privData->players)[decoded.object_ID]; + object = (this->privData->players)[decoded.objectID]; if( !object) { // if it is not a player - object = (*this->privData->dynamicObjects)[decoded.object_ID]; + object = (*this->privData->dynamicObjects)[decoded.objectID]; } if( object ) { - if( this->privData->myId == decoded.object_ID ) + if( this->privData->myId == decoded.objectID ) { this->privData->camera.SetPosition( position ); this->privData->camera.SetRotation( rotation ); @@ -638,7 +640,7 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState modelData.rotation = Quaternion( Float3(decoded.position), decoded.rotationQ[3] ); modelData.scale = Float3( decoded.scale ); modelData.visible = true; - modelData.id = decoded.object_ID; + modelData.id = decoded.objectID; ::Utility::String::StringToWstring( decoded.name, modelData.modelPath ); } @@ -653,14 +655,14 @@ const GameClientState::NetEvent & GameState::DataRecieved( const GameClientState object->InitRB( RBData ); // !RB DEBUG - (*this->privData->dynamicObjects)[decoded.object_ID] = object; + (*this->privData->dynamicObjects)[decoded.objectID] = object; } return GameClientState::event_processed; case protocol_Gameplay_ObjectCreatePlayer: { Protocol_ObjectCreatePlayer decoded(data); - this->InitiatePlayer( decoded.object_ID, decoded.meshName, decoded.position, decoded.rotationQ, decoded.scale, decoded.owner ); + this->InitiatePlayer( decoded.objectID, decoded.meshName, decoded.position, decoded.rotationQ, decoded.scale, decoded.owner ); } return GameClientState::event_processed; case protocol_Gameplay_ObjectJoinTeam: break; /** @todo TODO: implement */ diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index 5b0408fa..48fa71f7 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -59,7 +59,7 @@ namespace GameLogic //#define protocol_Gameplay_ObjectDamage 351 struct Protocol_ObjectDamage :public Oyster::Network::CustomProtocolObject { - int object_ID; + int objectID; float healthLost; //Precentage% Protocol_ObjectDamage() @@ -70,12 +70,12 @@ namespace GameLogic this->protocol[1].type = Oyster::Network::NetAttributeType_Int; this->protocol[2].type = Oyster::Network::NetAttributeType_Float; - object_ID = -1; + objectID = -1; healthLost = 0.0f; } Protocol_ObjectDamage(Oyster::Network::CustomNetProtocol& p) { - this->object_ID = p[1].value.netInt; + this->objectID = p[1].value.netInt; this->healthLost = p[2].value.netFloat; } Protocol_ObjectDamage(int id, float hp) @@ -86,12 +86,12 @@ namespace GameLogic this->protocol[1].type = Oyster::Network::NetAttributeType_Int; this->protocol[2].type = Oyster::Network::NetAttributeType_Float; - object_ID = id; + objectID = id; healthLost = hp; } Oyster::Network::CustomNetProtocol GetProtocol() override { - this->protocol[1].value = object_ID; + this->protocol[1].value = objectID; this->protocol[2].value = healthLost; return protocol; } @@ -103,8 +103,8 @@ namespace GameLogic //#define protocol_Gameplay_ObjectHealthStatus 352 struct Protocol_ObjectHealthStatus :public Oyster::Network::CustomProtocolObject { + int objectID; float currentHealth; - int id; Protocol_ObjectHealthStatus() { @@ -112,7 +112,7 @@ namespace GameLogic this->protocol[0].value.netShort = protocol_Gameplay_ObjectHealthStatus; this->protocol[1].type = Oyster::Network::NetAttributeType_Int; this->protocol[2].type = Oyster::Network::NetAttributeType_Float; - this->id = 0; + this->objectID = -1; this->currentHealth = 0.0f; } Protocol_ObjectHealthStatus(int id, float health) @@ -121,16 +121,16 @@ namespace GameLogic this->protocol[0].value.netShort = protocol_Gameplay_ObjectHealthStatus; this->protocol[1].type = Oyster::Network::NetAttributeType_Int; this->protocol[2].type = Oyster::Network::NetAttributeType_Float; - this->id = id; this->currentHealth = health; + this->objectID = id; this->currentHealth = health; } Protocol_ObjectHealthStatus(Oyster::Network::CustomNetProtocol& p) { - this->id = p[1].value.netInt; + this->objectID = p[1].value.netInt; this->currentHealth = p[2].value.netFloat; } Oyster::Network::CustomNetProtocol GetProtocol() override { - this->protocol[1].value = this->id; + this->protocol[1].value = this->objectID; this->protocol[2].value = this->currentHealth; return protocol; @@ -143,7 +143,7 @@ namespace GameLogic //#define protocol_Gameplay_ObjectPosition 353 struct Protocol_ObjectPosition :public Oyster::Network::CustomProtocolObject { - short object_ID; + short objectID; float position[3]; Protocol_ObjectPosition() @@ -155,12 +155,12 @@ namespace GameLogic this->protocol[3].type = Oyster::Network::NetAttributeType_Float; this->protocol[4].type = Oyster::Network::NetAttributeType_Float; - object_ID = 0; + objectID = -1; memset(&position[0], 0, sizeof(float) * 3); } Protocol_ObjectPosition(Oyster::Network::CustomNetProtocol& p) { - object_ID = p[1].value.netShort; + objectID = p[1].value.netShort; position[0] = p[2].value.netFloat; position[1] = p[3].value.netFloat; position[2] = p[4].value.netFloat; @@ -174,12 +174,12 @@ namespace GameLogic this->protocol[3].type = Oyster::Network::NetAttributeType_Float; this->protocol[4].type = Oyster::Network::NetAttributeType_Float; - object_ID = id; + objectID = id; memcpy(&position[0], &v[0], sizeof(float) * 3); } Oyster::Network::CustomNetProtocol GetProtocol() override { - this->protocol[1].value = object_ID; + this->protocol[1].value = objectID; this->protocol[2].value = position[0]; this->protocol[3].value = position[1]; this->protocol[4].value = position[2]; @@ -193,7 +193,7 @@ namespace GameLogic //#define protocol_Gameplay_ObjectScale 354 struct Protocol_ObjectScale :public Oyster::Network::CustomProtocolObject { - short object_ID; + short objectID; float scale[3]; Protocol_ObjectScale() @@ -205,12 +205,12 @@ namespace GameLogic this->protocol[3].type = Oyster::Network::NetAttributeType_Float; this->protocol[4].type = Oyster::Network::NetAttributeType_Float; - object_ID = 0; + objectID = -1; memset(&scale[0], 0, sizeof(float) * 3); } Protocol_ObjectScale(Oyster::Network::CustomNetProtocol& p) { - object_ID = p[1].value.netShort; + objectID = p[1].value.netShort; scale[0] = p[2].value.netFloat; scale[1] = p[3].value.netFloat; scale[2] = p[4].value.netFloat; @@ -224,12 +224,12 @@ namespace GameLogic this->protocol[3].type = Oyster::Network::NetAttributeType_Float; this->protocol[4].type = Oyster::Network::NetAttributeType_Float; - object_ID = id; + objectID = id; memcpy(&scale[0], &v[0], sizeof(float) * 3); } Oyster::Network::CustomNetProtocol GetProtocol() override { - this->protocol[1].value = object_ID; + this->protocol[1].value = objectID; this->protocol[2].value = scale[0]; this->protocol[3].value = scale[1]; this->protocol[4].value = scale[2]; @@ -243,7 +243,7 @@ namespace GameLogic //#define protocol_Gameplay_ObjectRotation 355 struct Protocol_ObjectRotation :public Oyster::Network::CustomProtocolObject { - short object_ID; + short objectID; float rotationQ[4]; Protocol_ObjectRotation() @@ -256,12 +256,12 @@ namespace GameLogic this->protocol[4].type = Oyster::Network::NetAttributeType_Float; this->protocol[5].type = Oyster::Network::NetAttributeType_Float; - object_ID = 0; + objectID = -1; memset(&rotationQ[0], 0, sizeof(float) * 4); } Protocol_ObjectRotation(Oyster::Network::CustomNetProtocol& p) { - object_ID = p[1].value.netShort; + objectID = p[1].value.netShort; rotationQ[0] = p[2].value.netFloat; rotationQ[1] = p[3].value.netFloat; rotationQ[2] = p[4].value.netFloat; @@ -277,12 +277,12 @@ namespace GameLogic this->protocol[4].type = Oyster::Network::NetAttributeType_Float; this->protocol[5].type = Oyster::Network::NetAttributeType_Float; - object_ID = id; + objectID = id; memcpy(&rotationQ[0], &v[0], sizeof(float) * 4); } Oyster::Network::CustomNetProtocol GetProtocol() override { - this->protocol[1].value = object_ID; + this->protocol[1].value = objectID; this->protocol[2].value = rotationQ[0]; this->protocol[3].value = rotationQ[1]; this->protocol[4].value = rotationQ[2]; @@ -297,7 +297,7 @@ namespace GameLogic //#define protocol_Gameplay_ObjectEnabled 356 struct Protocol_ObjectPositionRotation :public Oyster::Network::CustomProtocolObject { - short object_ID; + short objectID; float position[3]; float rotationQ[4]; @@ -316,13 +316,13 @@ namespace GameLogic this->protocol[7].type = Oyster::Network::NetAttributeType_Float; this->protocol[8].type = Oyster::Network::NetAttributeType_Float; - this->object_ID = 0; + this->objectID = -1; memset(&this->position[0], 0, sizeof(float) * 3); memset(&this->rotationQ[0], 0, sizeof(float) * 4); } Protocol_ObjectPositionRotation(Oyster::Network::CustomNetProtocol& p) { - this->object_ID = p[1].value.netShort; + this->objectID = p[1].value.netShort; //POSITION this->position[0] = p[2].value.netFloat; this->position[1] = p[3].value.netFloat; @@ -348,13 +348,13 @@ namespace GameLogic this->protocol[7].type = Oyster::Network::NetAttributeType_Float; this->protocol[8].type = Oyster::Network::NetAttributeType_Float; - object_ID = id; + objectID = id; memcpy(&this->position[0], &p[0], sizeof(float) * 3); memcpy(&this->rotationQ[0], &r[0], sizeof(float) * 4); } Oyster::Network::CustomNetProtocol GetProtocol() override { - this->protocol[1].value = this->object_ID; + this->protocol[1].value = this->objectID; this->protocol[2].value = this->position[0]; this->protocol[3].value = this->position[1]; this->protocol[4].value = this->position[2]; @@ -406,35 +406,28 @@ namespace GameLogic struct Protocol_ObjectDisable :public Oyster::Network::CustomProtocolObject { int objectID; - float seconds; Protocol_ObjectDisable() { this->protocol[0].value = protocol_Gameplay_ObjectDisabled; this->protocol[0].type = Oyster::Network::NetAttributeType_Short; this->protocol[1].type = Oyster::Network::NetAttributeType_Int; - this->protocol[2].type = Oyster::Network::NetAttributeType_Float; - this->objectID = 0; - this->seconds = 0.0f; + this->objectID = -1; } - Protocol_ObjectDisable(int objctID, float seconds) + Protocol_ObjectDisable(int objctID) { this->protocol[0].value = protocol_Gameplay_ObjectDisabled; this->protocol[0].type = Oyster::Network::NetAttributeType_Short; this->protocol[1].type = Oyster::Network::NetAttributeType_Int; - this->protocol[2].type = Oyster::Network::NetAttributeType_Float; this->objectID = objctID; - this->seconds = seconds; } Protocol_ObjectDisable(Oyster::Network::CustomNetProtocol& p) { this->objectID = p[1].value.netInt; - this->seconds = p[2].value.netFloat; } Oyster::Network::CustomNetProtocol GetProtocol() override { this->protocol[1].value = this->objectID; - this->protocol[2].value = this->seconds; return protocol; } @@ -446,7 +439,7 @@ namespace GameLogic struct Protocol_ObjectCreate :public Oyster::Network::CustomProtocolObject { //ObjectType type; //ie player, box or whatever - int object_ID; + int objectID; std::string name; float position[3]; float rotationQ[4]; @@ -473,13 +466,13 @@ namespace GameLogic this->protocol[11].type = Oyster::Network::NetAttributeType_Float; this->protocol[12].type = Oyster::Network::NetAttributeType_Float; - this->object_ID = 0; + this->objectID = -1; memset(this->position, 0, sizeof(float) * 3); memset(this->rotationQ, 0, sizeof(float) * 4); } Protocol_ObjectCreate( Oyster::Network::CustomNetProtocol& p ) { - this->object_ID = p[1].value.netInt; + this->objectID = p[1].value.netInt; this->name.assign(p[2].value.netCharPtr); this->position[0] = p[3].value.netFloat; @@ -516,7 +509,7 @@ namespace GameLogic this->protocol[11].type = Oyster::Network::NetAttributeType_Float; this->protocol[12].type = Oyster::Network::NetAttributeType_Float; - object_ID = id; + objectID = id; this->name = path; memcpy(this->position, p, sizeof(float) * 3); @@ -526,7 +519,7 @@ namespace GameLogic Oyster::Network::CustomNetProtocol GetProtocol() override { - this->protocol[1].value = object_ID; + this->protocol[1].value = objectID; this->protocol.Set(2, name); this->protocol[3].value = this->position[0]; this->protocol[4].value = this->position[1]; @@ -546,10 +539,42 @@ namespace GameLogic Oyster::Network::CustomNetProtocol protocol; }; - //#define protocol_Gameplay_ObjectCreatePlayer 360 + //#define protocol_Gameplay_ObjectDelete 360 + struct Protocol_ObjectDelete :public Oyster::Network::CustomProtocolObject + { + int objectID; + + Protocol_ObjectDelete() + { + this->protocol[0].value = protocol_Gameplay_ObjectDelete; + this->protocol[0].type = Oyster::Network::NetAttributeType_Short; + this->protocol[1].type = Oyster::Network::NetAttributeType_Int; + this->objectID = -1; + } + Protocol_ObjectDelete(int objctID) + { + this->protocol[0].value = protocol_Gameplay_ObjectDelete; + this->protocol[0].type = Oyster::Network::NetAttributeType_Short; + this->protocol[1].type = Oyster::Network::NetAttributeType_Int; + this->objectID = objctID; + } + Protocol_ObjectDelete(Oyster::Network::CustomNetProtocol& p) + { + this->objectID = p[1].value.netInt; + } + Oyster::Network::CustomNetProtocol GetProtocol() override + { + this->protocol[1].value = this->objectID; + return protocol; + } + + private: + Oyster::Network::CustomNetProtocol protocol; + }; + //#define protocol_Gameplay_ObjectCreatePlayer 361 struct Protocol_ObjectCreatePlayer :public Oyster::Network::CustomProtocolObject { - /*1*/ int object_ID; + /*1*/ int objectID; /*2*/ int teamId; /*3*/ bool owner; /*4*/ std::string name; @@ -589,7 +614,7 @@ namespace GameLogic Protocol_ObjectCreatePlayer(Oyster::Network::CustomNetProtocol& p) { this->owner = p[1].value.netBool; - this->object_ID = p[2].value.netInt; + this->objectID = p[2].value.netInt; this->teamId = p[3].value.netInt; this->name.assign(p[4].value.netCharPtr); @@ -637,7 +662,7 @@ namespace GameLogic this->protocol[14].type = Oyster::Network::NetAttributeType_Float; this->protocol[15].type = Oyster::Network::NetAttributeType_Float; - this->object_ID = ObjectID; + this->objectID = ObjectID; this->teamId = teamID; this->owner = owner; this->name = name; @@ -649,7 +674,7 @@ namespace GameLogic Oyster::Network::CustomNetProtocol GetProtocol() override { this->protocol[1].value = this->owner; - this->protocol[2].value = this->object_ID; + this->protocol[2].value = this->objectID; this->protocol[3].value = this->teamId; this->protocol.Set(4, this->name); @@ -676,7 +701,7 @@ namespace GameLogic Oyster::Network::CustomNetProtocol protocol; }; - //#define protocol_Gameplay_ObjectJoinTeam 361 + //#define protocol_Gameplay_ObjectJoinTeam 362 struct Protocol_ObjectJoinTeam :public Oyster::Network::CustomProtocolObject { int objectID; @@ -716,7 +741,7 @@ namespace GameLogic Oyster::Network::CustomNetProtocol protocol; }; - //#define protocol_Gameplay_ObjectLeaveTeam 362 + //#define protocol_Gameplay_ObjectLeaveTeam 363 struct Protocol_ObjectLeaveTeam :public Oyster::Network::CustomProtocolObject { int objectID; @@ -748,7 +773,7 @@ namespace GameLogic Oyster::Network::CustomNetProtocol protocol; }; - //#define protocol_Gameplay_ObjectWeaponCooldown 363 + //#define protocol_Gameplay_ObjectWeaponCooldown 364 struct Protocol_ObjectWeaponCooldown :public Oyster::Network::CustomProtocolObject { float seconds; @@ -780,7 +805,7 @@ namespace GameLogic Oyster::Network::CustomNetProtocol protocol; }; - //#define protocol_Gameplay_ObjectWeaponEnergy 364 + //#define protocol_Gameplay_ObjectWeaponEnergy 365 struct Protocol_ObjectWeaponEnergy :public Oyster::Network::CustomProtocolObject { float energy; @@ -812,7 +837,7 @@ namespace GameLogic Oyster::Network::CustomNetProtocol protocol; }; - //#define protocol_Gameplay_ObjectRespawn 365 + //#define protocol_Gameplay_ObjectRespawn 366 struct Protocol_ObjectRespawn :public Oyster::Network::CustomProtocolObject { int objectID; @@ -864,7 +889,7 @@ namespace GameLogic Oyster::Network::CustomNetProtocol protocol; }; - //#define protocol_Gameplay_ObjectDie 366 + //#define protocol_Gameplay_ObjectDie 367 struct Protocol_ObjectDie :public Oyster::Network::CustomProtocolObject { int objectID; @@ -911,7 +936,7 @@ namespace GameLogic Oyster::Network::CustomNetProtocol protocol; }; - //#define protocol_Gameplay_ObjectDisconnectPlayer 367 + //#define protocol_Gameplay_ObjectDisconnectPlayer 368 struct Protocol_ObjectDisconnectPlayer :public Oyster::Network::CustomProtocolObject { int objectID; @@ -944,7 +969,7 @@ namespace GameLogic Oyster::Network::CustomNetProtocol protocol; }; } -//#define protocol_Gameplay_ObjectAction 368 +//#define protocol_Gameplay_ObjectAction 369 struct Protocol_ObjectAction :public Oyster::Network::CustomProtocolObject { short objectID; @@ -965,7 +990,7 @@ namespace GameLogic objectID = p[1].value.netShort; animationID = p[2].value.netInt; } - Protocol_ObjectAction( int id, float animID) + Protocol_ObjectAction( int id, int animID) { this->protocol[0].value = protocol_Gameplay_ObjectAction; this->protocol[0].type = Oyster::Network::NetAttributeType_Short; diff --git a/Code/Game/GameProtocols/ProtocolIdentificationID.h b/Code/Game/GameProtocols/ProtocolIdentificationID.h index 7aaf2eee..95e10ba1 100644 --- a/Code/Game/GameProtocols/ProtocolIdentificationID.h +++ b/Code/Game/GameProtocols/ProtocolIdentificationID.h @@ -62,15 +62,16 @@ #define protocol_Gameplay_ObjectEnabled 357 #define protocol_Gameplay_ObjectDisabled 358 #define protocol_Gameplay_ObjectCreate 359 -#define protocol_Gameplay_ObjectCreatePlayer 360 -#define protocol_Gameplay_ObjectJoinTeam 361 -#define protocol_Gameplay_ObjectLeaveTeam 362 -#define protocol_Gameplay_ObjectWeaponCooldown 363 -#define protocol_Gameplay_ObjectWeaponEnergy 364 -#define protocol_Gameplay_ObjectRespawn 365 -#define protocol_Gameplay_ObjectDie 366 -#define protocol_Gameplay_ObjectDisconnectPlayer 367 -#define protocol_Gameplay_ObjectAction 368 +#define protocol_Gameplay_ObjectDelete 360 +#define protocol_Gameplay_ObjectCreatePlayer 361 +#define protocol_Gameplay_ObjectJoinTeam 362 +#define protocol_Gameplay_ObjectLeaveTeam 363 +#define protocol_Gameplay_ObjectWeaponCooldown 364 +#define protocol_Gameplay_ObjectWeaponEnergy 365 +#define protocol_Gameplay_ObjectRespawn 366 +#define protocol_Gameplay_ObjectDie 367 +#define protocol_Gameplay_ObjectDisconnectPlayer 368 +#define protocol_Gameplay_ObjectAction 369 #define protocol_GameplayMAX 399 diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index 8e55f08b..fd000a0c 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -148,11 +148,11 @@ using namespace DanBias; } void GameSession::ObjectDisabled( GameLogic::IObjectData* movedObject ) { - //GameSession::gameSession->Send(Protocol_ObjectDisable(movedObject->GetID()).GetProtocol()); + GameSession::gameSession->Send(Protocol_ObjectDisable(movedObject->GetID()).GetProtocol()); } void GameSession::ObjectEnabled( GameLogic::IObjectData* movedObject ) { - //GameSession::gameSession->Send(Protocol_ObjectDisable(movedObject->GetID()).GetProtocol()); + GameSession::gameSession->Send(Protocol_ObjectDisable(movedObject->GetID()).GetProtocol()); } void GameSession::ObjectDamaged( GameLogic::IObjectData* movedObject, float hp ) { From 4d077106dcf9195fc3822f0f0a9bd0391b3b639d Mon Sep 17 00:00:00 2001 From: Linda Andersson Date: Wed, 26 Feb 2014 08:51:56 +0100 Subject: [PATCH 25/25] Weapon action enum added --- Code/Game/LevelLoader/ObjectDefines.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Code/Game/LevelLoader/ObjectDefines.h b/Code/Game/LevelLoader/ObjectDefines.h index aadc3382..3eae71a5 100644 --- a/Code/Game/LevelLoader/ObjectDefines.h +++ b/Code/Game/LevelLoader/ObjectDefines.h @@ -99,6 +99,11 @@ namespace GameLogic PlayerAction_Walk, PlayerAction_Idle, }; + enum WeaponAction + { + WeaponAtcion_PrimaryShoot, + WeaponAction_SecondaryShoot + }; enum PickupType {