From 68d8b748d2d3a0fefe1f754c60dcf87ae58df515 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 13 May 2023 10:49:50 +1000 Subject: [PATCH] Allow blocking sockets --- src/Camera.c | 20 ++++++++++---------- src/Camera.h | 2 +- src/Game.c | 1 + src/Input.c | 8 -------- src/Menus.c | 20 ++++++++++---------- src/Platform.h | 4 ++-- src/Platform_3DS.c | 10 +++++----- src/Platform_PSP.c | 8 +++++--- src/Platform_Posix.c | 10 +++++++--- src/Platform_Web.c | 2 +- src/Platform_WinApi.c | 9 ++++++--- src/Server.c | 2 +- 12 files changed, 49 insertions(+), 47 deletions(-) diff --git a/src/Camera.c b/src/Camera.c index 06b170056..d26853c20 100644 --- a/src/Camera.c +++ b/src/Camera.c @@ -17,23 +17,23 @@ static struct RayTracer cameraClipPos; static Vec2 cam_rotOffset; static cc_bool cam_isForwardThird; static float cam_deltaX, cam_deltaY; +static double last_time; static void Camera_OnRawMovement(float deltaX, float deltaY) { cam_deltaX += deltaX; cam_deltaY += deltaY; } -void Camera_KeyLookUpdate(cc_bool up, cc_bool down, cc_bool right, cc_bool left) { - static TimeMS last_now = 0; - TimeMS now = DateTime_CurrentUTC_MS(); - +void Camera_KeyLookUpdate(void) { + if (Gui.InputGrab) return; // divide by 25 to have reasonable sensitivity for default mouse sens - float delta = (Camera.Sensitivity / 25.0f) * (float)(now - last_now); - if (up) cam_deltaY -= delta; - if (down) cam_deltaY += delta; - if (right) cam_deltaX += delta; - if (left) cam_deltaX -= delta; + float delta = (Camera.Sensitivity / 25.0f) * (1000 * (Game.Time - last_time)); - last_now = now; + if (KeyBind_IsPressed(KEYBIND_LOOK_UP)) cam_deltaY -= delta; + if (KeyBind_IsPressed(KEYBIND_LOOK_DOWN)) cam_deltaY += delta; + if (KeyBind_IsPressed(KEYBIND_LOOK_LEFT)) cam_deltaX -= delta; + if (KeyBind_IsPressed(KEYBIND_LOOK_RIGHT)) cam_deltaX += delta; + + last_time = Game.Time; } /*########################################################################################################################* diff --git a/src/Camera.h b/src/Camera.h index 0235d9ca5..a8d901f4f 100644 --- a/src/Camera.h +++ b/src/Camera.h @@ -80,5 +80,5 @@ CC_API void Camera_Register(struct Camera* camera); void Camera_CheckFocus(void); void Camera_UpdateProjection(void); void Camera_SetFov(int fov); -void Camera_KeyLookUpdate(cc_bool up, cc_bool down, cc_bool right, cc_bool left); +void Camera_KeyLookUpdate(void); #endif diff --git a/src/Game.c b/src/Game.c index b39c52f19..67aebd3ae 100644 --- a/src/Game.c +++ b/src/Game.c @@ -490,6 +490,7 @@ static void Game_Render3D(double delta, float t) { Selections_Render(); Entities_RenderHoveredNames(); + Camera_KeyLookUpdate(); InputHandler_Tick(); if (!Game_HideGui) HeldBlockRenderer_Render(delta); } diff --git a/src/Input.c b/src/Input.c index 879a96c17..319283784 100644 --- a/src/Input.c +++ b/src/Input.c @@ -774,17 +774,9 @@ void InputHandler_Tick(void) { if (Gui.InputGrab) return; cc_bool left, middle, right; - cc_bool look_up, look_down, look_right, look_left; TimeMS now = DateTime_CurrentUTC_MS(); int delta = (int)(now - input_lastClick); - look_up = KeyBind_IsPressed(KEYBIND_LOOK_UP); - look_down = KeyBind_IsPressed(KEYBIND_LOOK_DOWN); - look_right = KeyBind_IsPressed(KEYBIND_LOOK_RIGHT); - look_left = KeyBind_IsPressed(KEYBIND_LOOK_LEFT); - - Camera_KeyLookUpdate(look_up, look_down, look_right, look_left); - if (delta < 250) return; /* 4 times per second */ input_lastClick = now; diff --git a/src/Menus.c b/src/Menus.c index efc322515..01ca938e7 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -1935,8 +1935,8 @@ static void KeyBindsScreen_Show(int bindsCount, const cc_uint8* binds, const cha *-----------------------------------------------ClassicKeyBindsScreen--------------------------------------------------* *#########################################################################################################################*/ void ClassicKeyBindingsScreen_Show(void) { - static const cc_uint8 binds[10] = { KEYBIND_FORWARD, KEYBIND_BACK, KEYBIND_JUMP, KEYBIND_CHAT, KEYBIND_SET_SPAWN, KEYBIND_LEFT, KEYBIND_RIGHT, KEYBIND_INVENTORY, KEYBIND_FOG, KEYBIND_RESPAWN }; - static const char* const descs[10] = { "Forward", "Back", "Jump", "Chat", "Save location", "Left", "Right", "Build", "Toggle fog", "Load location" }; + static const cc_uint8 binds[] = { KEYBIND_FORWARD, KEYBIND_BACK, KEYBIND_JUMP, KEYBIND_CHAT, KEYBIND_SET_SPAWN, KEYBIND_LEFT, KEYBIND_RIGHT, KEYBIND_INVENTORY, KEYBIND_FOG, KEYBIND_RESPAWN }; + static const char* const descs[] = { "Forward", "Back", "Jump", "Chat", "Save location", "Left", "Right", "Build", "Toggle fog", "Load location" }; if (Game_ClassicHacks) { KeyBindsScreen_Reset(NULL, Menu_SwitchKeysClassicHacks, 260); @@ -1966,8 +1966,8 @@ void ClassicHacksKeyBindingsScreen_Show(void) { *-----------------------------------------------NormalKeyBindingsScreen---------------------------------------------------* *#########################################################################################################################*/ void NormalKeyBindingsScreen_Show(void) { - static const cc_uint8 binds[12] = { KEYBIND_FORWARD, KEYBIND_BACK, KEYBIND_JUMP, KEYBIND_CHAT, KEYBIND_SET_SPAWN, KEYBIND_TABLIST, KEYBIND_LEFT, KEYBIND_RIGHT, KEYBIND_INVENTORY, KEYBIND_FOG, KEYBIND_RESPAWN, KEYBIND_SEND_CHAT }; - static const char* const descs[12] = { "Forward", "Back", "Jump", "Chat", "Set spawn", "Player list", "Left", "Right", "Inventory", "Toggle fog", "Respawn", "Send chat" }; + static const cc_uint8 binds[] = { KEYBIND_FORWARD, KEYBIND_BACK, KEYBIND_JUMP, KEYBIND_CHAT, KEYBIND_SET_SPAWN, KEYBIND_TABLIST, KEYBIND_LEFT, KEYBIND_RIGHT, KEYBIND_INVENTORY, KEYBIND_FOG, KEYBIND_RESPAWN, KEYBIND_SEND_CHAT }; + static const char* const descs[] = { "Forward", "Back", "Jump", "Chat", "Set spawn", "Player list", "Left", "Right", "Inventory", "Toggle fog", "Respawn", "Send chat" }; KeyBindsScreen_Reset(NULL, Menu_SwitchKeysHacks, 250); KeyBindsScreen_SetLayout(-140, 10, 6); @@ -1979,8 +1979,8 @@ void NormalKeyBindingsScreen_Show(void) { *------------------------------------------------HacksKeyBindingsScreen---------------------------------------------------* *#########################################################################################################################*/ void HacksKeyBindingsScreen_Show(void) { - static const cc_uint8 binds[8] = { KEYBIND_SPEED, KEYBIND_NOCLIP, KEYBIND_HALF_SPEED, KEYBIND_ZOOM_SCROLL, KEYBIND_FLY, KEYBIND_FLY_UP, KEYBIND_FLY_DOWN, KEYBIND_THIRD_PERSON }; - static const char* const descs[8] = { "Speed", "Noclip", "Half speed", "Scroll zoom", "Fly", "Fly up", "Fly down", "Third person" }; + static const cc_uint8 binds[] = { KEYBIND_SPEED, KEYBIND_NOCLIP, KEYBIND_HALF_SPEED, KEYBIND_ZOOM_SCROLL, KEYBIND_FLY, KEYBIND_FLY_UP, KEYBIND_FLY_DOWN, KEYBIND_THIRD_PERSON }; + static const char* const descs[] = { "Speed", "Noclip", "Half speed", "Scroll zoom", "Fly", "Fly up", "Fly down", "Third person" }; KeyBindsScreen_Reset(Menu_SwitchKeysNormal, Menu_SwitchKeysOther, 260); KeyBindsScreen_SetLayout(-40, 10, 4); @@ -1992,8 +1992,8 @@ void HacksKeyBindingsScreen_Show(void) { *------------------------------------------------OtherKeyBindingsScreen---------------------------------------------------* *#########################################################################################################################*/ void OtherKeyBindingsScreen_Show(void) { - static const cc_uint8 binds[12] = { KEYBIND_EXT_INPUT, KEYBIND_HIDE_FPS, KEYBIND_HIDE_GUI, KEYBIND_HOTBAR_SWITCH, KEYBIND_DROP_BLOCK,KEYBIND_SCREENSHOT, KEYBIND_FULLSCREEN, KEYBIND_AXIS_LINES, KEYBIND_AUTOROTATE, KEYBIND_SMOOTH_CAMERA, KEYBIND_IDOVERLAY, KEYBIND_BREAK_LIQUIDS }; - static const char* const descs[12] = { "Show ext input", "Hide FPS", "Hide gui", "Hotbar switching", "Drop block", "Screenshot", "Fullscreen", "Show axis lines", "Auto-rotate", "Smooth camera", "ID overlay", "Breakable liquids" }; + static const cc_uint8 binds[] = { KEYBIND_EXT_INPUT, KEYBIND_HIDE_FPS, KEYBIND_HIDE_GUI, KEYBIND_HOTBAR_SWITCH, KEYBIND_DROP_BLOCK,KEYBIND_SCREENSHOT, KEYBIND_FULLSCREEN, KEYBIND_AXIS_LINES, KEYBIND_AUTOROTATE, KEYBIND_SMOOTH_CAMERA, KEYBIND_IDOVERLAY, KEYBIND_BREAK_LIQUIDS }; + static const char* const descs[] = { "Show ext input", "Hide FPS", "Hide gui", "Hotbar switching", "Drop block", "Screenshot", "Fullscreen", "Show axis lines", "Auto-rotate", "Smooth camera", "ID overlay", "Breakable liquids" }; KeyBindsScreen_Reset(Menu_SwitchKeysHacks, Menu_SwitchKeysMouse, 260); KeyBindsScreen_SetLayout(-140, 10, 6); @@ -2005,8 +2005,8 @@ void OtherKeyBindingsScreen_Show(void) { *------------------------------------------------MouseKeyBindingsScreen---------------------------------------------------* *#########################################################################################################################*/ void MouseKeyBindingsScreen_Show(void) { - static const cc_uint8 binds[7] = { KEYBIND_DELETE_BLOCK, KEYBIND_PICK_BLOCK, KEYBIND_PLACE_BLOCK, KEYBIND_LOOK_UP, KEYBIND_LOOK_DOWN, KEYBIND_LOOK_LEFT, KEYBIND_LOOK_RIGHT }; - static const char* const descs[7] = { "Delete block", "Pick block", "Place block", "Look Up", "Look Down", "Look Left", "Look Right" }; + static const cc_uint8 binds[] = { KEYBIND_DELETE_BLOCK, KEYBIND_PICK_BLOCK, KEYBIND_PLACE_BLOCK, KEYBIND_LOOK_UP, KEYBIND_LOOK_DOWN, KEYBIND_LOOK_LEFT, KEYBIND_LOOK_RIGHT }; + static const char* const descs[] = { "Delete block", "Pick block", "Place block", "Look Up", "Look Down", "Look Left", "Look Right" }; KeyBindsScreen_Reset(Menu_SwitchKeysOther, NULL, 260); KeyBindsScreen_SetLayout(-140, 10, 3); diff --git a/src/Platform.h b/src/Platform.h index 400d2c31e..0fccc6a78 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -241,8 +241,8 @@ cc_result Socket_CheckWritable(cc_socket s, cc_bool* writable); /* Returns non-zero if the given address is valid for a socket to connect to */ int Socket_ValidAddress(const cc_string* address); -/* Allocates a new non-blocking socket and then begins connecting to the given address:port. */ -cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port); +/* Allocates a new socket and then begins connecting to the given address:port. */ +cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port, cc_bool nonblocking); /* Attempts to read data from the given socket. */ /* NOTE: A closed socket may set modified to 0, but still return 'success' (i.e. 0) */ cc_result Socket_Read(cc_socket s, cc_uint8* data, cc_uint32 count, cc_uint32* modified); diff --git a/src/Platform_3DS.c b/src/Platform_3DS.c index 57f2dca4a..7de7c902f 100644 --- a/src/Platform_3DS.c +++ b/src/Platform_3DS.c @@ -354,10 +354,9 @@ int Socket_ValidAddress(const cc_string* address) { return ParseAddress(&addr, address); } -cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port) { +cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port, cc_bool nonblocking) { union SocketAddress addr; cc_result res; - int flags; *s = -1; if (!ParseAddress(&addr, address)) @@ -366,9 +365,10 @@ cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port) { *s = socket(AF_INET, SOCK_STREAM, 0); // https://www.3dbrew.org/wiki/SOCU:socket if (*s == -1) return errno; - // non blocking mode - flags = fcntl(*s, F_GETFL, 0); - if (flags >= 0) fcntl(*s, F_SETFL, flags | O_NONBLOCK); + if (nonblocking) { + int flags = fcntl(*s, F_GETFL, 0); + if (flags >= 0) fcntl(*s, F_SETFL, flags | O_NONBLOCK); + } addr.v4.sin_family = AF_INET; addr.v4.sin_port = htons(port); diff --git a/src/Platform_PSP.c b/src/Platform_PSP.c index fa99a5174..877ad9602 100644 --- a/src/Platform_PSP.c +++ b/src/Platform_PSP.c @@ -347,7 +347,7 @@ int Socket_ValidAddress(const cc_string* address) { return ParseAddress(&addr, address); } -cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port) { +cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port, cc_bool nonblocking) { union SocketAddress addr; int res; @@ -357,8 +357,10 @@ cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port) { *s = sceNetInetSocket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (*s < 0) return sceNetInetGetErrno(); - int on = 1; - sceNetInetSetsockopt(*s, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(int)); + if (nonblocking) { + int on = 1; + sceNetInetSetsockopt(*s, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(int)); + } addr.v4.sin_family = AF_INET; addr.v4.sin_port = htons(port); diff --git a/src/Platform_Posix.c b/src/Platform_Posix.c index 932574aae..27b2e20ad 100644 --- a/src/Platform_Posix.c +++ b/src/Platform_Posix.c @@ -529,8 +529,8 @@ int Socket_ValidAddress(const cc_string* address) { return ParseAddress(&addr, address); } -cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port) { - int family, addrSize = 0, blocking_raw = -1; /* non-blocking mode */ +cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port, cc_bool nonblocking) { + int family, addrSize = 0; union SocketAddress addr; cc_result res; @@ -540,7 +540,11 @@ cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port) { *s = socket(family, SOCK_STREAM, IPPROTO_TCP); if (*s == -1) return errno; - ioctl(*s, FIONBIO, &blocking_raw); + + if (nonblocking) { + int blocking_raw = -1; /* non-blocking mode */ + ioctl(*s, FIONBIO, &blocking_raw); + } #ifdef AF_INET6 if (family == AF_INET6) { diff --git a/src/Platform_Web.c b/src/Platform_Web.c index d2dd0fe08..187b61cc9 100644 --- a/src/Platform_Web.c +++ b/src/Platform_Web.c @@ -256,7 +256,7 @@ int Socket_ValidAddress(const cc_string* address) { return true; } extern int interop_SocketCreate(void); extern int interop_SocketConnect(int sock, const char* addr, int port); -cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port) { +cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port, cc_bool nonblocking) { char addr[NATIVE_STR_LEN]; int res; String_EncodeUtf8(addr, address); diff --git a/src/Platform_WinApi.c b/src/Platform_WinApi.c index a54691acd..9341b5ace 100644 --- a/src/Platform_WinApi.c +++ b/src/Platform_WinApi.c @@ -498,8 +498,7 @@ int Socket_ValidAddress(const cc_string* address) { return Socket_ParseAddress(&addr, &addrSize, address, 0); } -cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port) { - int blockingMode = -1; /* non-blocking mode */ +cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port, cc_bool nonblocking) { SOCKADDR_STORAGE addr; cc_result res; INT addrSize; @@ -510,7 +509,11 @@ cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port) { *s = _socket(addr.ss_family, SOCK_STREAM, IPPROTO_TCP); if (*s == -1) return _WSAGetLastError(); - _ioctlsocket(*s, FIONBIO, &blockingMode); + + if (nonblocking) { + int blockingMode = -1; /* non-blocking mode */ + _ioctlsocket(*s, FIONBIO, &blockingMode); + } res = _connect(*s, (SOCKADDR*)&addr, addrSize); return res == -1 ? _WSAGetLastError() : 0; diff --git a/src/Server.c b/src/Server.c index df41000f4..b81611ab6 100644 --- a/src/Server.c +++ b/src/Server.c @@ -283,7 +283,7 @@ static void MPConnection_BeginConnect(void) { Blocks.CanPlace[BLOCK_STILL_WATER] = false; Blocks.CanDelete[BLOCK_STILL_WATER] = false; Blocks.CanPlace[BLOCK_BEDROCK] = false; Blocks.CanDelete[BLOCK_BEDROCK] = false; - res = Socket_Connect(&net_socket, &Server.Address, Server.Port); + res = Socket_Connect(&net_socket, &Server.Address, Server.Port, true); if (res == ERR_INVALID_ARGUMENT) { static const cc_string reason = String_FromConst("Invalid IP address"); MPConnection_Fail(&reason);