diff --git a/Code/Game/DanBiasGame/GameClientRecieverFunc.h b/Code/Game/DanBiasGame/GameClientRecieverFunc.h index 21c260d4..6e134ff8 100644 --- a/Code/Game/DanBiasGame/GameClientRecieverFunc.h +++ b/Code/Game/DanBiasGame/GameClientRecieverFunc.h @@ -5,6 +5,7 @@ #include "../DanBiasGame/Include/DanBiasGame.h" #include "../GameProtocols/GeneralProtocols.h" #include "..\GameProtocols\Protocols.h" +#include namespace DanBias { @@ -113,13 +114,22 @@ namespace DanBias { if(dynamic_cast(gameClientState)) { - GameLogic::Protocol_LobbyStartGame pt(p); + int id = p[1].value.netInt; + std::string name = p.Get(19).value.netCharPtr; + Oyster::Math::Float4x4 w; + for(int i = 0; i< 16; i++) + { + w[i] = p[i+3].value.netFloat; + } gameClientState->Release(); delete gameClientState; + gameClientState = new Client::GameState(); gameClientState->Init(this); - ((Client::GameState*)gameClientState)->setClientId(pt.clientID); + std::wstring temp; + Utility::String::StringToWstring(name, temp); + ((Client::GameState*)gameClientState)->InitiatePlayer(id, temp, w); } } break; diff --git a/Code/Game/DanBiasGame/GameClientState/GameState.cpp b/Code/Game/DanBiasGame/GameClientState/GameState.cpp index 4243de67..7eea61eb 100644 --- a/Code/Game/DanBiasGame/GameClientState/GameState.cpp +++ b/Code/Game/DanBiasGame/GameClientState/GameState.cpp @@ -53,15 +53,25 @@ bool GameState::Init(Oyster::Network::NetworkClient* nwClient) GameState::gameStateState GameState::LoadGame() { Oyster::Graphics::Definitions::Pointlight plight; - plight.Pos = Oyster::Math::Float3(0,15,5); - plight.Color = Oyster::Math::Float3(0,1,0); - plight.Radius = 50; - plight.Bright = 2; + plight.Pos = Oyster::Math::Float3(315, 0 ,5); + plight.Color = Oyster::Math::Float3(0.9,0.7,0.2); + plight.Radius = 100; + plight.Bright = 0.9; Oyster::Graphics::API::AddLight(plight); - plight.Pos = Oyster::Math::Float3(10,15,5); - plight.Color = Oyster::Math::Float3(1,0,0); - plight.Radius = 50; - plight.Bright = 2; + plight.Pos = Oyster::Math::Float3(10,350,5); + plight.Color = Oyster::Math::Float3(0.9,0.7,0.3); + plight.Radius = 200; + plight.Bright = 0.7; + Oyster::Graphics::API::AddLight(plight); + plight.Pos = Oyster::Math::Float3(350,350,5); + plight.Color = Oyster::Math::Float3(0.9,0.7,0.3); + plight.Radius = 200; + plight.Bright = 0.7; + Oyster::Graphics::API::AddLight(plight); + plight.Pos = Oyster::Math::Float3(10,350,350); + plight.Color = Oyster::Math::Float3(0.9,0.7,0.3); + plight.Radius = 200; + plight.Bright = 0.7; Oyster::Graphics::API::AddLight(plight); plight.Pos = Oyster::Math::Float3(10,-15,5); plight.Color = Oyster::Math::Float3(0,0,1); @@ -78,9 +88,10 @@ bool GameState::LoadModels(std::wstring mapFile) // open file // read file // init models - privData->modelCount = 4; - myId += privData->modelCount; - int id = 0; + int nrOfBoxex = 5; + privData->modelCount = 3 + nrOfBoxex; + + int id = 100; // add world model ModelInitData modelData; Oyster::Math3D::Float4x4 translate; @@ -96,15 +107,20 @@ bool GameState::LoadModels(std::wstring mapFile) // add box model modelData.world = Oyster::Math3D::Float4x4::identity; - translate = Oyster::Math3D::TranslationMatrix(Oyster::Math::Float3(4,320,0)); - modelData.world = modelData.world * translate; modelData.modelPath = L"box.dan"; - modelData.id = id++; - obj = new C_Player(); - privData->object.push_back(obj); - privData->object[privData->object.size() -1 ]->Init(modelData); - modelData.world = Oyster::Math3D::Float4x4::identity; + + for(int i =0; i< nrOfBoxex; i ++) + { + translate = Oyster::Math3D::TranslationMatrix(Oyster::Math::Float3(4,320,0)); + modelData.world = modelData.world * translate; + modelData.id = id++; + + obj = new C_Player(); + privData->object.push_back(obj); + privData->object[privData->object.size() -1 ]->Init(modelData); + modelData.world = Oyster::Math3D::Float4x4::identity; + } // add crystal model modelData.world = Oyster::Math3D::Float4x4::identity; @@ -132,34 +148,6 @@ bool GameState::LoadModels(std::wstring mapFile) privData->object.push_back(obj); privData->object[privData->object.size() -1 ]->Init(modelData); - // add player model - modelData.world = Oyster::Math3D::Float4x4::identity; - translate = Oyster::Math3D::TranslationMatrix(Oyster::Math::Float3(0, 320, 0)); - - modelData.world = modelData.world * translate; - modelData.visible = true; - modelData.modelPath = L"char_renderTest.dan"; - modelData.id = id++; - // load models - obj = new C_Player(); - privData->object.push_back(obj); - privData->object[privData->object.size() -1 ]->Init(modelData); - - // add player model 2 - modelData.world = Oyster::Math3D::Float4x4::identity; - translate = Oyster::Math3D::TranslationMatrix(Oyster::Math::Float3(50, 320, 0)); - - modelData.world = modelData.world * translate; - modelData.visible = true; - modelData.modelPath = L"char_renderTest.dan"; - modelData.id = id++; - // load models - obj = new C_Player(); - privData->object.push_back(obj); - privData->object[privData->object.size() -1 ]->Init(modelData); - - - return true; } bool GameState::InitCamera(Oyster::Math::Float3 startPos) @@ -171,7 +159,7 @@ bool GameState::InitCamera(Oyster::Math::Float3 startPos) camera->LookAt(pos, dir, up); camera->SetLens(3.14f/2, 1024/768, 1, 1000); - privData->proj = Oyster::Math3D::ProjectionMatrix_Perspective(Oyster::Math::pi/4,1024.0f/768.0f,.1f,1000); + privData->proj = Oyster::Math3D::ProjectionMatrix_Perspective(Oyster::Math::pi / 4, 1024.0f / 768.0f, .1f,1000); //privData->proj = Oyster::Math3D::ProjectionMatrix_Orthographic(1024, 768, 1, 1000); Oyster::Graphics::API::SetProjection(privData->proj); camera->UpdateViewMatrix(); @@ -181,9 +169,21 @@ bool GameState::InitCamera(Oyster::Math::Float3 startPos) privData->view = Oyster::Math3D::InverseOrientationMatrix(privData->view); return true; } -void GameState::setClientId(int id) +void GameState::InitiatePlayer(int id, std::wstring modelName, Oyster::Math::Float4x4 world) { myId = id; + + ModelInitData modelData; + C_Object* obj; + modelData.visible = true; + modelData.world = world; + modelData.modelPath = modelName; + modelData.id = myId; + + obj = new C_Player(); + privData->object.push_back(obj); + privData->object[privData->object.size() -1 ]->Init(modelData); + } GameClientState::ClientState GameState::Update(float deltaTime, InputClass* KeyInput) { @@ -334,7 +334,37 @@ void GameState::readKeyInput(InputClass* KeyInput) if(!key_Shoot) { GameLogic::Protocol_PlayerShot playerShot; - playerShot.hasShot = true; + playerShot.primaryPressed = true; + playerShot.secondaryPressed = false; + playerShot.utilityPressed = false; + privData->nwClient->Send(playerShot); + key_Shoot = true; + } + } + else + key_Shoot = false; + if(KeyInput->IsKeyPressed(DIK_X)) + { + if(!key_Shoot) + { + GameLogic::Protocol_PlayerShot playerShot; + playerShot.primaryPressed = false; + playerShot.secondaryPressed = true; + playerShot.utilityPressed = false; + privData->nwClient->Send(playerShot); + key_Shoot = true; + } + } + else + key_Shoot = false; + if(KeyInput->IsKeyPressed(DIK_C)) + { + if(!key_Shoot) + { + GameLogic::Protocol_PlayerShot playerShot; + playerShot.primaryPressed = false; + playerShot.secondaryPressed = false; + playerShot.utilityPressed = true; privData->nwClient->Send(playerShot); key_Shoot = true; } @@ -343,7 +373,7 @@ void GameState::readKeyInput(InputClass* KeyInput) key_Shoot = false; // jump - if(KeyInput->IsKeyPressed(DIK_X)) + if(KeyInput->IsKeyPressed(DIK_SPACE)) { if(!key_Jump) { @@ -412,7 +442,7 @@ void GameState::Protocol( ObjPos* pos ) camera->setRight(right); camera->setUp(up); - //camera->setLook(objForward); + camera->setLook(objForward); up *= 2; objForward *= -3; diff --git a/Code/Game/DanBiasGame/GameClientState/GameState.h b/Code/Game/DanBiasGame/GameClientState/GameState.h index d555134c..2cff9ed9 100644 --- a/Code/Game/DanBiasGame/GameClientState/GameState.h +++ b/Code/Game/DanBiasGame/GameClientState/GameState.h @@ -37,8 +37,8 @@ public: GameClientState::ClientState Update(float deltaTime, InputClass* KeyInput) override; bool LoadModels(std::wstring mapFile) ; bool InitCamera(Oyster::Math::Float3 startPos) ; + void InitiatePlayer(int id, std::wstring modelName, Oyster::Math::Float4x4 world); gameStateState LoadGame(); - void setClientId(int id); void readKeyInput(InputClass* KeyInput); bool Render()override; bool Release()override; diff --git a/Code/Game/DanBiasGame/GameClientState/LoginState.cpp b/Code/Game/DanBiasGame/GameClientState/LoginState.cpp index 940dc5aa..0e3d46e5 100644 --- a/Code/Game/DanBiasGame/GameClientState/LoginState.cpp +++ b/Code/Game/DanBiasGame/GameClientState/LoginState.cpp @@ -41,9 +41,9 @@ bool LoginState::Init(Oyster::Network::NetworkClient* nwClient) bool LoginState::LoadModels(std::wstring file) { Oyster::Graphics::Definitions::Pointlight plight; - plight.Pos = Oyster::Math::Float3(-2,3,0); - plight.Color = Oyster::Math::Float3(0,1,0); - plight.Radius = 10; + plight.Pos = Oyster::Math::Float3(0,0,5.4f); + plight.Color = Oyster::Math::Float3(1,1,1); + plight.Radius = 100; plight.Bright = 1; Oyster::Graphics::API::AddLight(plight); // open file @@ -57,10 +57,11 @@ bool LoginState::LoadModels(std::wstring file) modelData.visible = true; modelData.modelPath = L"box_2.dan"; // load models - privData->object[0] = new C_StaticObj(); + Oyster::Math3D::Float4x4 translate = Oyster::Math3D::TranslationMatrix(Oyster::Math::Float3(2,2,2)); + privData->object[0] = new C_DynamicObj(); privData->object[0]->Init(modelData); - Oyster::Math3D::Float4x4 translate = Oyster::Math3D::TranslationMatrix(Oyster::Math::Float3(-2,-2,-2)); + translate = Oyster::Math3D::TranslationMatrix(Oyster::Math::Float3(-2,-2,-2)); modelData.world = modelData.world * translate; privData->object[1] = new C_DynamicObj(); diff --git a/Code/Game/GameLogic/AttatchmentMassDriver.cpp b/Code/Game/GameLogic/AttatchmentMassDriver.cpp index 1d8e06a4..e0ca6c0f 100644 --- a/Code/Game/GameLogic/AttatchmentMassDriver.cpp +++ b/Code/Game/GameLogic/AttatchmentMassDriver.cpp @@ -42,7 +42,7 @@ void AttatchmentMassDriver::UseAttatchment(const GameLogic::WEAPON_FIRE &usage, if(hasObject) { - ForcePush(usage,dt);//WARNING THIS IS A CRAP TEST TO MAKE SURE YOU CAN SHOOT BOXES + //ForcePush(usage,dt);//WARNING THIS IS A CRAP TEST TO MAKE SURE YOU CAN SHOOT BOXES break; } ForcePull(usage,dt); diff --git a/Code/Game/GameLogic/CollisionManager.cpp b/Code/Game/GameLogic/CollisionManager.cpp index 911e08f8..33604f51 100644 --- a/Code/Game/GameLogic/CollisionManager.cpp +++ b/Code/Game/GameLogic/CollisionManager.cpp @@ -84,7 +84,7 @@ using namespace GameLogic; if(kineticEnergyLoss > forceThreashHold) //should only take damage if the force is high enough { damageDone = (int)kineticEnergyLoss * 0.10f; - player.DamageLife(damageDone); + //player.DamageLife(damageDone); } } @@ -96,6 +96,14 @@ using namespace GameLogic; { return Physics::ICustomBody::SubscriptMessage_none; } + Oyster::Physics::ICustomBody::SubscriptMessage Player::PlayerCollisionBefore(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj) + { + return Physics::ICustomBody::SubscriptMessage_player_collision_response; + } + Oyster::Physics::ICustomBody::SubscriptMessage Player::PlayerCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss) + { + return Physics::ICustomBody::SubscriptMessage_none; + } //Oyster::Physics::ICustomBody::SubscriptMessage Oyster::Physics::ICustomBody::SubscriptMessage Level::LevelCollisionBefore(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj) { diff --git a/Code/Game/GameLogic/Game.h b/Code/Game/GameLogic/Game.h index ddcfc086..b57520e0 100644 --- a/Code/Game/GameLogic/Game.h +++ b/Code/Game/GameLogic/Game.h @@ -53,6 +53,7 @@ namespace GameLogic Oyster::Math::Float4x4 GetOrientation() override; int GetID() const override; OBJECT_TYPE GetObjectType() const override; + int getNrOfDynamicObj()const override; IObjectData* GetObjectAt(int ID) const override; Level *level; }; diff --git a/Code/Game/GameLogic/GameAPI.h b/Code/Game/GameLogic/GameAPI.h index f0ce50b1..53931063 100644 --- a/Code/Game/GameLogic/GameAPI.h +++ b/Code/Game/GameLogic/GameAPI.h @@ -100,6 +100,7 @@ namespace GameLogic class ILevelData :public IObjectData { public: + virtual int getNrOfDynamicObj()const = 0; virtual IObjectData* GetObjectAt(int ID) const = 0; }; diff --git a/Code/Game/GameLogic/Game_LevelData.cpp b/Code/Game/GameLogic/Game_LevelData.cpp index 1a5973e6..9bd3275a 100644 --- a/Code/Game/GameLogic/Game_LevelData.cpp +++ b/Code/Game/GameLogic/Game_LevelData.cpp @@ -35,7 +35,10 @@ OBJECT_TYPE Game::LevelData::GetObjectType() const return ((IObjectData*)this->level)->GetObjectType(); //return OBJECT_TYPE_UNKNOWN; } - +int Game::LevelData::getNrOfDynamicObj()const +{ + return this->level->getNrOfDynamicObj(); +} IObjectData* Game::LevelData::GetObjectAt(int ID) const { return this->level->GetObj(ID); diff --git a/Code/Game/GameLogic/Game_PlayerData.cpp b/Code/Game/GameLogic/Game_PlayerData.cpp index bf2cbcbe..da441539 100644 --- a/Code/Game/GameLogic/Game_PlayerData.cpp +++ b/Code/Game/GameLogic/Game_PlayerData.cpp @@ -11,13 +11,15 @@ Game::PlayerData::PlayerData() sbDesc.size = Oyster::Math::Float3(4,7,4); sbDesc.mass = 70; sbDesc.restitutionCoeff = 0.5; + sbDesc.frictionCoeff_Static = 0.4; + sbDesc.frictionCoeff_Dynamic = 0.3; sbDesc.rotation = Oyster::Math::Float3(0, Oyster::Math::pi, 0); //create rigid body Oyster::Physics::ICustomBody *rigidBody = Oyster::Physics::API::Instance().CreateRigidBody(sbDesc).Release(); //create player with this rigid body - this->player = new Player(rigidBody,Object::DefaultCollisionBefore, Player::PlayerCollision, OBJECT_TYPE::OBJECT_TYPE_PLAYER); + this->player = new Player(rigidBody,Player::PlayerCollisionBefore, Player::PlayerCollision, OBJECT_TYPE::OBJECT_TYPE_PLAYER); this->player->GetRigidBody()->SetCustomTag(this); /*Oyster::Physics::ICustomBody::State state; this->player->GetRigidBody()->GetState(state); diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 2d1405f5..0419e5b0 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -22,8 +22,38 @@ void Level::InitiateLevel(std::string levelPath) } void Level::InitiateLevel(float radius) { + float heading = Utility::Value::Radian(180.0f); + float attitude = Utility::Value::Radian(0.0f); + float bank = Utility::Value::Radian(0); - // add level sphere + double c1 = cos(heading/2); + double s1 = sin(heading/2); + double c2 = cos(attitude/2); + double s2 = sin(attitude/2); + double c3 = cos(bank/2); + double s3 = sin(bank/2); + double c1c2 = c1*c2; + double s1s2 = s1*s2; + double w =c1c2*c3 - s1s2*s3; + double x =c1c2*s3 + s1s2*c3; + double y =s1*c2*c3 + c1*s2*s3; + double z =c1*s2*c3 - s1*c2*s3; + double angle = 2 * acos(w); + + double norm = x*x+y*y+z*z; + if (norm < 0.001) { // when all euler angles are zero angle =0 so + // we can set axis to anything to avoid divide by zero + x=1; + y=z=0; + } else { + norm = sqrt(norm); + x /= norm; + y /= norm; + z /= norm; + } + int idCount = 100; + +// add level sphere API::SphericalBodyDescription sbDesc; sbDesc.centerPosition = Oyster::Math::Float4(0,0,0,1); sbDesc.ignoreGravity = true; @@ -31,6 +61,7 @@ void Level::InitiateLevel(float radius) sbDesc.mass = 10e12f; sbDesc.frictionCoeff_Static = 0; sbDesc.frictionCoeff_Dynamic = 0; + //sbDesc.rotation = ICustomBody* rigidBody = API::Instance().CreateRigidBody(sbDesc).Release(); ICustomBody::State state; @@ -42,7 +73,7 @@ void Level::InitiateLevel(float radius) rigidBody->SetCustomTag(levelObj); //this->dynamicObjects = new DynamicArray< DynamicObject>; - // add box +// add box API::SimpleBodyDescription sbDesc_TestBox; sbDesc_TestBox.centerPosition = Oyster::Math::Float4(10,320,0,0); sbDesc_TestBox.ignoreGravity = false; @@ -51,33 +82,37 @@ void Level::InitiateLevel(float radius) sbDesc_TestBox.size = Oyster::Math::Float4(2,2,2,0); - ICustomBody* rigidBody_TestBox = API::Instance().CreateRigidBody(sbDesc_TestBox).Release(); - rigidBody_TestBox->SetSubscription(Level::PhysicsOnMoveLevel); + ICustomBody* rigidBody_TestBox; - this->dynamicObjects.Push(new DynamicObject(rigidBody_TestBox,Object::DefaultCollisionBefore, Object::DefaultCollisionAfter, OBJECT_TYPE::OBJECT_TYPE_BOX)); - rigidBody_TestBox->SetCustomTag(this->dynamicObjects[0]); - rigidBody_TestBox->GetState(state); - state.ApplyLinearImpulse(Oyster::Math::Float3(0,0,0)); - rigidBody_TestBox->SetState(state); + int nrOfBoxex = 5; + for(int i =0; i< nrOfBoxex; i ++) + { + sbDesc_TestBox.centerPosition = Oyster::Math::Float4(20 ,320,0 + ( i*7),0); + rigidBody_TestBox = API::Instance().CreateRigidBody(sbDesc_TestBox).Release(); + rigidBody_TestBox->SetSubscription(Level::PhysicsOnMoveLevel); - // add crystal + this->dynamicObjects.Push(new DynamicObject(rigidBody_TestBox,Object::DefaultCollisionBefore, Object::DefaultCollisionAfter, OBJECT_TYPE::OBJECT_TYPE_BOX)); + rigidBody_TestBox->SetCustomTag(this->dynamicObjects[i]); + } + + + + + +// add crystal API::SimpleBodyDescription sbDesc_Crystal; sbDesc_Crystal.centerPosition = Oyster::Math::Float4(10, 305, 0, 0); sbDesc_Crystal.ignoreGravity = false; - sbDesc_Crystal.mass = 70; sbDesc_Crystal.size = Oyster::Math::Float4(2,3,2,0); - ICustomBody* rigidBody_Crystal = API::Instance().CreateRigidBody(sbDesc_Crystal).Release(); rigidBody_Crystal->SetSubscription(Level::PhysicsOnMoveLevel); this->dynamicObjects.Push(new DynamicObject(rigidBody_Crystal,Object::DefaultCollisionBefore, Object::DefaultCollisionAfter, OBJECT_TYPE::OBJECT_TYPE_BOX)); - rigidBody_Crystal->SetCustomTag(this->dynamicObjects[1]); - rigidBody_Crystal->GetState(state); - state.ApplyLinearImpulse(Oyster::Math::Float3(0,0,0)); - rigidBody_Crystal->SetState(state); + rigidBody_Crystal->SetCustomTag(this->dynamicObjects[nrOfBoxex]); - // add house + +// add house API::SimpleBodyDescription sbDesc_House; sbDesc_House.centerPosition = Oyster::Math::Float4(50, 300, 0, 0); sbDesc_House.ignoreGravity = false; @@ -90,12 +125,9 @@ void Level::InitiateLevel(float radius) rigidBody_House->SetSubscription(Level::PhysicsOnMoveLevel); this->staticObjects.Push(new StaticObject(rigidBody_House,Object::DefaultCollisionBefore, Object::DefaultCollisionAfter, OBJECT_TYPE::OBJECT_TYPE_GENERIC)); rigidBody_House->SetCustomTag(this->staticObjects[0]); - rigidBody_House->GetState(state); - state.ApplyLinearImpulse(Oyster::Math::Float3(0,0,0)); - rigidBody_House->SetState(state); + - - // add gravitation +// add gravitation API::Gravity gravityWell; gravityWell.gravityType = API::Gravity::GravityType_Well; gravityWell.well.mass = 1e17f; @@ -118,6 +150,10 @@ void Level::RespawnPlayer(Player *player) this->teamManager.RespawnPlayerRandom(player); } +int Level::getNrOfDynamicObj() +{ + return this->dynamicObjects.Size(); +} Object* Level::GetObj( int ID) const { for (int i = 0; i< this->dynamicObjects.Size(); i++) @@ -131,4 +167,4 @@ void Level::PhysicsOnMoveLevel(const ICustomBody *object) { // function call from physics update when object was moved Object* temp = (Object*)object->GetCustomTag(); -} \ No newline at end of file +} diff --git a/Code/Game/GameLogic/Level.h b/Code/Game/GameLogic/Level.h index 00fb76ef..cc34408b 100644 --- a/Code/Game/GameLogic/Level.h +++ b/Code/Game/GameLogic/Level.h @@ -59,7 +59,8 @@ namespace GameLogic ********************************************************/ static Oyster::Physics::ICustomBody::SubscriptMessage LevelCollisionBefore(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj); static Oyster::Physics::ICustomBody::SubscriptMessage LevelCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss); - + + int getNrOfDynamicObj(); Object* GetObj( int ID ) const; static void PhysicsOnMoveLevel(const Oyster::Physics::ICustomBody *object); diff --git a/Code/Game/GameLogic/Object.cpp b/Code/Game/GameLogic/Object.cpp index 8cb57aae..68297d46 100644 --- a/Code/Game/GameLogic/Object.cpp +++ b/Code/Game/GameLogic/Object.cpp @@ -156,6 +156,8 @@ void Object::EndFrame() //error int i =0 ; } + + if(currPhysicsState.GetGravityNormal()!= Float3::null) { Oyster::Math::Float4 axis; @@ -170,6 +172,18 @@ void Object::EndFrame() Oyster::Math::Float3 debug = ::LinearAlgebra3D::WorldAxisOf(::LinearAlgebra3D::Rotation(axis.xyz), Oyster::Math::Float3::standard_unit_y); debug += currPhysicsState.GetGravityNormal(); } + Oyster::Math::Float3 pos = currPhysicsState.GetCenterPosition(); + Oyster::Math::Float3 up = -currPhysicsState.GetGravityNormal(); + //300, 0,0, + //1,0,0 + + if( pos.GetLength() < 303.5f) + { + Oyster::Math::Float moveUp = 303.5 - pos.GetLength(); + up *= moveUp; + + currPhysicsState.SetCenterPosition(pos + up); + } if(currPhysicsState.GetLinearMomentum() !=currPhysicsState.GetLinearMomentum()) diff --git a/Code/Game/GameLogic/Player.cpp b/Code/Game/GameLogic/Player.cpp index 54e246a7..9b0c29ee 100644 --- a/Code/Game/GameLogic/Player.cpp +++ b/Code/Game/GameLogic/Player.cpp @@ -6,7 +6,7 @@ using namespace GameLogic; using namespace Oyster::Physics; -const int MOVE_FORCE = 5000; +const int MOVE_FORCE = 500; Player::Player() :DynamicObject() { @@ -154,11 +154,6 @@ void Player::Rotate(const Oyster::Math3D::Float4 lookDir) { int i =0 ; } - //Oyster::Math::Float3 up = currPhysicsState.GetOrientation().v[1]; - //Oyster::Math::Float3 deltaAxis = up * (-dx * 0.02) ; - //Oyster::Math::Float3 oldOrt = currPhysicsState.GetRotation(); - - //newPhysicsState.SetRotation(oldOrt + deltaAxis); this->lookDir = lookDir.xyz; this->dx = lookDir.w; diff --git a/Code/Game/GameLogic/Player.h b/Code/Game/GameLogic/Player.h index f609d197..4f406e31 100644 --- a/Code/Game/GameLogic/Player.h +++ b/Code/Game/GameLogic/Player.h @@ -73,6 +73,9 @@ namespace GameLogic void BeginFrame(); void EndFrame(); + static Oyster::Physics::ICustomBody::SubscriptMessage PlayerCollisionBefore(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj); + static Oyster::Physics::ICustomBody::SubscriptMessage PlayerCollisionAfter(Oyster::Physics::ICustomBody *rigidBodyLevel, Oyster::Physics::ICustomBody *obj, Oyster::Math::Float kineticEnergyLoss); + private: void Jump(); diff --git a/Code/Game/GameProtocols/GameProtocols.vcxproj b/Code/Game/GameProtocols/GameProtocols.vcxproj index 826f9df4..4671f97f 100644 --- a/Code/Game/GameProtocols/GameProtocols.vcxproj +++ b/Code/Game/GameProtocols/GameProtocols.vcxproj @@ -69,25 +69,25 @@ $(SolutionDir)..\External\Lib\$(ProjectName)\ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName)D - $(SolutionDir)Network\NetworkAPI\;$(IncludePath) + $(SolutionDir)Network\NetworkAPI\;$(SolutionDir)Misc;$(IncludePath) $(SolutionDir)..\External\Lib\$(ProjectName)\ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName) - $(SolutionDir)Network\NetworkAPI\;$(IncludePath) + $(SolutionDir)Network\NetworkAPI\;$(SolutionDir)Misc;$(IncludePath) $(SolutionDir)..\External\Lib\$(ProjectName)\ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName)D - $(SolutionDir)Network\NetworkAPI\;$(IncludePath) + $(SolutionDir)Network\NetworkAPI\;$(SolutionDir)Misc;$(IncludePath) $(SolutionDir)..\External\Lib\$(ProjectName)\ $(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\ $(ProjectName)_$(PlatformShortName) - $(SolutionDir)Network\NetworkAPI\;$(IncludePath) + $(SolutionDir)Network\NetworkAPI\;$(SolutionDir)Misc;$(IncludePath) diff --git a/Code/Game/GameProtocols/LobbyProtocols.h b/Code/Game/GameProtocols/LobbyProtocols.h index 95ec8537..0dd563c3 100644 --- a/Code/Game/GameProtocols/LobbyProtocols.h +++ b/Code/Game/GameProtocols/LobbyProtocols.h @@ -12,6 +12,13 @@ #include +/** OBS! +** It seems like if a string is set in the middle of a data set, +** the reciever will crach when trying to use the protocol. +** Only tested on Protocol_LobbyStartGame. +**/ + + namespace GameLogic { /* @@ -47,34 +54,66 @@ namespace GameLogic struct Protocol_LobbyStartGame :public Oyster::Network::CustomProtocolObject { short clientID; // The unuiqe id reprsenting a specific client + std::string modelName; + float worldMatrix[16]; Protocol_LobbyStartGame() { - this->protocol[0].value = protocol_Lobby_Start; - this->protocol[0].type = Oyster::Network::NetAttributeType_Short; + int c = 0; + this->protocol[c].value = protocol_Lobby_Start; + this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; - this->protocol[1].type = Oyster::Network::NetAttributeType_Short; + this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; + for (int i = 0; i <= 16; i++) + { + this->protocol[c++].type = Oyster::Network::NetAttributeType_Float; + } + this->protocol[c++].type = Oyster::Network::NetAttributeType_CharArray; } - Protocol_LobbyStartGame(short _clientID) + Protocol_LobbyStartGame(short _clientID, std::string name, float world[16]) { - this->protocol[0].value = protocol_Lobby_Start; - this->protocol[0].type = Oyster::Network::NetAttributeType_Short; + int c = 0; + this->protocol[c].value = protocol_Lobby_Start; + this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; + + this->protocol[c++].type = Oyster::Network::NetAttributeType_Short; + for (int i = 0; i <= 16; i++) + { + this->protocol[c++].type = Oyster::Network::NetAttributeType_Float; + } + + this->protocol[c++].type = Oyster::Network::NetAttributeType_CharArray; - this->protocol[1].type = Oyster::Network::NetAttributeType_Short; clientID = _clientID; + modelName = name; + memcpy(&worldMatrix[0], &world[0], sizeof(float) * 16); } Protocol_LobbyStartGame(Oyster::Network::CustomNetProtocol& o) { - clientID = o[1].value.netInt; + int c = 1; + clientID = o[c++].value.netInt; + for (int i = 0; i <= 16; i++) + { + this->worldMatrix[i] = o[c++].value.netFloat; + } + modelName = o[c++].value.netCharPtr; } Oyster::Network::CustomNetProtocol GetProtocol() override { - protocol[1].value = clientID; + int c = 1; + protocol[c++].value = clientID; + + for (int i = 0; i <= 16; i++) + { + this->protocol[c++].value = this->worldMatrix[i]; + } + protocol.Set(c++, this->modelName); return protocol; } private: Oyster::Network::CustomNetProtocol protocol; + }; struct Protocol_LobbyLogin :public Oyster::Network::CustomProtocolObject diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index 11085041..5ce10b27 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -234,6 +234,7 @@ namespace GameLogic struct Protocol_ObjectCreate :public Oyster::Network::CustomProtocolObject { + //ObjectType type; //ie player, box or whatever int object_ID; std::string name; float worldMatrix[16]; diff --git a/Code/Game/GameProtocols/PlayerProtocols.h b/Code/Game/GameProtocols/PlayerProtocols.h index 8517775d..81e6fbb8 100644 --- a/Code/Game/GameProtocols/PlayerProtocols.h +++ b/Code/Game/GameProtocols/PlayerProtocols.h @@ -142,7 +142,9 @@ namespace GameLogic struct Protocol_PlayerShot :public Oyster::Network::CustomProtocolObject { - bool hasShot; + bool primaryPressed; + bool secondaryPressed; + bool utilityPressed; Protocol_PlayerShot() { @@ -150,19 +152,27 @@ namespace GameLogic this->protocol[0].type = Oyster::Network::NetAttributeType_Short; this->protocol[1].type = Oyster::Network::NetAttributeType_Bool; + this->protocol[2].type = Oyster::Network::NetAttributeType_Bool; + this->protocol[3].type = Oyster::Network::NetAttributeType_Bool; } Protocol_PlayerShot(Oyster::Network::CustomNetProtocol& p) { - hasShot = p[1].value.netBool; + primaryPressed = p[1].value.netBool; + secondaryPressed = p[2].value.netBool; + utilityPressed = p[3].value.netBool; } const Protocol_PlayerShot& operator=(Oyster::Network::CustomNetProtocol& val) { - hasShot = val[1].value.netBool; + primaryPressed = val[1].value.netBool; + secondaryPressed = val[2].value.netBool; + utilityPressed = val[3].value.netBool; return *this; } Oyster::Network::CustomNetProtocol GetProtocol() override { - this->protocol[1].value = hasShot; + this->protocol[1].value = primaryPressed; + this->protocol[2].value = secondaryPressed; + this->protocol[3].value = utilityPressed; return protocol; } diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index 8a202931..2d4453ee 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -200,9 +200,9 @@ namespace DanBias } void GameSession::Gameplay_PlayerShot ( Protocol_PlayerShot& p, DanBias::GameClient* c ) { - //c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_PRIMARY_PRESS); - c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_SECONDARY_PRESS); - //c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_PRIMARY_PRESS); + if(p.primaryPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_PRIMARY_PRESS); + if(p.secondaryPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_SECONDARY_PRESS); + if(p.utilityPressed) c->GetPlayer()->UseWeapon(GameLogic::WEAPON_USE_UTILLITY_PRESS); } void GameSession::Gameplay_PlayerJump ( Protocol_PlayerJump& p, DanBias::GameClient* c ) { diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index 379e7a6c..baf86de4 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -129,7 +129,7 @@ namespace DanBias } else { - Protocol_LobbyStartGame p(readyList[i]->GetPlayer()->GetID()); + Protocol_LobbyStartGame p(readyList[i]->GetPlayer()->GetID(), "char_white.dan", readyList[i]->GetPlayer()->GetOrientation()); readyList[i]->GetClient()->Send(p); } } diff --git a/Code/GamePhysics/Implementation/PhysicsAPI_Impl.cpp b/Code/GamePhysics/Implementation/PhysicsAPI_Impl.cpp index ede0c289..7981322f 100644 --- a/Code/GamePhysics/Implementation/PhysicsAPI_Impl.cpp +++ b/Code/GamePhysics/Implementation/PhysicsAPI_Impl.cpp @@ -27,7 +27,7 @@ namespace ICustomBody::State deuterState; deuter->GetState( deuterState ); // calc from perspective of deuter. - Float4 normal = worldPointOfContact - Float4(deuterState.GetCenterPosition(), 1.0f ); // Init value is only borrowed + Float4 normal = (worldPointOfContact - Float4(deuterState.GetCenterPosition(), 1.0f )).GetNormalized(); // Init value is only borrowed if( normal.Dot(normal) > 0.0f ) { deuter->GetNormalAt( worldPointOfContact, normal ); @@ -47,9 +47,10 @@ namespace proto->GetNormalAt( worldPointOfContact, normal ); normal = -normal; } + normal.Normalize(); - Float4 protoG = protoState.GetLinearMomentum( worldPointOfContact.xyz ), - deuterG = deuterState.GetLinearMomentum( worldPointOfContact.xyz ); + Float4 protoG = Float4(protoState.GetLinearMomentum( worldPointOfContact.xyz ), 0), + deuterG = Float4(deuterState.GetLinearMomentum( worldPointOfContact.xyz ), 0); if( normal != normal ) // debug: trap const char *breakpoint = "This should never happen"; @@ -89,6 +90,18 @@ namespace return; } + // PLayerHAck + if( proto->CallSubscription_BeforeCollisionResponse(proto) == ICustomBody::SubscriptMessage_player_collision_response ) + { + Float3 linearMomentum = protoState.GetLinearMomentum(); + Float3 up = -protoState.GetGravityNormal(); + Float3 upForce = (linearMomentum.Dot(up) * up); + + Float3 noBounceForce = linearMomentum - upForce; + protoState.SetLinearMomentum(noBounceForce); + proto->SetState(protoState); + return; + } // calculate and store time interpolation value, for later rebound. proto->SetTimeOfContact( worldPointOfContact ); @@ -100,7 +113,7 @@ namespace // calc from perspective of proto - normal = worldPointOfContact - Float4(protoState.GetCenterPosition(), 1.0f ); + normal = (worldPointOfContact - Float4(protoState.GetCenterPosition(), 1.0f )).GetNormalized(); if( normal.Dot(normal) > 0.0f ) { proto->GetNormalAt( worldPointOfContact, normal ); diff --git a/Code/GamePhysics/PhysicsAPI.h b/Code/GamePhysics/PhysicsAPI.h index f636bb73..c3efef3e 100644 --- a/Code/GamePhysics/PhysicsAPI.h +++ b/Code/GamePhysics/PhysicsAPI.h @@ -242,7 +242,8 @@ namespace Oyster { SubscriptMessage_none, SubscriptMessage_kineticLoss, - SubscriptMessage_ignore_collision_response + SubscriptMessage_ignore_collision_response, + SubscriptMessage_player_collision_response }; typedef SubscriptMessage (*EventAction_BeforeCollisionResponse)( const ICustomBody *proto, const ICustomBody *deuter ); diff --git a/Code/Misc/Utilities.cpp b/Code/Misc/Utilities.cpp index cdf3d136..7f6a3302 100644 --- a/Code/Misc/Utilities.cpp +++ b/Code/Misc/Utilities.cpp @@ -300,7 +300,7 @@ namespace Utility //To wstring - ::std::wstring & StringToWString( const ::std::string &str, ::std::wstring &wstr ) + ::std::wstring & StringToWstring( const ::std::string &str, ::std::wstring &wstr ) { const char *orig = str.c_str(); diff --git a/Code/Network/NetworkAPI/CustomNetProtocol.cpp b/Code/Network/NetworkAPI/CustomNetProtocol.cpp index b3178b5d..ecb57bf9 100644 --- a/Code/Network/NetworkAPI/CustomNetProtocol.cpp +++ b/Code/Network/NetworkAPI/CustomNetProtocol.cpp @@ -19,11 +19,6 @@ struct CustomNetProtocol::PrivateData ~PrivateData() { - for (auto i = attributes.begin(); i != attributes.end(); i++) - { - //RemoveAttribute(i); - } - attributes.Clear(); } void RemoveAttribute(NetAttributeContainer* i) @@ -41,17 +36,12 @@ struct CustomNetProtocol::PrivateData //Do network stuff }; -static int ia = 0; -static int ib = 0; - CustomNetProtocol::CustomNetProtocol() { - ia++; this->privateData = new PrivateData(); } CustomNetProtocol::CustomNetProtocol(CustomNetProtocol& o) { - ib ++; this->privateData = new PrivateData(); this->privateData->attributes = o.privateData->attributes; } @@ -62,14 +52,12 @@ const CustomNetProtocol& CustomNetProtocol::operator=(CustomNetProtocol& o) delete this->privateData; this->privateData = 0; } - ib ++; this->privateData = new PrivateData(); this->privateData->attributes = o.privateData->attributes; return *this; } CustomNetProtocol::~CustomNetProtocol() { - //ia--; delete this->privateData; this->privateData = 0; } diff --git a/Code/Network/NetworkAPI/NetworkClient.cpp b/Code/Network/NetworkAPI/NetworkClient.cpp index bea8c36d..89653d74 100644 --- a/Code/Network/NetworkAPI/NetworkClient.cpp +++ b/Code/Network/NetworkAPI/NetworkClient.cpp @@ -297,10 +297,9 @@ void NetworkClient::Disconnect() { if(!privateData) return; - this->privateData->sendQueue.Clear(); - - privateData->connection.Disconnect(); privateData->thread.Terminate(); + privateData->connection.Disconnect(); + this->privateData->sendQueue.Clear(); }