From 3de9a77a3e7577ce1d5c463fd817eee57ad97bc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Nie=C3=9Fner?= Date: Sun, 13 Jan 2019 13:01:22 +0100 Subject: [PATCH] Restructered project and better building --- CMakeLists.txt | 28 ++- dedicated_server/src/Constants.h | 9 + dedicated_server/src/Protocoll.h | 22 +++ dedicated_server/src/Server.cpp | 164 ++++++++++++++++++ dedicated_server/src/Server.h | 36 ++++ .../SDL2_image-2.0.3/sdl2_image-config.cmake | 4 + resources/assets/1x1black.png | Bin 0 -> 119 bytes {assets => resources/assets}/Ak 47 .png | Bin {assets => resources/assets}/Grass.png | Bin {assets => resources/assets}/Heart.png | Bin {assets => resources/assets}/Kaktus 1.png | Bin {assets => resources/assets}/Kaktus 2.png | Bin {assets => resources/assets}/Knife.png | Bin .../assets}/Menschen skizze 32x32.png | Bin {assets => resources/assets}/Rock 128x128.png | Bin {assets => resources/assets}/Rock.png | Bin {assets => resources/assets}/Shotgun.png | Bin .../assets}/Tree 2 128x128.png | Bin {assets => resources/assets}/barrel.png | Bin {assets => resources/assets}/bush.png | Bin {assets => resources/assets}/bush2.png | Bin {assets => resources/assets}/desert-001.png | Bin {assets => resources/assets}/door 2.png | Bin {assets => resources/assets}/door.png | Bin resources/assets/edge.png | Bin 0 -> 6021 bytes {assets => resources/assets}/empty heart.png | Bin {assets => resources/assets}/half Heart.png | Bin .../assets}/heal animation1.png | Bin .../assets}/heal animation2.png | Bin .../assets}/heal animation3.png | Bin {assets => resources/assets}/logo.png | Bin .../assets}/new police_officer 32x32.png | Bin {assets => resources/assets}/pistel 16x16.png | Bin .../assets}/pistole 16x16.png | Bin .../assets}/police_officer.png | Bin {assets => resources/assets}/tree 128x128.png | Bin {assets => resources/assets}/tree.png | Bin {assets => resources/assets}/wood_wall001.png | Bin {fonts => resources/fonts}/arial.ttf | Bin .../shaders}/bitmapfrag.shader | 0 .../shaders}/bitmapvert.shader | 0 {shaders => resources/shaders}/frag.shader | 0 {shaders => resources/shaders}/vert.shader | 0 src/DarkRP2D.cpp | 8 +- testClient/CMakeLists.txt | 41 +++++ testClient/src/Client.cpp | 87 ++++++++++ testClient/src/Client.h | 37 ++++ testClient/src/ClientStates.cpp | 40 +++++ testClient/src/ClientStates.h | 47 +++++ testClient/src/Constants.h | 8 + testClient/src/Protocoll.h | 22 +++ testClient/src/TestClient.cpp | 33 ++++ 52 files changed, 573 insertions(+), 13 deletions(-) create mode 100644 dedicated_server/src/Constants.h create mode 100644 dedicated_server/src/Protocoll.h create mode 100644 dedicated_server/src/Server.cpp create mode 100644 dedicated_server/src/Server.h create mode 100644 resources/assets/1x1black.png rename {assets => resources/assets}/Ak 47 .png (100%) rename {assets => resources/assets}/Grass.png (100%) rename {assets => resources/assets}/Heart.png (100%) rename {assets => resources/assets}/Kaktus 1.png (100%) rename {assets => resources/assets}/Kaktus 2.png (100%) rename {assets => resources/assets}/Knife.png (100%) rename {assets => resources/assets}/Menschen skizze 32x32.png (100%) rename {assets => resources/assets}/Rock 128x128.png (100%) rename {assets => resources/assets}/Rock.png (100%) rename {assets => resources/assets}/Shotgun.png (100%) rename {assets => resources/assets}/Tree 2 128x128.png (100%) rename {assets => resources/assets}/barrel.png (100%) rename {assets => resources/assets}/bush.png (100%) rename {assets => resources/assets}/bush2.png (100%) rename {assets => resources/assets}/desert-001.png (100%) rename {assets => resources/assets}/door 2.png (100%) rename {assets => resources/assets}/door.png (100%) create mode 100644 resources/assets/edge.png rename {assets => resources/assets}/empty heart.png (100%) rename {assets => resources/assets}/half Heart.png (100%) rename {assets => resources/assets}/heal animation1.png (100%) rename {assets => resources/assets}/heal animation2.png (100%) rename {assets => resources/assets}/heal animation3.png (100%) rename {assets => resources/assets}/logo.png (100%) rename {assets => resources/assets}/new police_officer 32x32.png (100%) rename {assets => resources/assets}/pistel 16x16.png (100%) rename {assets => resources/assets}/pistole 16x16.png (100%) rename {assets => resources/assets}/police_officer.png (100%) rename {assets => resources/assets}/tree 128x128.png (100%) rename {assets => resources/assets}/tree.png (100%) rename {assets => resources/assets}/wood_wall001.png (100%) rename {fonts => resources/fonts}/arial.ttf (100%) rename {shaders => resources/shaders}/bitmapfrag.shader (100%) rename {shaders => resources/shaders}/bitmapvert.shader (100%) rename {shaders => resources/shaders}/frag.shader (100%) rename {shaders => resources/shaders}/vert.shader (100%) create mode 100644 testClient/CMakeLists.txt create mode 100644 testClient/src/Client.cpp create mode 100644 testClient/src/Client.h create mode 100644 testClient/src/ClientStates.cpp create mode 100644 testClient/src/ClientStates.h create mode 100644 testClient/src/Constants.h create mode 100644 testClient/src/Protocoll.h create mode 100644 testClient/src/TestClient.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index c399a18..db1665a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,7 +55,8 @@ MESSAGE( STATUS "Box2D lib: " ${BOX2D_LIBRARIES} ) file(GLOB_RECURSE DarkRP2D_SOURCE_FILES ${DarkRP2D_SOURCE_DIR}/src/*.cpp) -if (${CMAKE_BUILD_TYPE} MATCHES "DEBUG") +if (${CMAKE_BUILD_TYPE} MATCHES "DEBUG") + # Include imgui to build file(GLOB IMGUI_SOURCE_FILES ${IMGUI_DIR}/*.cpp) include_directories(${IMGUI_DIR}/include) set(DarkRP2D_SOURCE_FILES ${DarkRP2D_SOURCE_FILES} ${IMGUI_SOURCE_FILES}) @@ -71,13 +72,22 @@ target_link_libraries(DarkRP2D ${SDL2_LIBRARIES} ${BOX2D_LIBRARIES} ${ENTITYX_LIBRARIES}) -add_custom_target(CopyBinaries - COMMAND ${CMAKE_COMMAND} -E copy ${SDL2_DLL} ${CMAKE_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy ${SDL2_IMAGE_DLL} ${CMAKE_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy ${FREETYPE_DLL} ${CMAKE_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy ${GLEW_DLL} ${CMAKE_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy ${BOX2D_DLL} ${CMAKE_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy ${ENTITYX_DLL} ${CMAKE_BINARY_DIR} +add_custom_command( + TARGET ${PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${SDL2_DLL} ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${FREETYPE_DLL} ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${GLEW_DLL} ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${BOX2D_DLL} ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${ENTITYX_DLL} ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${SDL2_IMAGE_DLL} ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${SDL2_PNG_DLL} ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${SDL2_ZLIB_DLL} ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "copys binaries from to ${CMAKE_CURRENT_BINARY_DIR}" ) -add_dependencies(DarkRP2D CopyBinaries) \ No newline at end of file +set (RESOURCE_DIR "${DarkRP2D_SOURCE_DIR}/resources") +add_custom_command( + TARGET ${PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory ${RESOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "copys resources from ${RESOURCE_DIR} => ${CMAKE_CURRENT_BINARY_DIR}" +) \ No newline at end of file diff --git a/dedicated_server/src/Constants.h b/dedicated_server/src/Constants.h new file mode 100644 index 0000000..129704e --- /dev/null +++ b/dedicated_server/src/Constants.h @@ -0,0 +1,9 @@ +#pragma once + +namespace constants { + + const int CLIENT_PORT = 9999; + const int MAX_CLIENTS = 128; + +} + diff --git a/dedicated_server/src/Protocoll.h b/dedicated_server/src/Protocoll.h new file mode 100644 index 0000000..dc4befe --- /dev/null +++ b/dedicated_server/src/Protocoll.h @@ -0,0 +1,22 @@ +#pragma once + +#define CONNECTION_REQUEST 0x01 +#define CONNECTION_ACCEPTED 0x02 +#define CONNECTION_DENIED 0x03 + +struct ConnectionRequest { + ConnectionRequest() : type(CONNECTION_REQUEST) {} + char type = CONNECTION_REQUEST; +}; + +struct ConnectionAccepted { + ConnectionAccepted() : type(CONNECTION_ACCEPTED) {} + char type; + int index; +}; + +struct ConnectionDenied { + ConnectionDenied() : type(CONNECTION_DENIED) {} + char type; +}; + diff --git a/dedicated_server/src/Server.cpp b/dedicated_server/src/Server.cpp new file mode 100644 index 0000000..7b29ebb --- /dev/null +++ b/dedicated_server/src/Server.cpp @@ -0,0 +1,164 @@ +#include "Server.h" +#include "Protocoll.h" + +#include +#include +#include + +Server::Server(int port) : m_maxClients(constants::MAX_CLIENTS), m_clientConnected{0} +{ + udpSocket = SDLNet_UDP_Open(port); + + if (udpSocket == nullptr) + { + std::cout << "\tSDLNet_UDP_Open failed : " << SDLNet_GetError() << std::endl; + } + std::cout << "Server was started and is listening on port: " << port << std::endl; + + //Creating ConnectionAccepted packet! + // Allocate udp packet with 512 byte size + connectionAccepted = SDLNet_AllocPacket(512); + + if (connectionAccepted == nullptr) + { + std::cout << "\tSDLNet_AllocPacket failed : " << SDLNet_GetError() << std::endl; + } + ConnectionAccepted conAcc = ConnectionAccepted(); + memcpy(connectionAccepted->data, &conAcc, sizeof(ConnectionAccepted)); + connectionAccepted->len = sizeof(ConnectionAccepted); + + connectionDenied = SDLNet_AllocPacket(512); + + if (connectionDenied == nullptr) + { + std::cout << "\tSDLNet_AllocPacket failed : " << SDLNet_GetError() << std::endl; + } + ConnectionDenied conDen = ConnectionDenied(); + memcpy(connectionDenied->data, &conDen, sizeof(ConnectionDenied)); + connectionDenied->len = sizeof(ConnectionDenied); + + //Creating receiver packet! + receivedPacket = SDLNet_AllocPacket(512); + + if (receivedPacket == nullptr) + { + std::cout << "\tSDLNet_AllocPacket failed : " << SDLNet_GetError() << std::endl; + } +} + +int Server::FindFreeClientIndex() const +{ + for (int i = 0; i < m_maxClients; ++i) + { + if (!m_clientConnected[i]) + return i; + } + return -1; +} + +int Server::FindExistingClientIndex(const IPaddress &ip) const +{ + for (int i = 0; i < m_maxClients; ++i) + { + if (m_clientConnected[i] && m_clients[i].host == ip.host && m_clients[i].port == ip.port) + return i; + } + return -1; +} + +bool Server::IsClientConnected(int clientIndex) const +{ + return m_clientConnected[clientIndex]; +} + +const IPaddress &Server::GetClientAddress(int clientIndex) const +{ + return m_clients[clientIndex]; +} + +void Server::update(unsigned int delta) +{ + //Receive packages + if (SDLNet_UDP_Recv(udpSocket, receivedPacket)) + { + switch (*(receivedPacket->data)) + { + case CONNECTION_REQUEST: + std::cout << "Connection request package received\n"; + int freeIndex; + if ((freeIndex = this->FindFreeClientIndex()) == -1) + { + std::cout << "Connection denied because server full" << std::endl; + //Send Connection denied + this->sendConnectionDenied(receivedPacket->address); + break; + } + std::cout << "Free index found: " << freeIndex << std::endl; + int indexOfExistingClient; + if ((indexOfExistingClient = FindExistingClientIndex(receivedPacket->address)) == -1) + { + std::cout << "Client doesent exist create new" << std::endl; + m_clients[freeIndex] = receivedPacket->address; + m_clientConnected[freeIndex] = true; + //Send connection accepted with index + this->sendConnectionAccepted(receivedPacket->address, freeIndex); + m_numConnectedClients++; + break; + } + else + { + std::cout << "Client exist sending accepted" << std::endl; + //Send connection accepted with index + this->sendConnectionAccepted(receivedPacket->address, indexOfExistingClient); + } + break; + default: + break; + } + } + + //Wait 10 sec + using namespace std::chrono_literals; + std::this_thread::sleep_for(1s); + + //Send data + /*for(auto &value: clients) { + value.send(this->udpSocket,*helloWorldPacket); + } + std::cout << "Data was send!!" << std::endl;*/ +} + +bool Server::sendPacket(UDPpacket &packet) +{ + // Send + // SDLNet_UDP_Send returns number of packets sent. 0 means error + if (SDLNet_UDP_Send(this->udpSocket, -1, &packet) == 0) + { + std::cout << "\tSDLNet_UDP_Send failed : " << SDLNet_GetError() << "\n" + << "==========================================================================================================\n"; + return false; + } + return true; +} + +bool Server::sendConnectionDenied(IPaddress dest) +{ + this->connectionDenied->address.host = dest.host; + this->connectionDenied->address.port = dest.port; + return this->sendPacket(*connectionDenied); +} + +bool Server::sendConnectionAccepted(IPaddress dest, int index) +{ + this->connectionAccepted->address.host = dest.host; + this->connectionAccepted->address.port = dest.port; + ((ConnectionAccepted *) connectionAccepted->data)->index = index; + return this->sendPacket(*connectionAccepted); +} + +Server::~Server() +{ + SDLNet_FreePacket(receivedPacket); + SDLNet_FreePacket(connectionAccepted); + SDLNet_UDP_Close(udpSocket); +} \ No newline at end of file diff --git a/dedicated_server/src/Server.h b/dedicated_server/src/Server.h new file mode 100644 index 0000000..fc51500 --- /dev/null +++ b/dedicated_server/src/Server.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include "Constants.h" + +class Server { + public: + Server(int port); + ~Server(); + + int FindFreeClientIndex() const; + int FindExistingClientIndex( const IPaddress &ip ) const; + bool IsClientConnected( int clientIndex ) const; + const IPaddress & GetClientAddress( int clientIndex ) const; + + void update(unsigned int delta); + + void gameTick(); + + private: + UDPsocket udpSocket; + + UDPpacket *connectionDenied; + UDPpacket *connectionAccepted; + UDPpacket *receivedPacket; + + int m_maxClients; + int m_numConnectedClients; + bool m_clientConnected[constants::MAX_CLIENTS]; + IPaddress m_clients[constants::MAX_CLIENTS]; + + bool sendPacket(UDPpacket &packet); + + bool sendConnectionDenied(IPaddress dest); + bool sendConnectionAccepted(IPaddress dest, int index); +}; \ No newline at end of file diff --git a/external/SDL2_image-2.0.3/sdl2_image-config.cmake b/external/SDL2_image-2.0.3/sdl2_image-config.cmake index b8999df..94caa20 100644 --- a/external/SDL2_image-2.0.3/sdl2_image-config.cmake +++ b/external/SDL2_image-2.0.3/sdl2_image-config.cmake @@ -4,9 +4,13 @@ set(SDL2_IMAGE_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/include") if (${CMAKE_SIZEOF_VOID_P} MATCHES 8) set(SDL2_IMAGE_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2_image.lib") set(SDL2_IMAGE_DLL "${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2_image.dll") + set(SDL2_PNG_DLL "${CMAKE_CURRENT_LIST_DIR}/lib/x64/libpng16-16.dll") + set(SDL2_ZLIB_DLL "${CMAKE_CURRENT_LIST_DIR}/lib/x64/zlib1.dll") else () set(SDL2_IMAGE_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2_image.lib") set(SDL2_IMAGE_DLL "${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2_image.dll") + set(SDL2_PNG_DLL "${CMAKE_CURRENT_LIST_DIR}/lib/x86/libpng16-16.dll") + set(SDL2_ZLIB_DLL "${CMAKE_CURRENT_LIST_DIR}/lib/x86/zlib1.dll") endif () string(STRIP "${SDL2_IMAGE_LIBRARIES}" SDL2_IMAGE_LIBRARIES) \ No newline at end of file diff --git a/resources/assets/1x1black.png b/resources/assets/1x1black.png new file mode 100644 index 0000000000000000000000000000000000000000..054c5721572600ac5598813ea7dd33592ebe3848 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2s6ii6yp7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6Fi2hlVMd9Ir``euc|2VlLnOkJ6A}_YS{N8(&i>B?vKTyF{an^L HB{Ts5v~wGc literal 0 HcmV?d00001 diff --git a/assets/Ak 47 .png b/resources/assets/Ak 47 .png similarity index 100% rename from assets/Ak 47 .png rename to resources/assets/Ak 47 .png diff --git a/assets/Grass.png b/resources/assets/Grass.png similarity index 100% rename from assets/Grass.png rename to resources/assets/Grass.png diff --git a/assets/Heart.png b/resources/assets/Heart.png similarity index 100% rename from assets/Heart.png rename to resources/assets/Heart.png diff --git a/assets/Kaktus 1.png b/resources/assets/Kaktus 1.png similarity index 100% rename from assets/Kaktus 1.png rename to resources/assets/Kaktus 1.png diff --git a/assets/Kaktus 2.png b/resources/assets/Kaktus 2.png similarity index 100% rename from assets/Kaktus 2.png rename to resources/assets/Kaktus 2.png diff --git a/assets/Knife.png b/resources/assets/Knife.png similarity index 100% rename from assets/Knife.png rename to resources/assets/Knife.png diff --git a/assets/Menschen skizze 32x32.png b/resources/assets/Menschen skizze 32x32.png similarity index 100% rename from assets/Menschen skizze 32x32.png rename to resources/assets/Menschen skizze 32x32.png diff --git a/assets/Rock 128x128.png b/resources/assets/Rock 128x128.png similarity index 100% rename from assets/Rock 128x128.png rename to resources/assets/Rock 128x128.png diff --git a/assets/Rock.png b/resources/assets/Rock.png similarity index 100% rename from assets/Rock.png rename to resources/assets/Rock.png diff --git a/assets/Shotgun.png b/resources/assets/Shotgun.png similarity index 100% rename from assets/Shotgun.png rename to resources/assets/Shotgun.png diff --git a/assets/Tree 2 128x128.png b/resources/assets/Tree 2 128x128.png similarity index 100% rename from assets/Tree 2 128x128.png rename to resources/assets/Tree 2 128x128.png diff --git a/assets/barrel.png b/resources/assets/barrel.png similarity index 100% rename from assets/barrel.png rename to resources/assets/barrel.png diff --git a/assets/bush.png b/resources/assets/bush.png similarity index 100% rename from assets/bush.png rename to resources/assets/bush.png diff --git a/assets/bush2.png b/resources/assets/bush2.png similarity index 100% rename from assets/bush2.png rename to resources/assets/bush2.png diff --git a/assets/desert-001.png b/resources/assets/desert-001.png similarity index 100% rename from assets/desert-001.png rename to resources/assets/desert-001.png diff --git a/assets/door 2.png b/resources/assets/door 2.png similarity index 100% rename from assets/door 2.png rename to resources/assets/door 2.png diff --git a/assets/door.png b/resources/assets/door.png similarity index 100% rename from assets/door.png rename to resources/assets/door.png diff --git a/resources/assets/edge.png b/resources/assets/edge.png new file mode 100644 index 0000000000000000000000000000000000000000..902bcd80165e096f5c98ef39c08bb8155a214a1a GIT binary patch literal 6021 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 literal 0 HcmV?d00001 diff --git a/assets/empty heart.png b/resources/assets/empty heart.png similarity index 100% rename from assets/empty heart.png rename to resources/assets/empty heart.png diff --git a/assets/half Heart.png b/resources/assets/half Heart.png similarity index 100% rename from assets/half Heart.png rename to resources/assets/half Heart.png diff --git a/assets/heal animation1.png b/resources/assets/heal animation1.png similarity index 100% rename from assets/heal animation1.png rename to resources/assets/heal animation1.png diff --git a/assets/heal animation2.png b/resources/assets/heal animation2.png similarity index 100% rename from assets/heal animation2.png rename to resources/assets/heal animation2.png diff --git a/assets/heal animation3.png b/resources/assets/heal animation3.png similarity index 100% rename from assets/heal animation3.png rename to resources/assets/heal animation3.png diff --git a/assets/logo.png b/resources/assets/logo.png similarity index 100% rename from assets/logo.png rename to resources/assets/logo.png diff --git a/assets/new police_officer 32x32.png b/resources/assets/new police_officer 32x32.png similarity index 100% rename from assets/new police_officer 32x32.png rename to resources/assets/new police_officer 32x32.png diff --git a/assets/pistel 16x16.png b/resources/assets/pistel 16x16.png similarity index 100% rename from assets/pistel 16x16.png rename to resources/assets/pistel 16x16.png diff --git a/assets/pistole 16x16.png b/resources/assets/pistole 16x16.png similarity index 100% rename from assets/pistole 16x16.png rename to resources/assets/pistole 16x16.png diff --git a/assets/police_officer.png b/resources/assets/police_officer.png similarity index 100% rename from assets/police_officer.png rename to resources/assets/police_officer.png diff --git a/assets/tree 128x128.png b/resources/assets/tree 128x128.png similarity index 100% rename from assets/tree 128x128.png rename to resources/assets/tree 128x128.png diff --git a/assets/tree.png b/resources/assets/tree.png similarity index 100% rename from assets/tree.png rename to resources/assets/tree.png diff --git a/assets/wood_wall001.png b/resources/assets/wood_wall001.png similarity index 100% rename from assets/wood_wall001.png rename to resources/assets/wood_wall001.png diff --git a/fonts/arial.ttf b/resources/fonts/arial.ttf similarity index 100% rename from fonts/arial.ttf rename to resources/fonts/arial.ttf diff --git a/shaders/bitmapfrag.shader b/resources/shaders/bitmapfrag.shader similarity index 100% rename from shaders/bitmapfrag.shader rename to resources/shaders/bitmapfrag.shader diff --git a/shaders/bitmapvert.shader b/resources/shaders/bitmapvert.shader similarity index 100% rename from shaders/bitmapvert.shader rename to resources/shaders/bitmapvert.shader diff --git a/shaders/frag.shader b/resources/shaders/frag.shader similarity index 100% rename from shaders/frag.shader rename to resources/shaders/frag.shader diff --git a/shaders/vert.shader b/resources/shaders/vert.shader similarity index 100% rename from shaders/vert.shader rename to resources/shaders/vert.shader diff --git a/src/DarkRP2D.cpp b/src/DarkRP2D.cpp index dd296ce..8722bea 100644 --- a/src/DarkRP2D.cpp +++ b/src/DarkRP2D.cpp @@ -26,13 +26,13 @@ void DarkRP2D::create() { std::cout << "Game got created!" << std::endl; assets = new Assets(); - assets->loadTexture("police_officer.png", true, "police_officer"); - assets->loadShader("vert.shader", "frag.shader", nullptr, "defaultShader"); - assets->loadShader("bitmapvert.shader", "bitmapfrag.shader", nullptr, "bitmapShader"); + assets->loadTexture("assets/police_officer.png", true, "police_officer"); + assets->loadShader("shaders/vert.shader", "shaders/frag.shader", nullptr, "defaultShader"); + assets->loadShader("shaders/bitmapvert.shader", "shaders/bitmapfrag.shader", nullptr, "bitmapShader"); renderer = new Renderer(); - font = new BitmapFont("arial.ttf"); + font = new BitmapFont("fonts/arial.ttf"); gameScreen = new GameScreen(renderer, assets); gameScreen->show(); diff --git a/testClient/CMakeLists.txt b/testClient/CMakeLists.txt new file mode 100644 index 0000000..8bee1e2 --- /dev/null +++ b/testClient/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.0) +project(DarkRP2D_TEST_CLIENT) +set (CMAKE_CXX_STANDARD 11) +include(ExternalProject) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE RELEASE) + add_definitions(-DNDEBUG) +endif(NOT CMAKE_BUILD_TYPE) + +MESSAGE( STATUS "PROJECT_SOURCE_DIR: " ${PROJECT_SOURCE_DIR} ) +MESSAGE( STATUS "DarkRP2D_TEST_CLIENT_SOURCE_DIR: " ${DarkRP2D_TEST_CLIENT_SOURCE_DIR} ) + +set(DarkRP2D_EXTERNAL_DIR ${DarkRP2D_TEST_CLIENT_SOURCE_DIR}/../external) +set(SDL2_net_DIR ${DarkRP2D_EXTERNAL_DIR}/SDL2_net-2.0.1) +set(SDL2_DIR ${DarkRP2D_EXTERNAL_DIR}/SDL2-2.0.8) + +#Libs + +find_package(SDL2 REQUIRED CONFIG) +include_directories(${SDL2_INCLUDE_DIRS}) + +find_package(SDL2_net REQUIRED CONFIG) +include_directories(${SDL2_NET_INCLUDE_DIRS}) + +MESSAGE( STATUS "SDL2 Lib: " ${SDL2_LIBRARIES} ) +MESSAGE( STATUS "SDL2_NET Lib: " ${SDL2_NET_LIBRARIES} ) + +file(GLOB_RECURSE DarkRP2D_TEST_CLIENT_SOURCE_FILES ${DarkRP2D_TEST_CLIENT_SOURCE_DIR}/src/*.cpp) + +add_executable(DarkRP2DTestClient ${DarkRP2D_TEST_CLIENT_SOURCE_FILES}) + +target_link_libraries(DarkRP2DTestClient ${SDL2_LIBRARIES} + ${SDL2_NET_LIBRARIES} ) + +add_custom_target(CopyBinaries + COMMAND ${CMAKE_COMMAND} -E copy ${SDL2_DLL} ${CMAKE_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${SDL2_NET_DLL} ${CMAKE_BINARY_DIR} +) + +add_dependencies(DarkRP2DTestClient CopyBinaries) \ No newline at end of file diff --git a/testClient/src/Client.cpp b/testClient/src/Client.cpp new file mode 100644 index 0000000..79211ea --- /dev/null +++ b/testClient/src/Client.cpp @@ -0,0 +1,87 @@ +#include "Client.h" +#include "Constants.h" +#include "Protocoll.h" + +#include +#include + +Client::Client(std::string _serverIP, int port) : connected(new Connected(this)), + connecting(new Connecting(this)), + disconnected(new Disconnected(this)) +{ + + udpSocket = SDLNet_UDP_Open(constants::CLIENT_PORT); + + if (udpSocket == nullptr) + { + std::cout << "\tSDLNet_UDP_Open failed : " << SDLNet_GetError() << std::endl; + } + + // Set IP and port number with correct endianess + if (SDLNet_ResolveHost(&serverIP, _serverIP.c_str(), port) == -1) + { + std::cout << "\tSDLNet_ResolveHost failed : " << SDLNet_GetError() << std::endl; + } + + connectionRequest = SDLNet_AllocPacket(512); + + if (connectionRequest == nullptr) + { + std::cout << "\tSDLNet_AllocPacket failed : " << SDLNet_GetError() << std::endl; + } + ConnectionRequest conReq = ConnectionRequest(); + memcpy(connectionRequest->data, &conReq, sizeof(ConnectionRequest)); + connectionRequest->len = sizeof(ConnectionRequest); + + receivedPacket = SDLNet_AllocPacket(512); + + if (receivedPacket == nullptr) + { + std::cout << "\tSDLNet_AllocPacket failed : " << SDLNet_GetError() << std::endl; + } + + this->setClientState(connecting); +} + +void Client::setClientState(ClientState *state) +{ + std::cout << "State changed!" << std::endl; + currentState = state; +} + +void Client::update(unsigned int delta) +{ + currentState->update(delta); + using namespace std::chrono_literals; + std::this_thread::sleep_for(2s); +} + +bool Client::sendConnectionRequest(IPaddress dest) +{ + connectionRequest->address.host = dest.host; + connectionRequest->address.port = dest.port; + return this->sendPacket(*connectionRequest); +} + +bool Client::sendPacket(UDPpacket &packet) +{ + // Send + // SDLNet_UDP_Send returns number of packets sent. 0 means error + if (SDLNet_UDP_Send(this->udpSocket, -1, &packet) == 0) + { + std::cout << "\tSDLNet_UDP_Send failed : " << SDLNet_GetError() << "\n" + << "==========================================================================================================\n"; + return false; + } + return true; +} + +Client::~Client() +{ + delete connected; + delete connecting; + delete disconnected; + SDLNet_FreePacket(connectionRequest); + SDLNet_FreePacket(receivedPacket); + SDLNet_UDP_Close(udpSocket); +} \ No newline at end of file diff --git a/testClient/src/Client.h b/testClient/src/Client.h new file mode 100644 index 0000000..08351d1 --- /dev/null +++ b/testClient/src/Client.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + +class Client; + +#include "ClientStates.h" + + +class Client { + public: + Client(std::string serverIP, int port); + ~Client(); + + Client(const Client&) = delete; + + void setClientState(ClientState *state); + + void update(unsigned int delta); + + + bool sendConnectionRequest(IPaddress dest); + bool sendPacket(UDPpacket &packet); + + UDPsocket udpSocket; + IPaddress serverIP; + + UDPpacket *connectionRequest; + UDPpacket *receivedPacket; + + ClientState *currentState; + + Connected *connected; + Connecting *connecting; + Disconnected *disconnected; +}; \ No newline at end of file diff --git a/testClient/src/ClientStates.cpp b/testClient/src/ClientStates.cpp new file mode 100644 index 0000000..1fdc541 --- /dev/null +++ b/testClient/src/ClientStates.cpp @@ -0,0 +1,40 @@ +#include "ClientStates.h" + +#include "Protocoll.h" + +#include + +void Connecting::update(unsigned int delta) +{ + std::cout << "Connecting.. (Sending Request)" << std::endl; + m_client->sendConnectionRequest(m_client->serverIP); + if (SDLNet_UDP_Recv(m_client->udpSocket, m_client->receivedPacket)) + { + std::cout << "Something received.." << std::endl; + switch (*(m_client->receivedPacket->data)) + { + case CONNECTION_ACCEPTED: + { + int index = ((ConnectionAccepted *)(m_client->receivedPacket->data))->index; + std::cout << "Server accepted Connection! My Index ist: " << index << std::endl; + m_client->setClientState(m_client->connected); + } + break; + case CONNECTION_DENIED: + std::cout << "Server denied Connection!" << std::endl; + m_client->setClientState(m_client->disconnected); + default: + break; + } + } +} + +void Connected::update(unsigned int delta) +{ + std::cout << "I AM IN CONNECTED STATE!" << std::endl; +} + +void Disconnected::update(unsigned int delta) +{ + std::cout << "I AM IN DISCONNECTED STATE!" << std::endl; +} \ No newline at end of file diff --git a/testClient/src/ClientStates.h b/testClient/src/ClientStates.h new file mode 100644 index 0000000..9a4bb9e --- /dev/null +++ b/testClient/src/ClientStates.h @@ -0,0 +1,47 @@ +#pragma once + +class ClientState; + +class Connecting; +class Connected; +class Disconnected; + +#include "Client.h" + +class ClientState +{ + public: + virtual void update(unsigned int delta) = 0; +}; + +class Connecting : public ClientState { + public: + Connecting(Client *client) : m_client(client) {} + + virtual void update(unsigned int delta) override; + + private: + Client *m_client; +}; + +class Connected : public ClientState +{ + public: + Connected(Client *client) : m_client(client) {} + + virtual void update(unsigned int delta) override; + + private: + Client *m_client; +}; + +class Disconnected : public ClientState +{ + public: + Disconnected(Client *client) : m_client(client) {} + + virtual void update(unsigned int delta) override; + + private: + Client *m_client; +}; diff --git a/testClient/src/Constants.h b/testClient/src/Constants.h new file mode 100644 index 0000000..b8bf19e --- /dev/null +++ b/testClient/src/Constants.h @@ -0,0 +1,8 @@ +#pragma once + +namespace constants { + + const int CLIENT_PORT = 9999; + +} + diff --git a/testClient/src/Protocoll.h b/testClient/src/Protocoll.h new file mode 100644 index 0000000..dc4befe --- /dev/null +++ b/testClient/src/Protocoll.h @@ -0,0 +1,22 @@ +#pragma once + +#define CONNECTION_REQUEST 0x01 +#define CONNECTION_ACCEPTED 0x02 +#define CONNECTION_DENIED 0x03 + +struct ConnectionRequest { + ConnectionRequest() : type(CONNECTION_REQUEST) {} + char type = CONNECTION_REQUEST; +}; + +struct ConnectionAccepted { + ConnectionAccepted() : type(CONNECTION_ACCEPTED) {} + char type; + int index; +}; + +struct ConnectionDenied { + ConnectionDenied() : type(CONNECTION_DENIED) {} + char type; +}; + diff --git a/testClient/src/TestClient.cpp b/testClient/src/TestClient.cpp new file mode 100644 index 0000000..3868fd0 --- /dev/null +++ b/testClient/src/TestClient.cpp @@ -0,0 +1,33 @@ +#include +#include + +#include "Client.h" + +int main(int argc, char *argv[]) +{ + std::cout << "Starting DarkRP2D Client..." << std::endl; + + if (SDLNet_Init() < 0) + { + fprintf(stderr, "SDLNet_Init: %s\n", SDLNet_GetError()); + exit(EXIT_FAILURE); + } + + bool clientQuit = false; + { + Client client("127.0.0.1",12000); + unsigned int lastTime = SDL_GetTicks(), currentTime, elapsedTime; + while (!clientQuit) + { + currentTime = SDL_GetTicks(); + elapsedTime = currentTime - lastTime; + lastTime = currentTime; + client.update(elapsedTime); + } + } + + SDLNet_Quit(); + std::cout << "Client closed!" << std::endl; + + return EXIT_SUCCESS; +} \ No newline at end of file