Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
forked-from-1kasper committed Jan 8, 2024
1 parent 247f2ca commit f3b62df
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 82 deletions.
6 changes: 3 additions & 3 deletions include/BetterSpades/ping.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ struct ping_entry {

void ping_init();
void ping_deinit();
void ping_check(char* addr, int port, char* aos);
void* ping_update(void* data);
void ping_start(void (*result)(void*, float, char*));
void ping_check(char * addr, int port, char * aos);
void * ping_update(void * data);
void ping_start(void (*result)(void *, float, char *));
void ping_stop();

#endif
Binary file modified resources/png/ui/flags.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
96 changes: 52 additions & 44 deletions src/hud.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@
HUD * hud_active;
struct window_instance * hud_window;

static pthread_mutex_t serverlist_lock;

static int is_inside_centered(double mx, double my, int x, int y, int w, int h) {
return mx >= x - w / 2 && mx < x + w / 2 && my >= y - h / 2 && my < y + h / 2;
}
Expand All @@ -68,6 +70,8 @@ void hud_init() {
hud_settings.ctx = malloc(sizeof(mu_Context));
hud_controls.ctx = malloc(sizeof(mu_Context));

pthread_mutex_init(&serverlist_lock, NULL);

hud_change(&hud_serverlist);
}

Expand Down Expand Up @@ -1962,15 +1966,14 @@ static int player_count = 0;
static Server * serverlist;

static int serverlist_con_established;
static pthread_mutex_t serverlist_lock;

static struct serverlist_news_entry {
Texture image;
char caption[65];
char url[129];
float tile_size;
int color;
struct serverlist_news_entry* next;
struct serverlist_news_entry * next;
} serverlist_news;

static int serverlist_news_exists = 0;
Expand All @@ -1981,30 +1984,6 @@ typedef int (*serverlist_sort)(const Server *, const Server *);
static serverlist_sort hud_serverlist_sort_chosen = NULL;
bool serverlist_descending = true;

static void hud_serverlist_init() {
ping_stop();
network_disconnect();
window_title(NULL);
rpc_seti(RPC_VALUE_SLOTS, 0);

window_mousemode(WINDOW_CURSOR_ENABLED);

player_count = server_count = 0;
request_serverlist = http_get("http://services.buildandshoot.com/serverlist.json", NULL);

if (!serverlist_news_exists)
request_news = http_get("http://aos.party/bs/news/", NULL);

serverlist_con_established = request_serverlist != NULL;
*serverlist_input = 0;

pthread_mutex_init(&serverlist_lock, NULL);
window_textinput(1);

hud_serverlist_sort_chosen = NULL;
serverlist_descending = true;
}

static int hud_serverlist_cmp(const void * a, const void * b) {
const Server * A = (const Server*) a;
const Server * B = (const Server*) b;
Expand Down Expand Up @@ -2068,23 +2047,51 @@ static int hud_serverlist_sort_ping(const Server * a, const Server * b) {
return a->ping - b->ping;
}

static void hud_serverlist_pingupdate(void * e, float time_delta, char * aos) {
static void hud_serverlist_pingupdate(void * entry, float time_delta, char * aos) {
pthread_mutex_lock(&serverlist_lock);
if (!e) {
if (!entry) {
for (int k = 0; k < server_count; k++)
if (!strcmp(serverlist[k].identifier, aos)) {
serverlist[k].ping = ceil(time_delta * 1000.0F);
break;
}
} else {
serverlist = realloc(serverlist, (++server_count) * sizeof(Server));
memcpy(serverlist + server_count - 1, e, sizeof(Server));
memcpy(serverlist + server_count - 1, entry, sizeof(Server));
}

qsort(serverlist, server_count, sizeof(Server), hud_serverlist_sort_default);
pthread_mutex_unlock(&serverlist_lock);
}

static void hud_serverlist_init() {
ping_stop();
network_disconnect();
window_title(NULL);
rpc_seti(RPC_VALUE_SLOTS, 0);

window_mousemode(WINDOW_CURSOR_ENABLED);

pthread_mutex_lock(&serverlist_lock);
player_count = server_count = 0;
pthread_mutex_unlock(&serverlist_lock);

request_serverlist = http_get("http://services.buildandshoot.com/serverlist.json", NULL);

if (!serverlist_news_exists)
request_news = http_get("http://aos.party/bs/news/", NULL);

serverlist_con_established = request_serverlist != NULL;
*serverlist_input = 0;

window_textinput(1);

hud_serverlist_sort_chosen = NULL;
serverlist_descending = true;

ping_start(hud_serverlist_pingupdate);
}

static void server_c(char * address, char * name) {
if (file_exists(address)) {
void * data = file_load(address);
Expand Down Expand Up @@ -2374,29 +2381,28 @@ static void hud_serverlist_render(mu_Context * ctx, float scale) {
}
}

int render_status_icon = !serverlist_con_established;
if (request_serverlist) {
switch (http_process(request_serverlist)) {
case HTTP_STATUS_PENDING: render_status_icon = 1; break;
case HTTP_STATUS_PENDING: break;

case HTTP_STATUS_COMPLETED: {
JSON_Value * js = json_parse_string(request_serverlist->response_data);
JSON_Array * servers = json_value_get_array(js);
server_count = json_array_get_count(servers);

pthread_mutex_lock(&serverlist_lock);

int begin = server_count; server_count += json_array_get_count(servers);
serverlist = realloc(serverlist, server_count * sizeof(Server));
CHECK_ALLOCATION_ERROR(serverlist)

ping_start(hud_serverlist_pingupdate);

player_count = 0;
for (int k = 0; k < server_count; k++) {
JSON_Object* s = json_array_get_object(servers, k);
for (int k = begin; k < server_count; k++) {
JSON_Object * s = json_array_get_object(servers, k - begin);
memset(&serverlist[k], 0, sizeof(Server));

serverlist[k].current = (int)json_object_get_number(s, "players_current");
serverlist[k].max = (int)json_object_get_number(s, "players_max");
serverlist[k].ping = -1;
serverlist[k].current = (int) json_object_get_number(s, "players_current");
serverlist[k].max = (int) json_object_get_number(s, "players_max");
serverlist[k].ping = -1;

strncpy(serverlist[k].name, json_object_get_string(s, "name"), sizeof(serverlist[k].name) - 1);
strncpy(serverlist[k].map, json_object_get_string(s, "map"), sizeof(serverlist[k].map) - 1);
Expand All @@ -2423,17 +2429,19 @@ static void hud_serverlist_render(mu_Context * ctx, float scale) {
request_serverlist = NULL;
break;
}
case HTTP_STATUS_FAILED:

case HTTP_STATUS_FAILED: {
http_release(request_serverlist);
hud_serverlist_init();
break;
}
}
}

if (join_address) server_c(join_address, join_name);
}

static void hud_serverlist_touch(void* finger, int action, float x, float y, float dx, float dy) {
static void hud_serverlist_touch(void * finger, int action, float x, float y, float dx, float dy) {
window_setmouseloc(x, y);
/*switch (action) {
case TOUCH_DOWN: hud_serverlist_mouseclick(x, y, WINDOW_MOUSE_LMB, WINDOW_PRESS, 0); break;
Expand Down Expand Up @@ -2465,7 +2473,7 @@ static void hud_settings_init() {

static int int_slider_defaults(mu_Context * ctx, struct config_setting * setting) {
int k = setting->defaults_length - 1;
while (k > 0 && setting->defaults[k] > *(int*)setting->value)
while (k > 0 && setting->defaults[k] > *(int*) setting->value)
k--;

float tmp = k;
Expand All @@ -2478,7 +2486,7 @@ static int int_slider_defaults(mu_Context * ctx, struct config_setting * setting

if (setting->label_callback) {
char buf[64];
setting->label_callback(buf, sizeof(buf), setting->defaults[(int)round(tmp)], (int)round(tmp));
setting->label_callback(buf, sizeof(buf), setting->defaults[(int) round(tmp)], (int) round(tmp));
mu_draw_control_text(ctx, buf, ctx->last_rect, MU_COLOR_TEXT, MU_OPT_ALIGNCENTER);
}

Expand Down Expand Up @@ -2608,7 +2616,7 @@ static void hud_settings_render(mu_Context * ctx, float scale) {
}
}

static void hud_settings_touch(void* finger, int action, float x, float y, float dx, float dy) {
static void hud_settings_touch(void * finger, int action, float x, float y, float dx, float dy) {
window_setmouseloc(x, y);
}

Expand Down
59 changes: 27 additions & 32 deletions src/ping.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,13 @@ void ping_deinit() {
enet_socket_destroy(lan);
}

float lan_ping_start = 0.0F;

static void ping_lan() {
ENetAddress addr = {.host = 0xFFFFFFFF}; // 255.255.255.255
ENetAddress addr = {.host = 0xFFFFFFFF}; // 255.255.255.255
ENetBuffer buffer = {.data = "HELLOLAN", .dataLength = 8};

ENetBuffer buffer = {
.data = "HELLOLAN",
.dataLength = 8,
};
lan_ping_start = window_time();

for (addr.port = 32882; addr.port < 32892; addr.port++)
enet_socket_send(lan, &addr, &buffer, 1);
Expand All @@ -80,7 +80,7 @@ static bool pings_retry(void * key, void * value, void * user) {
enet_socket_send(sock, &entry->addr, &(ENetBuffer) {.data = "HELLO", .dataLength = 5}, 1);
entry->time_start = window_time();
entry->trycount++;
log_warn("Ping timeout on %s, retrying", entry->aos);
log_warn("Ping timeout on %s, retrying (attempt %i)", entry->aos, entry->trycount);
}
}

Expand All @@ -89,10 +89,13 @@ static bool pings_retry(void * key, void * value, void * user) {

#define IP_KEY(addr) (((uint64_t) addr.host << 16) | (addr.port));

void strnzcpy(char * dest, const char * src, size_t size) {
strncpy(dest, src, size - 1); dest[size - 1] = 0;
}

void * ping_update(void * data) {
pthread_detach(pthread_self());

ping_lan();
float ping_start = window_time();

HashTable pings;
Expand All @@ -111,10 +114,7 @@ void * ping_update(void * data) {
char tmp[512];
ENetAddress from;

ENetBuffer buf = {
.data = tmp,
.dataLength = sizeof(tmp),
};
ENetBuffer buf = {.data = tmp, .dataLength = sizeof(tmp)};

while (1) {
int recvLength = enet_socket_receive(sock, &from, &buf, 1);
Expand All @@ -128,42 +128,37 @@ void * ping_update(void * data) {
if (!strncmp(buf.data, "HI", recvLength)) {
ping_result(NULL, window_time() - entry->time_start, entry->aos);
ht_erase(&pings, &ID);
} else {
entry->trycount++;
}
} else { // connection was closed
ht_erase(&pings, &ID);
}
} else entry->trycount++;
} else ht_erase(&pings, &ID); // connection was closed
}
} else { // would block
break;
}
} else break; // would block
}

ht_iterate_remove(&pings, NULL, pings_retry);

int length = enet_socket_receive(lan, &from, &buf, 1);
if (length) {
// “ping_result” before can block, so sometimes this value is very inaccurate
float ping = window_time() - lan_ping_start;

JSON_Value * js = json_parse_string(buf.data);
if (js) {
JSON_Object * root = json_value_get_object(js);

Server e;

strcpy(e.country, "LAN");
e.ping = ceil((window_time() - ping_start) * 1000.0F);
e.ping = ceil(ping * 1000.0F);
snprintf(e.identifier, sizeof(e.identifier) - 1, "aos://%u:%u", from.host, from.port);

strncpy(e.name, json_object_get_string(root, "name"), sizeof(e.name) - 1);
e.name[sizeof(e.name) - 1] = 0;
strncpy(e.gamemode, json_object_get_string(root, "game_mode"), sizeof(e.gamemode) - 1);
e.gamemode[sizeof(e.gamemode) - 1] = 0;
strncpy(e.map, json_object_get_string(root, "map"), sizeof(e.map) - 1);
e.map[sizeof(e.map) - 1] = 0;
strnzcpy(e.name, json_object_get_string(root, "name"), sizeof(e.name));
strnzcpy(e.gamemode, json_object_get_string(root, "game_mode"), sizeof(e.gamemode));
strnzcpy(e.map, json_object_get_string(root, "map"), sizeof(e.map));

e.current = json_object_get_number(root, "players_current");
e.max = json_object_get_number(root, "players_max");
ping_result(&e, window_time() - ping_start, NULL);
e.max = json_object_get_number(root, "players_max");

if (ping_result) ping_result(&e, ping, NULL);
json_value_free(js);
}
}
Expand All @@ -174,8 +169,8 @@ void * ping_update(void * data) {

void ping_check(char * addr, int port, char * aos) {
struct ping_entry entry = {
.trycount = 0,
.addr.port = port,
.trycount = 0,
.addr.port = port,
.time_start = window_time(),
};

Expand All @@ -191,8 +186,8 @@ void ping_check(char * addr, int port, char * aos) {

void ping_start(void (*result)(void *, float, char *)) {
ping_stop();

ping_result = result;
ping_lan();
}

void ping_stop() {
Expand Down
6 changes: 3 additions & 3 deletions src/texture.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,10 @@ static char * texture_flags[] = {
};

static int texture_flag_cmp(const void * a, const void * b) {
return strcmp(a, *(const void* const*) b);
return strcmp(a, *(const void * const *) b);
}

int texture_flag_index(const char* country) {
int texture_flag_index(const char * country) {
char ** res = bsearch(country, texture_flags, sizeof(texture_flags) / sizeof(texture_flags[0]), sizeof(char*), texture_flag_cmp);
return res ? (res - texture_flags) : -1;
}
Expand All @@ -93,7 +93,7 @@ void texture_flag_offset(int index, float * u, float * v) {
*u = (index % 16) * (16.0F / 256.0F);
*v = (index / 16) * (16.0F / 256.0F);
} else {
*u = 0.0F;
*u = 0.0625F;
*v = 0.9375F;
}
}
Expand Down

0 comments on commit f3b62df

Please sign in to comment.