diff --git a/Code/Game/GameClient/GameClientState/GameState.cpp b/Code/Game/GameClient/GameClientState/GameState.cpp index 462422a6..a4e22bbc 100644 --- a/Code/Game/GameClient/GameClientState/GameState.cpp +++ b/Code/Game/GameClient/GameClientState/GameState.cpp @@ -327,7 +327,11 @@ void GameState::ReadKeyInput() { static const float mouseSensitivity = Radian( 1.0f ); this->privData->camera.PitchDown( this->privData->input->GetPitch() * mouseSensitivity ); - this->privData->nwClient->Send( Protocol_PlayerLeftTurn(this->privData->input->GetYaw() * mouseSensitivity) ); + float yaw = this->privData->input->GetYaw(); + if( yaw != 0.0f ) + { + this->privData->nwClient->Send( Protocol_PlayerLeftTurn(yaw * mouseSensitivity) ); + } } // shoot diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 9febbe47..c9938dbd 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -300,6 +300,7 @@ bool Level::InitiateLevel(std::wstring levelPath) Object* dynamicGameObj = CreateGameObj(dynamicObjData, rigidBody_Dynamic); if (dynamicGameObj != NULL) { + dynamicGameObj->GetRigidBody()->SetSubscription(Level::PhysicsOnMoveLevel); this->dynamicObjects.Push((DynamicObject*)dynamicGameObj); } } diff --git a/Code/Game/GameLogic/Player.cpp b/Code/Game/GameLogic/Player.cpp index 77953d43..848c528a 100644 --- a/Code/Game/GameLogic/Player.cpp +++ b/Code/Game/GameLogic/Player.cpp @@ -127,7 +127,7 @@ void Player::BeginFrame() } - if (key_forward <= 0.001 && key_backward <= 0.001 && key_strafeRight <= 0.001 && key_strafeLeft <= 0.001 && key_jump <= 0.001 ) //&& this->rigidBody->GetLambda() < 0.7f) + if (key_forward <= 0.001 && key_backward <= 0.001 && key_strafeRight <= 0.001 && key_strafeLeft <= 0.001 && key_jump <= 0.001 && this->rigidBody->GetLambda() < 0.7f) { /* Dampen when on the ground and not being moved by the player */ linearVelocity *= 0.2f; diff --git a/Code/Game/GameProtocols/PlayerProtocols.h b/Code/Game/GameProtocols/PlayerProtocols.h index 57137fb4..350c2cf6 100644 --- a/Code/Game/GameProtocols/PlayerProtocols.h +++ b/Code/Game/GameProtocols/PlayerProtocols.h @@ -97,6 +97,8 @@ namespace GameLogic { this->protocol[0].value = protocol_Gameplay_PlayerLeftTurn; this->protocol[0].type = ::Oyster::Network::NetAttributeType_Short; + // deltaRadian + this->protocol[1].type = ::Oyster::Network::NetAttributeType_Float; this->deltaRadian = deltaRadian; } diff --git a/Code/Misc/Input/Input.vcxproj b/Code/Misc/Input/Input.vcxproj index 8642e69e..6e945f94 100644 --- a/Code/Misc/Input/Input.vcxproj +++ b/Code/Misc/Input/Input.vcxproj @@ -28,6 +28,7 @@ + @@ -35,6 +36,7 @@ + diff --git a/Code/Misc/Input/L_inputClass.cpp b/Code/Misc/Input/L_inputClass.cpp index 03271333..c0fe6a63 100644 --- a/Code/Misc/Input/L_inputClass.cpp +++ b/Code/Misc/Input/L_inputClass.cpp @@ -189,7 +189,7 @@ float InputClass::GetPitch( ) float InputClass::GetYaw( ) { float dX = (static_cast( m_mouseState.lX)/5); - return -dX; + return dX; } bool InputClass::IsMousePressed() diff --git a/Code/Network/NetworkDependencies/ConnectionUDP.cpp b/Code/Network/NetworkDependencies/ConnectionUDP.cpp new file mode 100644 index 00000000..e7d065a6 --- /dev/null +++ b/Code/Network/NetworkDependencies/ConnectionUDP.cpp @@ -0,0 +1,218 @@ +#include "ConnectionUDP.h" + +#include + +using namespace Oyster::Network; + +ConnectionUDP::ConnectionUDP() +{ + this->ipSize = 16; + this->socket = -1; + this->stillSending = false; + this->closed = true; + this->Address = NULL; +} + +ConnectionUDP::ConnectionUDP( int socket ) +{ + this->ipSize = 16; + this->socket = socket; + this->stillSending = false; + this->closed = true; + this->Address = NULL; +} + +ConnectionUDP::~ConnectionUDP() +{ + closesocket( this->socket ); +} + +int ConnectionUDP::Connect(unsigned short port, const char serverName[]) +{ + this->port = port; + + closed = false; + stillSending = true; + + struct hostent *hostEnt; + if((hostEnt = gethostbyname(serverName)) == NULL) + { + return SOCKET_ERROR; + } + + + this->Address = *(unsigned long*)hostEnt->h_addr; + this->port = htons(this->port); + return 0; +} + +int ConnectionUDP::Disconnect() +{ + int result = closesocket(this->socket); + + if(result == SOCKET_ERROR) + { + return result; + } + + return 0; +} + +int ConnectionUDP::InitiateServer(unsigned short port) +{ + int errorCode = 0; + + if((errorCode = InitiateSocket()) != 0) + { + return errorCode; + } + + struct sockaddr_in server; + server.sin_family = AF_INET; + server.sin_addr.s_addr = INADDR_ANY; + server.sin_port = htons(port); + + if(bind(this->socket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) + { + errorCode = SOCKET_ERROR; + closesocket(this->socket); + return errorCode; + } + + closed = false; + stillSending = true; + return 0; +} + +int ConnectionUDP::InitiateClient() +{ + return InitiateSocket(); +} + +int ConnectionUDP::InitiateBroadcast(unsigned short port) +{ + int result = InitiateSocket(); + + + int flag = 1; + result = setsockopt(this->socket, /* socket affected */ + SOL_SOCKET, /* set option at TCP level */ + SO_BROADCAST, /* name of option */ + (char *) &flag, /* the cast is historical cruft */ + sizeof(flag)); /* length of option value */ + if (result < 0) + return -1; +} + +int ConnectionUDP::Send(OysterByte &bytes) +{ + int nBytes; + struct sockaddr_in reciever; + reciever.sin_family = AF_INET; + reciever.sin_addr.s_addr = this->Address; + reciever.sin_port = port; + + //printf("Send: %d\n", bytes.GetSize()); + nBytes = sendto(this->socket, + bytes, + bytes.GetSize(), + 0, + (sockaddr*)&reciever, + sizeof(sockaddr_in) + ); + + if ( nBytes != bytes.GetSize() ) + { + return nBytes; + } + + return 0; +} + +int ConnectionUDP::Recieve(OysterByte &bytes) +{ + int nBytes; + sockaddr_in from; + int fromLength = sizeof( from ); + + bytes.Resize(1000); + nBytes = recvfrom(this->socket, + bytes, + 1000, + 0, + (sockaddr*)&from, + &fromLength + ); + + + if(nBytes <= 0) + { + bytes.SetSize(0); + return WSAGetLastError(); + } + else + { + bytes.SetSize(nBytes); + } + + + //address and port of the client who sent the message + unsigned int from_address = ntohl( from.sin_addr.s_addr ); + unsigned int from_port = ntohs( from.sin_port ); + + + return 0; +} + +bool ConnectionUDP::IsSending() +{ + return stillSending; +} + +bool ConnectionUDP::IsConnected() +{ + if(closed) + { + return false; + } + + return true; +} + +int ConnectionUDP::SetBlockingMode( bool blocking ) +{ + DWORD nonBlocking; + + if(blocking) + { + nonBlocking = 0; + } + else + { + nonBlocking = 1; + } + + int result = ioctlsocket(this->socket, FIONBIO, &nonBlocking); + if(result != 0) + { + return result; + } + + //Success + return 0; +} +////////////////////////////////////// +// Private Methods +////////////////////////////////////// + +int ConnectionUDP::InitiateSocket() +{ + this->socket = (int)::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + + if(this->socket == SOCKET_ERROR) + { + return socket; + } + + return 0; +} \ No newline at end of file diff --git a/Code/Network/NetworkDependencies/ConnectionUDP.h b/Code/Network/NetworkDependencies/ConnectionUDP.h new file mode 100644 index 00000000..163ad741 --- /dev/null +++ b/Code/Network/NetworkDependencies/ConnectionUDP.h @@ -0,0 +1,57 @@ +#ifndef NETWORK_DEPENDENCIES_CONNECTIONUDP_H +#define NETWORK_DEPENDENCIES_CONNECTIONUDP_H + +////////////////////////////////// +// Created by Sam Svensson 2013 // +////////////////////////////////// + +#include "IConnection.h" +#include "../NetworkDependencies/OysterByte.h" + +namespace Oyster +{ + namespace Network + { + class ConnectionUDP : public IConnection + { + public: + ConnectionUDP(); + ConnectionUDP( int socket); + virtual ~ConnectionUDP(); + + virtual int InitiateServer( unsigned short port ); + virtual int InitiateClient(); + + virtual int InitiateBroadcast(unsigned short port); + + virtual int Send ( OysterByte &byte ); + virtual int Recieve( OysterByte &byte ); + + virtual int Connect( unsigned short port, const char serverName[] ); + + virtual int Disconnect(); + + bool IsSending(); + bool IsConnected(); + int GetIpSize(); + + int SetBlockingMode( bool blocking ); + + private: + int InitiateSocket(); + + int socket; + //char ipAddress[16]; + //unsigned short port; + int ipSize; + + unsigned long Address; + unsigned short port; + + bool stillSending; + bool closed; + }; + } +} + +#endif diff --git a/Code/Network/NetworkDependencies/NetworkDependencies.vcxproj b/Code/Network/NetworkDependencies/NetworkDependencies.vcxproj index 79521d28..9f508f0c 100644 --- a/Code/Network/NetworkDependencies/NetworkDependencies.vcxproj +++ b/Code/Network/NetworkDependencies/NetworkDependencies.vcxproj @@ -147,6 +147,7 @@ + @@ -157,6 +158,7 @@ + diff --git a/Code/Network/NetworkDependencies/NetworkDependencies.vcxproj.filters b/Code/Network/NetworkDependencies/NetworkDependencies.vcxproj.filters index 6a695e88..f24743d1 100644 --- a/Code/Network/NetworkDependencies/NetworkDependencies.vcxproj.filters +++ b/Code/Network/NetworkDependencies/NetworkDependencies.vcxproj.filters @@ -9,6 +9,7 @@ + @@ -25,5 +26,6 @@ + \ No newline at end of file diff --git a/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.cpp b/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.cpp index f2f97280..df66bc12 100644 --- a/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.cpp +++ b/Code/Physics/GamePhysics/Implementation/PhysicsAPI_Impl.cpp @@ -283,6 +283,11 @@ void API_Impl::UpdateWorld() SimpleRigidBody* simpleBody = dynamic_cast(this->customBodies[i]); this->customBodies[i]->SetGravity(-(this->customBodies[i]->GetState().centerPos - this->gravityPoint).GetNormalized()*this->gravity); simpleBody->PreStep(this->dynamicsWorld); + + if(simpleBody->GetRigidBody()->getActivationState() == ACTIVE_TAG) + { + this->customBodies[i]->CallSubscription_Move(); + } } this->dynamicsWorld->stepSimulation(this->timeStep, 1, this->timeStep); @@ -295,12 +300,7 @@ void API_Impl::UpdateWorld() btTransform trans; trans = simpleBody->GetRigidBody()->getWorldTransform(); this->customBodies[i]->SetPosition(Float3(trans.getOrigin().x(), trans.getOrigin().y(), trans.getOrigin().z())); - this->customBodies[i]->SetRotation(Quaternion(Float3(trans.getRotation().x(), trans.getRotation().y(), trans.getRotation().z()), trans.getRotation().w())); - - if(simpleBody->GetRigidBody()->getActivationState() == ACTIVE_TAG) - { - this->customBodies[i]->CallSubscription_Move(); - } + this->customBodies[i]->SetRotation(Quaternion(Float3(trans.getRotation().x(), trans.getRotation().y(), trans.getRotation().z()), trans.getRotation().w())); } int numManifolds = this->dynamicsWorld->getDispatcher()->getNumManifolds();