///////////////////////////////////////////////////////////////////// // Created by [Dennis Andersen] [2013] ///////////////////////////////////////////////////////////////////// #include "GameSession.h" #include "GameClient.h" #include #include #include #include using namespace Utility::DynamicMemory; using namespace Oyster; using namespace Oyster::Network; using namespace Oyster::Thread; using namespace GameLogic; namespace DanBias { void InsertObject(DynamicArray>& clients, SmartPointer obj) { for (unsigned int i = 0; i < clients.Size(); i++) { if(!clients[i]) { clients[i] = obj; return; } } clients.Push(obj); } void RemoveObject(DynamicArray>& clients, DanBias::GameClient* obj) { for (unsigned int i = 0; i < clients.Size(); i++) { if(clients[i] && clients[i]->GetClient()->GetID() == obj->GetClient()->GetID()) { clients[i] = 0; return; } } } GameSession::GameSession() { this->owner = 0; this->box = 0; this->isCreated = false; this->isRunning = false; } GameSession::~GameSession() { delete this->box; this->box = 0; this->owner = 0; } bool GameSession::Create(GameDescription& desc) { if(desc.clients.Size() == 0) return false; if(!desc.owner) return false; if(!desc.mapName.size()) return false; if(this->isCreated) return false; this->clients.Resize(desc.clients.Size()); this->box = new PostBox(); this->owner = desc.owner; Oyster::Callback::OysterCallback c; c.value.callbackPostBox = this->box; c.callbackType = Oyster::Callback::CallbackType_PostBox; for (unsigned int i = 0; i < desc.clients.Size(); i++) { this->clients[i] = new GameClient(desc.clients[i], c); } this->isCreated = true; return true; } void GameSession::Run() { if(this->isRunning) return; if(this->clients.Size() > 0) { if(this->worker.Create(this, true, true) != OYSTER_THREAD_ERROR_SUCCESS) return; this->worker.SetPriority(OYSTER_THREAD_PRIORITY_2); this->isRunning = true; } } bool GameSession::Join(Utility::DynamicMemory::SmartPointer client) { if(!this->isCreated) return false; Oyster::Callback::OysterCallback c; c.value.callbackPostBox = this->box; c.callbackType = Oyster::Callback::CallbackType_PostBox; SmartPointer obj = new GameClient(client, c); InsertObject(this->clients, obj); return true; } void GameSession::CloseSession(bool dissconnectClients) { this->worker.Stop(false); //NetworkSession::CloseSession(dissconnectClients); this->isCreated = false; this->isRunning = false; } ////private: //overriden Threading functions bool GameSession::DoWork ( ) { this->Frame(); return true; } #ifndef ERIK ////private: void GameSession::Frame() { this->ParseEvents(); if(GetAsyncKeyState(VK_UP)) { Protocol_General_Status p(Protocol_General_Status::States_ready); Send(p.GetProtocol()); Sleep(100); } } void GameSession::ParseEvents() { if( !this->box->IsEmpty() ) { NetworkSession::NetEvent &e = this->box->Fetch(); if(e.protocol[0].type != Oyster::Network::NetAttributeType_Short) return; if( ProtocolIsGameplay(e.protocol[protocol_INDEX_ID].value.netShort) ) ParseGameplayEvent(e.protocol, e.gameClient); if( ProtocolIsGeneral(e.protocol[protocol_INDEX_ID].value.netShort) ) ParseGeneralEvent(e.protocol, e.gameClient); } } void GameSession::ParseGameplayEvent(Oyster::Network::CustomNetProtocol& p, DanBias::GameClient* c) { switch (p[protocol_INDEX_ID].value.netShort) { case protocol_Gameplay_PlayerNavigation: { Oyster::Math::Float4x4 world = Oyster::Math::Matrix::identity; if(p[1].value.netBool) //bool bForward; world.v[3].x = 2; //c->GetPlayer()->Move(GameLogic::PLAYER_MOVEMENT_FORWARD); if(p[2].value.netBool) //bool bBackward; world.v[3].x = -2; //c->GetPlayer()->Move(GameLogic::PLAYER_MOVEMENT_BACKWARD); if(p[5].value.netBool) //bool bStrafeRight; world.v[3].y = 2; //c->GetPlayer()->Move(GameLogic::PLAYER_MOVEMENT_RIGHT); if(p[6].value.netBool) //bool bStrafeLeft; world.v[3].y = -2; //c->GetPlayer()->Move(GameLogic::PLAYER_MOVEMENT_LEFT); Protocol_ObjectPosition res(world, 0); Send(res.GetProtocol()); } break; case protocol_Gameplay_PlayerMouseMovement: break; case protocol_Gameplay_PlayerPosition: break; case protocol_Gameplay_CreateObject: break; case protocol_Gameplay_ObjectPosition: break; } } void GameSession::ParseGeneralEvent(Oyster::Network::CustomNetProtocol& p, DanBias::GameClient* c) { switch (p[protocol_INDEX_ID].value.netShort) { case protocol_General_Status: switch (p[1].value.netInt) { case GameLogic::Protocol_General_Status::States_bussy: break; case GameLogic::Protocol_General_Status::States_disconected: printf("Client with ID [%i] dissconnected\n", c->GetClient()->GetID()); RemoveObject(this->clients, c); break; case GameLogic::Protocol_General_Status::States_idle: break; case GameLogic::Protocol_General_Status::States_ready: break; } break; case protocol_General_Text: break; } } void GameSession::Send(Oyster::Network::CustomNetProtocol* p) { for (unsigned int i = 0; i < this->clients.Size(); i++) { if(this->clients[i] && this->clients[i]->GetClient()) this->clients[i]->GetClient()->Send(p); } } #else #include "DynamicObject.h" //#include "CollisionManager.h" //#include "GameLogicStates.h" //#include /* using namespace GameLogic; //VARIABLES GOES HERE DynamicObject* objectBox; bool GameSession::Init(GameSessionDescription& desc) { if(desc.clients.Size() == 0) return false; this->box = new PostBox(); this->owner = desc.owner; for (unsigned int i = 0; i < desc.clients.Size(); i++) { desc.clients[i]->SetPostbox(this->box); this->clients.Push(desc.clients[i]); } CollisionManager::BoxCollision(0,0); objectBox = new DynamicObject(CollisionManager::BoxCollision, OBJECT_TYPE::OBJECT_TYPE_BOX); Protocol_CreateObject objectCreation; objectCreation.object_ID = objectBox->GetID(); objectCreation.path = "crate"; Oyster::Math::Float4x4 worldMat = objectBox->GetRigidBody()->GetOrientation(); for (int i = 0; i < 16; i++) { objectCreation.worldMatrix[i] = worldMat[i]; } for (int i = 0; i < clients.Size(); i++) { clients[i]->NetClient_Object()->Send(objectCreation); } return true; } void GameSession::Frame() { } void GameSession::ParseEvents() { if(this->box && !this->box->IsEmpty()) { NetEvent &e = this->box->Fetch(); if(e.protocol[0].type != Oyster::Network::NetAttributeType_Short) return; ParseProtocol(e.protocol, *e.reciever); } } void GameSession::ParseProtocol(Oyster::Network::CustomNetProtocol& p, DanBias::ClientObject& c) { switch (p[0].value.netShort) { case protocol_Gamplay_PlayerNavigation: { if(p[1].value.netBool) //bool bForward; c.Logic_Object()->Move(GameLogic::PLAYER_MOVEMENT_FORWARD); if(p[2].value.netBool) //bool bBackward; c.Logic_Object()->Move(GameLogic::PLAYER_MOVEMENT_BACKWARD); if(p[5].value.netBool) //bool bStrafeRight; c.Logic_Object()->Move(GameLogic::PLAYER_MOVEMENT_RIGHT); if(p[6].value.netBool) //bool bStrafeLeft; c.Logic_Object()->Move(GameLogic::PLAYER_MOVEMENT_LEFT); } break; case protocol_Gamplay_PlayerMouseMovement: break; case protocol_Gamplay_PlayerPosition: break; case protocol_Gamplay_CreateObject: break; case protocol_Gamplay_ObjectPosition: break; } } */ #endif }//End namespace DanBias