From 55a7a979552da57d68fd99d80319e2c10226ce82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Nie=C3=9Fner?= Date: Thu, 31 May 2018 13:42:25 +0200 Subject: [PATCH] Skeleton DarkRPServer --- dedicated_server/CMakeLists.txt | 41 ++ .../src/DarkRP2DDedicatedServer.cpp | 85 ++++ external/SDL2_net-2.0.1/CHANGES.txt | 54 +++ external/SDL2_net-2.0.1/COPYING.txt | 20 + external/SDL2_net-2.0.1/README.txt | 27 ++ external/SDL2_net-2.0.1/include/SDL_net.h | 443 ++++++++++++++++++ external/SDL2_net-2.0.1/lib/x64/SDL2_net.dll | Bin 0 -> 48640 bytes external/SDL2_net-2.0.1/lib/x64/SDL2_net.lib | Bin 0 -> 9584 bytes external/SDL2_net-2.0.1/lib/x86/SDL2_net.dll | Bin 0 -> 44032 bytes external/SDL2_net-2.0.1/lib/x86/SDL2_net.lib | Bin 0 -> 9758 bytes external/SDL2_net-2.0.1/sdl2_net-config.cmake | 12 + src/screens/GameScreen.cpp | 1 + 12 files changed, 683 insertions(+) create mode 100644 dedicated_server/CMakeLists.txt create mode 100644 dedicated_server/src/DarkRP2DDedicatedServer.cpp create mode 100644 external/SDL2_net-2.0.1/CHANGES.txt create mode 100644 external/SDL2_net-2.0.1/COPYING.txt create mode 100644 external/SDL2_net-2.0.1/README.txt create mode 100644 external/SDL2_net-2.0.1/include/SDL_net.h create mode 100644 external/SDL2_net-2.0.1/lib/x64/SDL2_net.dll create mode 100644 external/SDL2_net-2.0.1/lib/x64/SDL2_net.lib create mode 100644 external/SDL2_net-2.0.1/lib/x86/SDL2_net.dll create mode 100644 external/SDL2_net-2.0.1/lib/x86/SDL2_net.lib create mode 100644 external/SDL2_net-2.0.1/sdl2_net-config.cmake diff --git a/dedicated_server/CMakeLists.txt b/dedicated_server/CMakeLists.txt new file mode 100644 index 0000000..2b194a1 --- /dev/null +++ b/dedicated_server/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.0) +project(DarkRP2D_DEDICATED_SERVER) +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_DEDICATED_SERVER_SOURCE_DIR: " ${DarkRP2D_DEDICATED_SERVER_SOURCE_DIR} ) + +set(DarkRP2D_EXTERNAL_DIR ${DarkRP2D_DEDICATED_SERVER_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_DEDICATED_SERVER_SOURCE_FILES ${DarkRP2D_DEDICATED_SERVER_SOURCE_DIR}/src/*.cpp) + +add_executable(DarkRP2DDServer ${DarkRP2D_DEDICATED_SERVER_SOURCE_FILES}) + +target_link_libraries(DarkRP2DDServer ${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(DarkRP2DDServer CopyBinaries) \ No newline at end of file diff --git a/dedicated_server/src/DarkRP2DDedicatedServer.cpp b/dedicated_server/src/DarkRP2DDedicatedServer.cpp new file mode 100644 index 0000000..9fa1483 --- /dev/null +++ b/dedicated_server/src/DarkRP2DDedicatedServer.cpp @@ -0,0 +1,85 @@ +#include +#include + +#include +#include + +#include + +int main(int argc, char *argv[]) +{ + TCPsocket sd, csd; /* Socket descriptor, Client socket descriptor */ + IPaddress ip, *remoteIP; + int quit, quit2; + char buffer[512]; + + std::cout << "Starting DarkRP2D Server..." << std::endl; + + if (SDLNet_Init() < 0) + { + fprintf(stderr, "SDLNet_Init: %s\n", SDLNet_GetError()); + exit(EXIT_FAILURE); + } + + /* Resolving the host using NULL make network interface to listen */ + if (SDLNet_ResolveHost(&ip, NULL, 9999) < 0) + { + fprintf(stderr, "SDLNet_ResolveHost: %s\n", SDLNet_GetError()); + exit(EXIT_FAILURE); + } + + /* Open a connection with the IP provided (listen on the host's port) */ + if (!(sd = SDLNet_TCP_Open(&ip))) + { + fprintf(stderr, "SDLNet_TCP_Open: %s\n", SDLNet_GetError()); + exit(EXIT_FAILURE); + } + + std::cout << "DarkRP2D Server started." << std::endl; + std::cout << "Waiting for a Connection!" << std::endl; + + /* Wait for a connection, send data and term */ quit = 0; + while (!quit) + { /* This check the sd if there is a pending connection. * If there is one, accept that, and open a new socket for communicating */ + if ((csd = SDLNet_TCP_Accept(sd))) + { /* Now we can communicate with the client using csd socket * sd will remain opened waiting other connections */ + + /* Get the remote address */ + if ((remoteIP = SDLNet_TCP_GetPeerAddress(csd))) /* Print the address, converting in the host format */ + printf("Host connected: %x %d\n", SDLNet_Read32(&remoteIP->host), SDLNet_Read16(&remoteIP->port)); + else + fprintf(stderr, "SDLNet_TCP_GetPeerAddress: %s\n", SDLNet_GetError()); + + quit2 = 0; + while (!quit2) + { + if (SDLNet_TCP_Recv(csd, buffer, 512) > 0) + { + printf("Client say: %s\n", buffer); + + if (strcmp(buffer, "exit") == 0) /* Terminate this connection */ + { + quit2 = 1; + printf("Terminate connection\n"); + } + if (strcmp(buffer, "quit") == 0) /* Quit the program */ + { + quit2 = 1; + quit = 1; + printf("Quit program\n"); + } + } + } + + /* Close the client socket */ SDLNet_TCP_Close(csd); + } + } + std::cout << "Server is closing..." << std::endl; + SDLNet_TCP_Close(sd); + SDLNet_Quit(); + std::cout << "Server closed!" << std::endl; + + return EXIT_SUCCESS; + + return 0; +} \ No newline at end of file diff --git a/external/SDL2_net-2.0.1/CHANGES.txt b/external/SDL2_net-2.0.1/CHANGES.txt new file mode 100644 index 0000000..6a2ae52 --- /dev/null +++ b/external/SDL2_net-2.0.1/CHANGES.txt @@ -0,0 +1,54 @@ +2.0.1: +Mārtiņš Možeiko - Fri Sep 27 23:26:33 2013 + * Fixed returning all IP addresses from SDLNet_GetLocalAddresses() on Windows + +2.0.0: +Sam Lantinga - Sat Jun 1 19:11:26 PDT 2013 + * Updated for SDL 2.0 release + +1.2.9: +Simeon Maxein - Mon Jul 2 08:02:57 EDT 2012 + * Made it possible to use SDL_net without SDL + +1.2.8: +Sam Lantinga - Sun Jan 15 01:39:35 EST 2012 + * Added the definition for INADDR_LOOPBACK +Sam Lantinga - Thu Jan 05 22:57:56 2012 -0500 + * Added an Xcode project for iOS +Sam Lantinga - Sat Dec 31 10:28:12 EST 2011 + * SDL_net is now under the zlib license +Sam Lantinga - Sun Nov 20 01:29:33 EST 2011 + * Added SDLNet_UDP_SetPacketLoss() to simulate random packet loss +Sam Lantinga - Fri Nov 04 04:52:12 2011 -0400 + * Added SDLNet_GetLocalAddresses() to query local interfaces +Sam Lantinga - Fri Nov 4 04:05:03 EDT 2011 + * Removed obsolete OpenTransport code +Sam Lantinga - Tue Mar 08 16:52:59 2011 -0800 + * Added Android.mk to build on the Android platform +Sam Lantinga - Sun Feb 27 10:00:53 PST 2011 + * Fixed to compile cleanly with g++ +C.W. Betts - Thu Feb 17 12:52:47 PST 2011 + * Fixed the code to use socklen_t where appropriate +Evan Nemerson - Thu Feb 17 12:47:13 PST 2011 + * Added pkg-config support +esigra - Mon Feb 16 20:59:55 PST 2009 + * Fixed C++ compilation with -Wold-style-cast +Matthew Mondor - Fri Jan 4 08:44:22 PST 2008 + * Enable multicast receiving on 224.0.0.1 on Windows (already worked on UNIX) + +1.2.7: +Joakim L. Gilje - Sat Jul 14 22:54:37 PDT 2007 + * Set server TCP sockets to blocking mode on Mac OS X, Solaris, etc. + +1.2.6: +Sam Lantinga - Sun Apr 30 01:48:40 PDT 2006 + * Added gcc-fat.sh for generating Universal binaries on Mac OS X + * Updated libtool support to version 1.5.22 +Sam Lantinga - Wed Nov 19 00:23:44 PST 2003 + * Updated libtool support for new mingw32 DLL build process +Shard - Thu, 05 Jun 2003 09:30:20 -0500 + * Fixed compiling on BeOS, which may not have SO_BROADCAST +Kyle Davenport - Sat, 19 Apr 2003 17:13:31 -0500 + * Added .la files to the development RPM, fixing RPM build on RedHat 8 + +1.2.5: diff --git a/external/SDL2_net-2.0.1/COPYING.txt b/external/SDL2_net-2.0.1/COPYING.txt new file mode 100644 index 0000000..29a889c --- /dev/null +++ b/external/SDL2_net-2.0.1/COPYING.txt @@ -0,0 +1,20 @@ +/* + SDL_net: An example cross-platform network library for use with SDL + Copyright (C) 1997-2016 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ diff --git a/external/SDL2_net-2.0.1/README.txt b/external/SDL2_net-2.0.1/README.txt new file mode 100644 index 0000000..5508207 --- /dev/null +++ b/external/SDL2_net-2.0.1/README.txt @@ -0,0 +1,27 @@ + +SDL_net 2.0 + +The latest version of this library is available from: +http://www.libsdl.org/projects/SDL_net/ + +This is an example portable network library for use with SDL. +It is available under the zlib license, found in the file COPYING.txt. +The API can be found in the file SDL_net.h +This library supports UNIX, Windows, MacOS Classic, MacOS X, +BeOS and QNX. + +The demo program is a chat client and server. +The chat client requires the sample GUI library available at: +http://www.libsdl.org/projects/GUIlib/ +The chat client connects to the server via TCP, registering itself. +The server sends back a list of connected clients, and keeps the +client updated with the status of other clients. +Every line of text from a client is sent via UDP to every other client. + +Note that this isn't necessarily how you would want to write a chat +program, but it demonstrates how to use the basic features of the +network library. + +Enjoy! + -Sam Lantinga and Roy Wood + diff --git a/external/SDL2_net-2.0.1/include/SDL_net.h b/external/SDL2_net-2.0.1/include/SDL_net.h new file mode 100644 index 0000000..bd5ec7f --- /dev/null +++ b/external/SDL2_net-2.0.1/include/SDL_net.h @@ -0,0 +1,443 @@ +/* + SDL_net: An example cross-platform network library for use with SDL + Copyright (C) 1997-2016 Sam Lantinga + Copyright (C) 2012 Simeon Maxein + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/* $Id$ */ + +#ifndef _SDL_NET_H +#define _SDL_NET_H + +#ifdef WITHOUT_SDL +#include +typedef uint8_t Uint8; +typedef uint16_t Uint16; +typedef uint32_t Uint32; + +typedef struct SDLNet_version { + Uint8 major; + Uint8 minor; + Uint8 patch; +} SDLNet_version; + +#else /* WITHOUT_SDL */ + +#include "SDL.h" +#include "SDL_endian.h" +#include "SDL_version.h" + +typedef SDL_version SDLNet_version; + +#endif /* WITHOUT_SDL */ + +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL +*/ +#define SDL_NET_MAJOR_VERSION 2 +#define SDL_NET_MINOR_VERSION 0 +#define SDL_NET_PATCHLEVEL 1 + +/* This macro can be used to fill a version structure with the compile-time + * version of the SDL_net library. + */ +#define SDL_NET_VERSION(X) \ +{ \ + (X)->major = SDL_NET_MAJOR_VERSION; \ + (X)->minor = SDL_NET_MINOR_VERSION; \ + (X)->patch = SDL_NET_PATCHLEVEL; \ +} + +/* This function gets the version of the dynamically linked SDL_net library. + it should NOT be used to fill a version structure, instead you should + use the SDL_NET_VERSION() macro. + */ +extern DECLSPEC const SDLNet_version * SDLCALL SDLNet_Linked_Version(void); + +/* Initialize/Cleanup the network API + SDL must be initialized before calls to functions in this library, + because this library uses utility functions from the SDL library. +*/ +extern DECLSPEC int SDLCALL SDLNet_Init(void); +extern DECLSPEC void SDLCALL SDLNet_Quit(void); + +/***********************************************************************/ +/* IPv4 hostname resolution API */ +/***********************************************************************/ + +typedef struct { + Uint32 host; /* 32-bit IPv4 host address */ + Uint16 port; /* 16-bit protocol port */ +} IPaddress; + +/* Resolve a host name and port to an IP address in network form. + If the function succeeds, it will return 0. + If the host couldn't be resolved, the host portion of the returned + address will be INADDR_NONE, and the function will return -1. + If 'host' is NULL, the resolved host will be set to INADDR_ANY. + */ +#ifndef INADDR_ANY +#define INADDR_ANY 0x00000000 +#endif +#ifndef INADDR_NONE +#define INADDR_NONE 0xFFFFFFFF +#endif +#ifndef INADDR_LOOPBACK +#define INADDR_LOOPBACK 0x7f000001 +#endif +#ifndef INADDR_BROADCAST +#define INADDR_BROADCAST 0xFFFFFFFF +#endif +extern DECLSPEC int SDLCALL SDLNet_ResolveHost(IPaddress *address, const char *host, Uint16 port); + +/* Resolve an ip address to a host name in canonical form. + If the ip couldn't be resolved, this function returns NULL, + otherwise a pointer to a static buffer containing the hostname + is returned. Note that this function is not thread-safe. +*/ +extern DECLSPEC const char * SDLCALL SDLNet_ResolveIP(const IPaddress *ip); + +/* Get the addresses of network interfaces on this system. + This returns the number of addresses saved in 'addresses' + */ +extern DECLSPEC int SDLCALL SDLNet_GetLocalAddresses(IPaddress *addresses, int maxcount); + +/***********************************************************************/ +/* TCP network API */ +/***********************************************************************/ + +typedef struct _TCPsocket *TCPsocket; + +/* Open a TCP network socket + If ip.host is INADDR_NONE or INADDR_ANY, this creates a local server + socket on the given port, otherwise a TCP connection to the remote + host and port is attempted. The address passed in should already be + swapped to network byte order (addresses returned from + SDLNet_ResolveHost() are already in the correct form). + The newly created socket is returned, or NULL if there was an error. +*/ +extern DECLSPEC TCPsocket SDLCALL SDLNet_TCP_Open(IPaddress *ip); + +/* Accept an incoming connection on the given server socket. + The newly created socket is returned, or NULL if there was an error. +*/ +extern DECLSPEC TCPsocket SDLCALL SDLNet_TCP_Accept(TCPsocket server); + +/* Get the IP address of the remote system associated with the socket. + If the socket is a server socket, this function returns NULL. +*/ +extern DECLSPEC IPaddress * SDLCALL SDLNet_TCP_GetPeerAddress(TCPsocket sock); + +/* Send 'len' bytes of 'data' over the non-server socket 'sock' + This function returns the actual amount of data sent. If the return value + is less than the amount of data sent, then either the remote connection was + closed, or an unknown socket error occurred. +*/ +extern DECLSPEC int SDLCALL SDLNet_TCP_Send(TCPsocket sock, const void *data, + int len); + +/* Receive up to 'maxlen' bytes of data over the non-server socket 'sock', + and store them in the buffer pointed to by 'data'. + This function returns the actual amount of data received. If the return + value is less than or equal to zero, then either the remote connection was + closed, or an unknown socket error occurred. +*/ +extern DECLSPEC int SDLCALL SDLNet_TCP_Recv(TCPsocket sock, void *data, int maxlen); + +/* Close a TCP network socket */ +extern DECLSPEC void SDLCALL SDLNet_TCP_Close(TCPsocket sock); + + +/***********************************************************************/ +/* UDP network API */ +/***********************************************************************/ + +/* The maximum channels on a a UDP socket */ +#define SDLNET_MAX_UDPCHANNELS 32 +/* The maximum addresses bound to a single UDP socket channel */ +#define SDLNET_MAX_UDPADDRESSES 4 + +typedef struct _UDPsocket *UDPsocket; +typedef struct { + int channel; /* The src/dst channel of the packet */ + Uint8 *data; /* The packet data */ + int len; /* The length of the packet data */ + int maxlen; /* The size of the data buffer */ + int status; /* packet status after sending */ + IPaddress address; /* The source/dest address of an incoming/outgoing packet */ +} UDPpacket; + +/* Allocate/resize/free a single UDP packet 'size' bytes long. + The new packet is returned, or NULL if the function ran out of memory. + */ +extern DECLSPEC UDPpacket * SDLCALL SDLNet_AllocPacket(int size); +extern DECLSPEC int SDLCALL SDLNet_ResizePacket(UDPpacket *packet, int newsize); +extern DECLSPEC void SDLCALL SDLNet_FreePacket(UDPpacket *packet); + +/* Allocate/Free a UDP packet vector (array of packets) of 'howmany' packets, + each 'size' bytes long. + A pointer to the first packet in the array is returned, or NULL if the + function ran out of memory. + */ +extern DECLSPEC UDPpacket ** SDLCALL SDLNet_AllocPacketV(int howmany, int size); +extern DECLSPEC void SDLCALL SDLNet_FreePacketV(UDPpacket **packetV); + + +/* Open a UDP network socket + If 'port' is non-zero, the UDP socket is bound to a local port. + The 'port' should be given in native byte order, but is used + internally in network (big endian) byte order, in addresses, etc. + This allows other systems to send to this socket via a known port. +*/ +extern DECLSPEC UDPsocket SDLCALL SDLNet_UDP_Open(Uint16 port); + +/* Set the percentage of simulated packet loss for packets sent on the socket. +*/ +extern DECLSPEC void SDLCALL SDLNet_UDP_SetPacketLoss(UDPsocket sock, int percent); + +/* Bind the address 'address' to the requested channel on the UDP socket. + If the channel is -1, then the first unbound channel that has not yet + been bound to the maximum number of addresses will be bound with + the given address as it's primary address. + If the channel is already bound, this new address will be added to the + list of valid source addresses for packets arriving on the channel. + If the channel is not already bound, then the address becomes the primary + address, to which all outbound packets on the channel are sent. + This function returns the channel which was bound, or -1 on error. +*/ +extern DECLSPEC int SDLCALL SDLNet_UDP_Bind(UDPsocket sock, int channel, const IPaddress *address); + +/* Unbind all addresses from the given channel */ +extern DECLSPEC void SDLCALL SDLNet_UDP_Unbind(UDPsocket sock, int channel); + +/* Get the primary IP address of the remote system associated with the + socket and channel. If the channel is -1, then the primary IP port + of the UDP socket is returned -- this is only meaningful for sockets + opened with a specific port. + If the channel is not bound and not -1, this function returns NULL. + */ +extern DECLSPEC IPaddress * SDLCALL SDLNet_UDP_GetPeerAddress(UDPsocket sock, int channel); + +/* Send a vector of packets to the the channels specified within the packet. + If the channel specified in the packet is -1, the packet will be sent to + the address in the 'src' member of the packet. + Each packet will be updated with the status of the packet after it has + been sent, -1 if the packet send failed. + This function returns the number of packets sent. +*/ +extern DECLSPEC int SDLCALL SDLNet_UDP_SendV(UDPsocket sock, UDPpacket **packets, int npackets); + +/* Send a single packet to the specified channel. + If the channel specified in the packet is -1, the packet will be sent to + the address in the 'src' member of the packet. + The packet will be updated with the status of the packet after it has + been sent. + This function returns 1 if the packet was sent, or 0 on error. + + NOTE: + The maximum size of the packet is limited by the MTU (Maximum Transfer Unit) + of the transport medium. It can be as low as 250 bytes for some PPP links, + and as high as 1500 bytes for ethernet. +*/ +extern DECLSPEC int SDLCALL SDLNet_UDP_Send(UDPsocket sock, int channel, UDPpacket *packet); + +/* Receive a vector of pending packets from the UDP socket. + The returned packets contain the source address and the channel they arrived + on. If they did not arrive on a bound channel, the the channel will be set + to -1. + The channels are checked in highest to lowest order, so if an address is + bound to multiple channels, the highest channel with the source address + bound will be returned. + This function returns the number of packets read from the network, or -1 + on error. This function does not block, so can return 0 packets pending. +*/ +extern DECLSPEC int SDLCALL SDLNet_UDP_RecvV(UDPsocket sock, UDPpacket **packets); + +/* Receive a single packet from the UDP socket. + The returned packet contains the source address and the channel it arrived + on. If it did not arrive on a bound channel, the the channel will be set + to -1. + The channels are checked in highest to lowest order, so if an address is + bound to multiple channels, the highest channel with the source address + bound will be returned. + This function returns the number of packets read from the network, or -1 + on error. This function does not block, so can return 0 packets pending. +*/ +extern DECLSPEC int SDLCALL SDLNet_UDP_Recv(UDPsocket sock, UDPpacket *packet); + +/* Close a UDP network socket */ +extern DECLSPEC void SDLCALL SDLNet_UDP_Close(UDPsocket sock); + + +/***********************************************************************/ +/* Hooks for checking sockets for available data */ +/***********************************************************************/ + +typedef struct _SDLNet_SocketSet *SDLNet_SocketSet; + +/* Any network socket can be safely cast to this socket type */ +typedef struct _SDLNet_GenericSocket { + int ready; +} *SDLNet_GenericSocket; + +/* Allocate a socket set for use with SDLNet_CheckSockets() + This returns a socket set for up to 'maxsockets' sockets, or NULL if + the function ran out of memory. + */ +extern DECLSPEC SDLNet_SocketSet SDLCALL SDLNet_AllocSocketSet(int maxsockets); + +/* Add a socket to a set of sockets to be checked for available data */ +extern DECLSPEC int SDLCALL SDLNet_AddSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock); +SDL_FORCE_INLINE int SDLNet_TCP_AddSocket(SDLNet_SocketSet set, TCPsocket sock) +{ + return SDLNet_AddSocket(set, (SDLNet_GenericSocket)sock); +} +SDL_FORCE_INLINE int SDLNet_UDP_AddSocket(SDLNet_SocketSet set, UDPsocket sock) +{ + return SDLNet_AddSocket(set, (SDLNet_GenericSocket)sock); +} + + +/* Remove a socket from a set of sockets to be checked for available data */ +extern DECLSPEC int SDLCALL SDLNet_DelSocket(SDLNet_SocketSet set, SDLNet_GenericSocket sock); +SDL_FORCE_INLINE int SDLNet_TCP_DelSocket(SDLNet_SocketSet set, TCPsocket sock) +{ + return SDLNet_DelSocket(set, (SDLNet_GenericSocket)sock); +} +SDL_FORCE_INLINE int SDLNet_UDP_DelSocket(SDLNet_SocketSet set, UDPsocket sock) +{ + return SDLNet_DelSocket(set, (SDLNet_GenericSocket)sock); +} + +/* This function checks to see if data is available for reading on the + given set of sockets. If 'timeout' is 0, it performs a quick poll, + otherwise the function returns when either data is available for + reading, or the timeout in milliseconds has elapsed, which ever occurs + first. This function returns the number of sockets ready for reading, + or -1 if there was an error with the select() system call. +*/ +extern DECLSPEC int SDLCALL SDLNet_CheckSockets(SDLNet_SocketSet set, Uint32 timeout); + +/* After calling SDLNet_CheckSockets(), you can use this function on a + socket that was in the socket set, to find out if data is available + for reading. +*/ +#define SDLNet_SocketReady(sock) _SDLNet_SocketReady((SDLNet_GenericSocket)(sock)) +SDL_FORCE_INLINE int _SDLNet_SocketReady(SDLNet_GenericSocket sock) +{ + return (sock != NULL) && (sock->ready); +} + +/* Free a set of sockets allocated by SDL_NetAllocSocketSet() */ +extern DECLSPEC void SDLCALL SDLNet_FreeSocketSet(SDLNet_SocketSet set); + +/***********************************************************************/ +/* Error reporting functions */ +/***********************************************************************/ + +extern DECLSPEC void SDLCALL SDLNet_SetError(const char *fmt, ...); +extern DECLSPEC const char * SDLCALL SDLNet_GetError(void); + +/***********************************************************************/ +/* Inline functions to read/write network data */ +/***********************************************************************/ + +/* Warning, some systems have data access alignment restrictions */ +#if defined(sparc) || defined(mips) || defined(__arm__) +#define SDL_DATA_ALIGNED 1 +#endif +#ifndef SDL_DATA_ALIGNED +#define SDL_DATA_ALIGNED 0 +#endif + +/* Write a 16/32-bit value to network packet buffer */ +#define SDLNet_Write16(value, areap) _SDLNet_Write16(value, areap) +#define SDLNet_Write32(value, areap) _SDLNet_Write32(value, areap) + +/* Read a 16/32-bit value from network packet buffer */ +#define SDLNet_Read16(areap) _SDLNet_Read16(areap) +#define SDLNet_Read32(areap) _SDLNet_Read32(areap) + +#if !defined(WITHOUT_SDL) && !SDL_DATA_ALIGNED + +SDL_FORCE_INLINE void _SDLNet_Write16(Uint16 value, void *areap) +{ + *(Uint16 *)areap = SDL_SwapBE16(value); +} + +SDL_FORCE_INLINE void _SDLNet_Write32(Uint32 value, void *areap) +{ + *(Uint32 *)areap = SDL_SwapBE32(value); +} + +SDL_FORCE_INLINE Uint16 _SDLNet_Read16(const void *areap) +{ + return SDL_SwapBE16(*(const Uint16 *)areap); +} + +SDL_FORCE_INLINE Uint32 _SDLNet_Read32(const void *areap) +{ + return SDL_SwapBE32(*(const Uint32 *)areap); +} + +#else /* !defined(WITHOUT_SDL) && !SDL_DATA_ALIGNED */ + +SDL_FORCE_INLINE void _SDLNet_Write16(Uint16 value, void *areap) +{ + Uint8 *area = (Uint8*)areap; + area[0] = (value >> 8) & 0xFF; + area[1] = value & 0xFF; +} + +SDL_FORCE_INLINE void _SDLNet_Write32(Uint32 value, void *areap) +{ + Uint8 *area = (Uint8*)areap; + area[0] = (value >> 24) & 0xFF; + area[1] = (value >> 16) & 0xFF; + area[2] = (value >> 8) & 0xFF; + area[3] = value & 0xFF; +} + +SDL_FORCE_INLINE Uint16 _SDLNet_Read16(void *areap) +{ + Uint8 *area = (Uint8*)areap; + return ((Uint16)area[0]) << 8 | ((Uint16)area[1]); +} + +SDL_FORCE_INLINE Uint32 _SDLNet_Read32(const void *areap) +{ + const Uint8 *area = (const Uint8*)areap; + return ((Uint32)area[0]) << 24 | ((Uint32)area[1]) << 16 | ((Uint32)area[2]) << 8 | ((Uint32)area[3]); +} + +#endif /* !defined(WITHOUT_SDL) && !SDL_DATA_ALIGNED */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_NET_H */ diff --git a/external/SDL2_net-2.0.1/lib/x64/SDL2_net.dll b/external/SDL2_net-2.0.1/lib/x64/SDL2_net.dll new file mode 100644 index 0000000000000000000000000000000000000000..5f1db497efc56333b27763d891629c26b8b005c5 GIT binary patch literal 48640 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%0D5z1Am6{Ul)EI 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 literal 0 HcmV?d00001 diff --git a/external/SDL2_net-2.0.1/lib/x86/SDL2_net.dll b/external/SDL2_net-2.0.1/lib/x86/SDL2_net.dll new file mode 100644 index 0000000000000000000000000000000000000000..0cc7853ef2c364858111ff294a1eaedbae533a4a GIT binary patch literal 44032 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 Wr?@(SC9-6e(%RC}`hWTF4Ezgk%lT#i literal 0 HcmV?d00001 diff --git a/external/SDL2_net-2.0.1/lib/x86/SDL2_net.lib b/external/SDL2_net-2.0.1/lib/x86/SDL2_net.lib new file mode 100644 index 0000000000000000000000000000000000000000..f26eb3bd9f0b1f53f06775ae9dd5f3e1e48fd4b2 GIT binary patch literal 9758 zcmcgx&2JM|5T7Ka5H~;w`Tlegr@)2g!%jn0Rr#V#gh^88qY@Vr>}|0yab$-GRY+Vb z)B{rQIaY`hCxm)w4xBjjz@Y~Y2vr;qe*=Qf?7sERn|-^ranhA0>z(<%_j?~R@6CG| z{CcyPx&BS$i>UsL#S>#wqvP?3xUL^npW~xns-IUQ0I&?u{1~9+H9%`GK=-~Qea`?$ zy0#tZ-atJ{Pu!8-HvlAkR~+eji8z#zStXC~jncE{NH21cv_EyE4eKT8c&KCw-zc5$ z92vL|K+^v}3EKKm209&y<^f0s-aFFv3hP7Z>~^Gg7x_@yQ;u}rLp{pSs3U_503R%hw%oxtNs}W(*sr0zbb9gf%5rKgJ%4d^F15I_wwy|@&L_vy zTh!ZYjZ2<|}TW~6Ii zSm`p_dP%iQ04qz*BgfI{fvp!vF+VP_JU65uH#60!^sGjMpSl%5^%=!fIiom-DaGSv zfY&X!|F#0`<9__C4`90sU;}^0djQ__0$f4eOVrJd06aq3LwyAGPumgO2Jo;0U<&0O z?)Ucx03P(?H%ce|&PM^>V9EDHd7@UBU&l;@SL_GrtEAj*xK zo3Npw(M&8gDG#I0x~{)1p`u1!@lT+s8$JuO+ZFr zY81gk8$|#^qeyLNl&h8wMS3TgeT`KiZP14&RBm`{1Hv3W`>8vhwXWUzDYoi-Vm^UCesw?8dm5T& z&*!q6JDag_*MzAF{Dtz5QZ(Ru8bI|H2 zK8i}JkRF0G-fp>^%M=Tx!jC)Av#E2@aC<$Ci5O|FyBfQH)Wil?6DJHRJWRsVkRFq$@uB}Dg9|>#$~m={((qY>s^>5T##v7DH9G!L(U@K^_wWp|MRYcCdf-geuR8I7h{UTNyi4&$);^VJ zRQ#i&9tJQ`>^CtcaoFKBReNe!?~XH0`wUeZlbhxWZ^5fA%t5_zR7bNz<2ot0FqyB3 zD-p7KHfvn$AXyt@$m()RXDpvjHNxswmyq?k#m|TrPBrp{tSqM)U->+((eaOp;x1%& zXk~2dn9eD*zE;E+GMa6I&pBvobXCvZWWZ>i#mH+HeBuDF5%Z6V`We7W`$LD|weJNu zLG_~=!qzF+?CXX@W9t%Z_HD(Xv2`;xx*M@?Y-(c*@y{N?cG&*eEBO8||LhaIhwGpH zg6#nOGh_}23~V*$pCQo~6?_K}4`cRgS6yOi ig#4qD6+0f#Pr8eVF+TThl-K_enRN);h-8y#TI65%GS{mB literal 0 HcmV?d00001 diff --git a/external/SDL2_net-2.0.1/sdl2_net-config.cmake b/external/SDL2_net-2.0.1/sdl2_net-config.cmake new file mode 100644 index 0000000..71f188a --- /dev/null +++ b/external/SDL2_net-2.0.1/sdl2_net-config.cmake @@ -0,0 +1,12 @@ +set(SDL2_NET_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/include") + +# Support both 32 and 64 bit builds +if (${CMAKE_SIZEOF_VOID_P} MATCHES 8) + set(SDL2_NET_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2_net.lib") + set(SDL2_NET_DLL "${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2_net.dll") +else () + set(SDL2_NET_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2_net.lib") + set(SDL2_NET_DLL "${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2_net.dll") +endif () + +string(STRIP "${SDL2_NET_LIBRARIES}" SDL2_NET_LIBRARIES) \ No newline at end of file diff --git a/src/screens/GameScreen.cpp b/src/screens/GameScreen.cpp index bfbee17..c261625 100644 --- a/src/screens/GameScreen.cpp +++ b/src/screens/GameScreen.cpp @@ -39,6 +39,7 @@ GameScreen::GameScreen(Renderer *renderer, Assets *assets) ex.systems.add(); ex.systems.add(renderer,camera,assets); ex.systems.configure(); + } GameScreen::~GameScreen()