Skip to content

Commit

Permalink
See desc
Browse files Browse the repository at this point in the history
* remove duplicates in weapon.c
* add log.c to library list
* locally ping servers in off-work-thread
* remove shotgun reload bug, caused by too early PacketWeaponReload
* pull down block and show tools when picking a color
  • Loading branch information
xtreme8000 committed Jul 30, 2018
1 parent 126fbf1 commit b424a16
Show file tree
Hide file tree
Showing 12 changed files with 264 additions and 108 deletions.
2 changes: 2 additions & 0 deletions README.md
Expand Up @@ -68,6 +68,8 @@ This means:
| `parson.c` and `parson.h` | → | `src/parson.c` and `src/parson.h` |
| `http.h` | → | `src/http.h` |
| `stb_truetype.h` | → | `src/stb_truetype.h` |
| `log.h` and `log.c` | → | `src/log.h` and `src/log.c` |


Because state of copyright of 0.75 assets is unknown, you will need to get them *[here](http://aos.party/bsresources.zip)*. Unzip the file and extract all contents to `resources/` manually.

Expand Down
1 change: 1 addition & 0 deletions src/common.h
Expand Up @@ -110,6 +110,7 @@

#define MOUSE_SENSITIVITY 0.002F

#include "ping.h"
#include "glx.h"
#include "list.h"
#include "window.h"
Expand Down
70 changes: 54 additions & 16 deletions src/hud.c
Expand Up @@ -1285,7 +1285,11 @@ static void hud_ingame_keyboard(int key, int action, int mods, int internal) {
screen_current = SCREEN_NONE;
}
}
if(key==WINDOW_KEY_PICKCOLOR) {
if(key==WINDOW_KEY_PICKCOLOR && players[local_player_id].held_item==TOOL_BLOCK) {
players[local_player_id].item_disabled = window_time();
players[local_player_id].items_show_start = window_time();
players[local_player_id].items_show = 1;

int* pos = camera_terrain_pick(1);
if(pos!=NULL) {
players[local_player_id].block.packed = map_get(pos[0],pos[1],pos[2]);
Expand Down Expand Up @@ -1356,30 +1360,35 @@ static struct serverlist_entry* serverlist;
static float serverlist_scroll;
static int serverlist_hover;
static int serverlist_is_outdated;
static pthread_mutex_t serverlist_lock;

static void hud_serverlist_init() {
network_disconnect();
network_disconnect();

window_mousemode(WINDOW_CURSOR_ENABLED);
window_mousemode(WINDOW_CURSOR_ENABLED);

player_count = 0;
server_count = 0;
serverlist_scroll = 0.0F;
serverlist_hover = -1;
request_serverlist = http_get("http://services.buildandshoot.com/serverlist.json",NULL);
request_version = http_get("http://aos.party/bs/version/",NULL);
player_count = 0;
server_count = 0;
serverlist_scroll = 0.0F;
serverlist_hover = -1;
request_serverlist = http_get("http://services.buildandshoot.com/serverlist.json",NULL);
request_version = http_get("http://aos.party/bs/version/",NULL);

chat_input_mode = CHAT_ALL_INPUT;
chat[0][0][0] = 0;
serverlist_is_outdated = 0;
chat_input_mode = CHAT_ALL_INPUT;
chat[0][0][0] = 0;
serverlist_is_outdated = 0;

pthread_mutex_init(&serverlist_lock,NULL);
}

static int hud_serverlist_sort(const void* a, const void* b) {
struct serverlist_entry* aa = (struct serverlist_entry*)a;
struct serverlist_entry* bb = (struct serverlist_entry*)b;
if(aa->current+bb->current==0) {
return aa->ping-bb->ping;
}
if(abs(aa->current-bb->current)==0)
if(abs(aa->ping-bb->ping)==0)
return strcmp(aa->name,bb->name);
else
return aa->ping-bb->ping;
if(aa->current<0) {
return -1;
}
Expand All @@ -1389,6 +1398,18 @@ static int hud_serverlist_sort(const void* a, const void* b) {
return bb->current-aa->current;
}

static void hud_serverlist_pingupdate(struct ping_entry* e, float time_delta, void* user_data) {
pthread_mutex_lock(&serverlist_lock);
(*(int*)user_data) = ceil(time_delta*1000.0F);
pthread_mutex_unlock(&serverlist_lock);
}

static void hud_serverlist_pingcomplete() {
pthread_mutex_lock(&serverlist_lock);
qsort(serverlist,server_count,sizeof(struct serverlist_entry),hud_serverlist_sort);
pthread_mutex_unlock(&serverlist_lock);
}

static void hud_serverlist_render(float scalex, float scaley) {
glColor3f(0.5F,0.5F,0.5F);
float t = window_time()*0.03125F;
Expand Down Expand Up @@ -1461,6 +1482,8 @@ static void hud_serverlist_render(float scalex, float scaley) {
tmp = k;
}

pthread_mutex_lock(&serverlist_lock);

float f = ((serverlist[k].current && serverlist[k].current<serverlist[k].max) || tmp==k || serverlist[k].current<0)?1.0F:0.5F;
glColor3f(f,f,f);

Expand Down Expand Up @@ -1488,6 +1511,8 @@ static void hud_serverlist_render(float scalex, float scaley) {
glColor3f(1.0F*f,0.0F,0.0F);
font_render((settings.window_width-600*scaley)/2.0F+560*scaley,450*scaley-20*scaley*(k+1)-serverlist_scroll,16*scaley,total_str);
glColor3f(1.0F,1.0F,1.0F);

pthread_mutex_unlock(&serverlist_lock);
}
serverlist_hover = tmp;

Expand Down Expand Up @@ -1548,6 +1573,8 @@ static void hud_serverlist_render(float scalex, float scaley) {
{
JSON_Array* servers = json_value_get_array(json_parse_string(request_serverlist->response_data));
server_count = json_array_get_count(servers)+1;

pthread_mutex_lock(&serverlist_lock);
serverlist = realloc(serverlist,server_count*sizeof(struct serverlist_entry));
CHECK_ALLOCATION_ERROR(serverlist)
player_count = 0;
Expand All @@ -1557,13 +1584,18 @@ static void hud_serverlist_render(float scalex, float scaley) {

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 = (int)json_object_get_number(s,"latency");

strncpy(serverlist[k].name,json_object_get_string(s,"name"),31);
strncpy(serverlist[k].map,json_object_get_string(s,"map"),20);
strncpy(serverlist[k].gamemode,json_object_get_string(s,"game_mode"),7);
strncpy(serverlist[k].identifier,json_object_get_string(s,"identifier"),31);
strncpy(serverlist[k].country,json_object_get_string(s,"country"),3);

int port;
char ip[32];
if(network_identifier_split(serverlist[k].identifier,ip,&port))
ping_check(ip,port,&serverlist[k].ping,hud_serverlist_pingupdate);

player_count += serverlist[k].current;
}
serverlist[0].current = serverlist[0].max = -1;
Expand All @@ -1574,7 +1606,11 @@ static void hud_serverlist_render(float scalex, float scaley) {
strcpy(serverlist[0].identifier,"aos://16777343:32887");
strcpy(serverlist[0].country,"US");

ping_start(hud_serverlist_pingcomplete);

qsort(serverlist,server_count,sizeof(struct serverlist_entry),hud_serverlist_sort);
pthread_mutex_unlock(&serverlist_lock);

http_release(request_serverlist);
request_serverlist = NULL;
break;
Expand Down Expand Up @@ -1613,7 +1649,9 @@ static void hud_serverlist_mouseclick(int button, int action, int mods) {
return;
}
if(serverlist_hover>=0) {
pthread_mutex_lock(&serverlist_lock);
server_c(serverlist[serverlist_hover].identifier);
pthread_mutex_unlock(&serverlist_lock);
}
double x,y;
window_mouseloc(&x,&y);
Expand Down
5 changes: 4 additions & 1 deletion src/list.c
Expand Up @@ -21,7 +21,10 @@ void* list_add(struct list* l, void* e) {
l->data = realloc(l->data,l->mem_size);
CHECK_ALLOCATION_ERROR(l->data)
}
memcpy(l->data+l->elements*l->element_size,e,l->element_size);
if(e)
memcpy(l->data+l->elements*l->element_size,e,l->element_size);
else
memset(l->data+l->elements*l->element_size,0,l->element_size);
return l->data+(l->elements++)*l->element_size;
}

Expand Down
13 changes: 7 additions & 6 deletions src/main.c
Expand Up @@ -449,7 +449,7 @@ void init() {
//set minimap borders (white on 64x64 chunks, black map border)
memset(map_minimap,0xCCCCCCFF,map_size_x*map_size_z*sizeof(unsigned char)*4);

glx_init();
glx_init();

font_init();
player_init();
Expand All @@ -460,7 +460,8 @@ void init() {
sound_init();
tracer_init();
hud_init();
chunk_init();
chunk_init();
ping_init();

weapon_set();
}
Expand Down Expand Up @@ -556,10 +557,12 @@ void mouse_scroll(struct window_instance* window, double xoffset, double yoffset
}

void deinit() {
if(settings.show_news)
file_url("https://www.buildandshoot.com/news/");
ping_deinit();
if(settings.show_news)
file_url("https://www.buildandshoot.com/news/");
if(network_connected)
network_disconnect();
window_deinit();
}

void on_error(int i, const char* s) {
Expand Down Expand Up @@ -660,6 +663,4 @@ int main(int argc, char** argv) {
}
fps = 1.0F/(window_time()-last_frame_start);
}

window_deinit();
}
25 changes: 23 additions & 2 deletions src/network.c
Expand Up @@ -589,7 +589,7 @@ void read_PacketKillAction(void* data, int len) {
}

void read_PacketShortPlayerData(void* data, int len) {
//should never be received, but process it anyway
//should never be received
struct PacketShortPlayerData* p = (struct PacketShortPlayerData*)data;
log_warn("Unexpected ShortPlayerDataPacket");
}
Expand Down Expand Up @@ -642,7 +642,6 @@ void read_PacketChangeWeapon(void* data, int len) {
void read_PacketWeaponReload(void* data, int len) {
struct PacketWeaponReload* p = (struct PacketWeaponReload*)data;
if(p->player_id==local_player_id) {
weapon_set();
local_player_ammo = p->ammo;
local_player_ammo_reserved = p->reserved;
} else {
Expand Down Expand Up @@ -917,6 +916,28 @@ int network_connect(char* ip, int port) {
return 0;
}

int network_identifier_split(char* addr, char* ip_out, int* port_out) {
char* ip_start = strstr(addr,"aos://")+6;
if((size_t)ip_start<=6)
return 0;
char* port_start = strchr(ip_start,':');
if(port_start)
*port_start = 0;

if(strchr(ip_start,'.')) {
*port_out = port_start?atoi(port_start+1):32887;
strcpy(ip_out,ip_start);
} else {
int ip = atoi(ip_start);
char ip_str[32];
sprintf(ip_str,"%i.%i.%i.%i",ip&255,(ip>>8)&255,(ip>>16)&255,(ip>>24)&255);

*port_out = port_start?atoi(port_start+1):32887;
strcpy(ip_out,ip_str);
}
return 1;
}

int network_connect_string(char* addr) {
char* ip_start = strstr(addr,"aos://")+6;
if((size_t)ip_start<=6)
Expand Down
7 changes: 4 additions & 3 deletions src/network.h
Expand Up @@ -23,6 +23,7 @@ unsigned int network_ping(void);
void network_send(int id, void* data, int len);
void network_updateColor(void);
void network_disconnect(void);
int network_identifier_split(char* addr, char* ip_out, int* port_out);
int network_connect(char* ip, int port);
int network_connect_string(char* addr);
int network_update(void);
Expand Down Expand Up @@ -314,9 +315,9 @@ struct PacketChatMessage {
unsigned char chat_type;
char message[255];
};
#define CHAT_ALL 0
#define CHAT_TEAM 1
#define CHAT_SYSTEM 2
#define CHAT_ALL 0
#define CHAT_TEAM 1
#define CHAT_SYSTEM 2

#define PACKET_FOGCOLOR_ID 27
struct PacketFogColor {
Expand Down
89 changes: 89 additions & 0 deletions src/ping.c
@@ -0,0 +1,89 @@
#include "common.h"

struct list list_pings;
ENetSocket sock;
pthread_t ping_thread;
pthread_mutex_t list_ping_lock;
void (*ping_finished) ();

void ping_init() {
list_create(&list_pings,sizeof(struct ping_entry));
sock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM);
enet_socket_set_option(sock,ENET_SOCKOPT_NONBLOCK,1);
enet_socket_set_option(sock,ENET_SOCKOPT_NODELAY,1);
pthread_mutex_init(&list_ping_lock,NULL);
}

void ping_deinit() {
enet_socket_destroy(sock);
}

void* ping_update(void* data) {
while(1) {
ENetBuffer buf;
buf.dataLength = 32;

pthread_mutex_lock(&list_ping_lock);
for(int k=list_size(&list_pings)-1;k>=0;k--) {
struct ping_entry* entry = list_get(&list_pings,k);

if(window_time()-entry->time_start>3.0F) { //timeout
if(entry->trycount<3) {
log_warn("Ping timeout, retrying (%i)",entry->trycount);
ENetBuffer buffer;
buffer.data = "HELLO";
buffer.dataLength = 5;
entry->time_start = window_time();
enet_socket_send(sock,&entry->addr,&buffer,1);
entry->trycount++;
} else {
list_remove(&list_pings,k);
continue;
}
}

char tmp[32] = {0};
buf.data = tmp;

switch(enet_socket_receive(sock,&entry->addr,&buf,1)) {
case 0: //would block
break;
default: //received something!
if(strcmp(buf.data,"HI")==0 && entry->callback)
entry->callback(entry,window_time()-entry->time_start,entry->user_data);
case -1: //connection was closed
list_remove(&list_pings,k);
}
}

int size = list_size(&list_pings);
pthread_mutex_unlock(&list_ping_lock);
if(!size) {
ping_finished();
return NULL;
}
}
}

void ping_check(char* addr, int port, void* user_data, void (*callback) (struct ping_entry*, float time_delta, void* user_data)) {
struct ping_entry* entry = list_add(&list_pings,NULL);

entry->callback = callback;
entry->user_data = user_data;
entry->trycount = 1;

enet_address_set_host(&entry->addr,addr);
entry->addr.port = port;

ENetBuffer buffer;
buffer.data = "HELLO";
buffer.dataLength = 5;

entry->time_start = window_time();
enet_socket_send(sock,&entry->addr,&buffer,1);
}

void ping_start(void (*callback) ()) {
pthread_create(&ping_thread,NULL,ping_update,NULL);
ping_finished = callback;
}
13 changes: 13 additions & 0 deletions src/ping.h
@@ -0,0 +1,13 @@
struct ping_entry {
ENetAddress addr;
float time_start;
void* user_data;
int trycount;
void (*callback) (struct ping_entry*, float time_delta, void* user_data);
};

void ping_init();
void ping_deinit();
void ping_check(char* addr, int port, void* user_data, void (*callback) (struct ping_entry*, float time_delta, void* user_data));
void* ping_update(void* data);
void ping_start(void (*callback) ());

0 comments on commit b424a16

Please sign in to comment.