void Game::SendFinishRace()
{
	PacketStream PS;

	ENUM_Event e = FINISHEDRACE;
	PS.writeInt(e);

	e = ENDOFMESSAGE;
	PS.writeInt(e);

	// get the data from the stream
	char data[100];
	PS.toCharArray(data);

	// send the data
	Net::GetInstance()->SendData(data,"127.0.0.1",m_sendToPort);

	// increment num packets sent
	m_numPacketsSent++;

	m_raceFinished = true;
	if(m_host)
	{
		m_hostWon = true;
	}
	else
	{
		m_hostWon = false;
	}
}
void Game::SendStartRace()
{
	PacketStream PS;

	ENUM_Event e = STARTRACE;
	PS.writeInt(e);

	e = ENDOFMESSAGE;
	PS.writeInt(e);

	// get the data from the stream
	char data[100];
	PS.toCharArray(data);

	// send the data
	Net::GetInstance()->SendData(data,"127.0.0.1",m_sendToPort);

	// increment num packets sent
	m_numPacketsSent++;

}
void Game::SendMyCarData()
{
			PacketStream PS;
			//===================== send data ==================================
			ENUM_Event e = STATEDATA;
			PS.writeInt(e);

			// write the xy values to the stream
			PS.writeFloat(m_pMyCar->X());
			PS.writeFloat(m_pMyCar->Y());

			// write the angle of rotation to the stream
			PS.writeFloat(m_pMyCar->GetAngleY());

			// write the direction and topspeed variables to the stream
			PS.writeFloat(m_pMyCar->DirectionX());
			PS.writeFloat(m_pMyCar->DirectionY());
			PS.writeFloat(m_pMyCar->TopSpeed());
			PS.writeFloat(m_pMyCar->Speed());
			PS.writeFloat(m_pMyCar->Friction());

			e = ENDOFMESSAGE;
			PS.writeInt(e);

			// get the data from the stream
			char data[100];
			PS.toCharArray(data);

			// send the data
			Net::GetInstance()->SendData(data,"127.0.0.1",m_sendToPort);

			// update the time of the packet sent - for interpolate
			m_lastPacketSentTime = GetTickCount();

			// increment the number of packets sent
			m_numPacketsSent++;

			//===================================================================
}
/**
* Game update function
* @param pStream the packet stream to write state data to (if playing multiplayer)
*/
void Game::update(PacketStream* pStream) {

	//cout << "update" << endl;

	// timer
	g_timeNow = s3eTimerGetMs();
	g_deltaTime = float( (g_timeNow - g_prevTime) * 0.001 );
	// Time since last packet was sent
	timeSinceLastSend += g_timeNow - g_prevTime;
	g_prevTime = g_timeNow;

	if(mStage == Constants::INGAME) {

		for(int i = 0; i < bufferSize; i++) {
	
			mMessageReceived[i] = 0;
			mMessageSent[i] = 0;
		}

		if(mPlayer->getHealth() <= 0) {
			mPlayer->loadCheckpoint = true;
			mPlayer->mPos = CIwSVec2(mCheckpoint.x, mCheckpoint.y);

			// Create respawn effect
			CIwSVec2 screenCentre = CIwSVec2((int16)Iw2DGetSurfaceWidth() >> 1, (int16)Iw2DGetSurfaceHeight() >> 1);
			CIwSVec2 pos = screenCentre + (CIwSVec2(int16(mCheckpoint.x*8), -int16(mCheckpoint.y*8)));

			createEffect(CIwSVec2(pos.x, pos.y), 10, "Images/respawn.png", 1.0f);
		}

		if(mSpawnPickup == true) {
		
			mLevel->createPickup(mPickupSpawnType, mPickupSpawnPoint.x, mPickupSpawnPoint.y);
			mSpawnPickup = false;
		}

		if(!mPaused) {
			mTimeTaken += g_deltaTime;
		}

		// Sync clients if multiplayer
		if(mMultiplayer) {

			// Packet rate modification
			if(timeSinceLastSend >= 1000/30) {

				pStream->writeInt(Constants::UPDATE);

				// Dead reckoning
				if( abs(mDRPlayer->getBody()->GetPosition().Length() - mPlayer->getBody()->GetPosition().Length()) >= 1 ) {

					pStream->writeInt(Constants::DRUPDATE);
					mPlayer->serialize(pStream);
					mRDXVel = mPlayer->getBody()->GetLinearVelocity().x;

					mDRPlayer->getBody()->SetTransform(mPlayer->getBody()->GetPosition(), 0.0f);
					mDRPlayer->getBody()->SetLinearVelocity(b2Vec2(mRDXVel, mPlayer->getBody()->GetLinearVelocity().y));
				}
				else {
					pStream->writeInt(Constants::UPDATE);
				}

				if(mHost) {
					// Serialize level
					mLevel->serialize(pStream);
				}

				pStream->writeChar('\0');
				pStream->toCharArray(mMessageSent);
				mMessageSent[strlen(mMessageSent)-1] = '\0';

				//cout << "SENDING: " << mMessageSent << endl;
				// Send data
				s3eSocketSendTo(mSock, mMessageSent, strlen(mMessageSent), 0, &mDest_addr);

				timeSinceLastSend = 0;
			}

			// Recieve data
			mBytesRecieved = s3eSocketRecvFrom(mSock, mMessageReceived, sizeof(mMessageReceived), 0, &mDest_addr);
		

			if(mBytesRecieved != -1) {
				cout << "RECIEVING: " << mMessageReceived << endl;
				pStream->fromCharArray(mMessageReceived);

				int type;
				pStream->readInt(type);

				while (type) {
					cout << "checking message types" << endl;
					if(type == Constants::UPDATE) {

						int updateType;
						pStream->readInt(updateType);

						if(updateType == Constants::DRUPDATE) {

							mOtherPlayer->deserialize(pStream);
							mRecRDXVel = mOtherPlayer->getBody()->GetLinearVelocity().x;
						}
						else {
							if(!mHost) {
								// Deserialize the level
								mLevel->deserialize(pStream);
							}
						}
					}
					else if(type == Constants::DESTROY) {
					
						int id;
						pStream->readInt(id);

						mLevel->killEnemy(id);
					}
					else if(type == Constants::DESTROYPICKUP) {
					
						int id;
						pStream->readInt(id);

						mLevel->destroyPickup(id);
					}
					else if(type == Constants::CREATEPICKUP) {
					
						int type, x, y, id;
						pStream->readInt(type);
						pStream->readInt(id); // Clients sends -1
						pStream->readInt(x);
						pStream->readInt(y);

						mLevel->createPickup(type, x, y);

						if(mHost) {
							// Send create to peer
							// Send Id of created pickup
							PacketStream s;
							s.writeInt(Constants::CREATEPICKUP);
							s.writeInt(mLevel->getPickups().back()->getID());
							s.writeInt(type);
							s.writeFloat(x);
							s.writeFloat(y);
							s.writeChar('\0');

							char message[10];
							s.toCharArray(message);
							message[strlen(message)-1] = '\0';

							s3eSocketSendTo(mSock, message, strlen(message), 0, &mDest_addr);
						}
						else {
							// Set id of pickup if client if client
							mLevel->getPickups().back()->setID(id);
						}
					}
					else if(type == Constants::CREATECRATE) {
				
						int type, id;
						float x, y;
						//pStream->readInt(id);
						pStream->readInt(type);
						pStream->readFloat(x);
						pStream->readFloat(y);

						if(mHost) {
						
							mLevel->createCrate(type, x, y);
							crateSpawned = true;

							PacketStream s;
							s.writeInt(Constants::CREATECRATE);
							//s.writeInt(mLevel->getCrates().back()->getID());
							s.writeInt(type);
							s.writeFloat(x);
							s.writeFloat(y);
							s.writeChar('\0');

							char message[10];
							s.toCharArray(message);
							message[strlen(message)-1] = '\0';

							//s3eSocketSendTo(mSock, message, strlen(message), 0, mDest_addr);
						}
						else {
							mLevel->createCrate(type, x, y);
							//mLevel->getCrates().back()->setID(id);
							crateSpawned = true;
						}
					}
					else if(type == Constants::TOGGLEPLATFORM) {
						int id;

						pStream->readInt(id);
						mLevel->getActivatablePlatforms().at(id)->toggle();
					}
					else if(type == Constants::ACTION) {

						int action;
						pStream->readInt(action);

						//Punch
						if(action == 0) {
						
							// Play punch animation
							mOtherPlayer->punch();

							vector<Enemy*> enemies = mLevel->getEnemies();
							b2Body* player = mOtherPlayer->getBody();

							for(int i = 0; i < enemies.size(); i++) {				
								if( abs((enemies.at(i)->getBody()->GetPosition() - player->GetPosition()).Length()) <= 10) {
									short direction = 1;

									if(enemies.at(i)->getBody()->GetPosition().x < player->GetPosition().x) {
										direction = -1;
									}

									b2Vec2 force = b2Vec2(50000*direction, 0);
									enemies.at(i)->getBody()->ApplyForce(force, enemies.at(i)->getBody()->GetWorldCenter());
									enemies.at(i)->ApplyDamage(mOtherPlayer->getMeleeStr());

									CIwSVec2 screenCentre = CIwSVec2((int16)Iw2DGetSurfaceWidth() >> 1, (int16)Iw2DGetSurfaceHeight() >> 1);

									b2Transform t = enemies.at(i)->getBody()->GetTransform();
									CIwSVec2 pos = screenCentre + (CIwSVec2(int16(t.p.x*8), -int16(t.p.y*8)));

									createEffect(pos, 8 , "Images/blood.png", 1.0f);
								}
							}
						}
						//Kick
						else if(action == 1) {