Program Listing for File player_broadcast.c¶
↰ Return to documentation for file (server/game_events/player_broadcast.c)
#include "client/client.h"
#include "handler.h"
#define __USE_MISC
// ^ above is for M_PI_[...]
#include <math.h>
int get_relative_sound_direction(
server_t *srv,
client_state_t *author, client_state_t *receiver)
{
double rel_angle;
int dx = (author->x - receiver->x) % srv->map_width;
int dy = (author->y - receiver->y) % srv->map_height;
if (dx > (srv->map_width >> 1))
dx -= srv->map_width;
if (dy > (srv->map_height >> 1))
dy -= srv->map_height;
if (dx == 0 && dy == 0)
return 0;
rel_angle = fmod(
(((double)(receiver->orientation + 1) * M_PI_2)
- atan2(-dy, dx) + (2 * M_PI)), (2 * M_PI));
return (int)fmod((rel_angle / M_PI_4), 8);
}
bool player_broadcast_handler(server_t *srv, const event_t *event)
{
client_state_t *cs = event_get_client(srv, event);
if (cs == nullptr)
return false;
if (event->arg_count != 2)
return append_to_output(srv, cs, "ko\n"), true;
for (size_t i = srv->cm.idx_of_players; i < srv->cm.count; i++) {
if (cs->id == srv->cm.clients[i].id)
continue;
vappend_to_output(srv, &srv->cm.clients[i],
"message %d, %s\n",
get_relative_sound_direction(srv, cs, &srv->cm.clients[i]),
event->command[1]);
}
send_to_guis(srv, "pbc #%hd %s\n",
srv->cm.clients[event->client_idx].id, event->command[1]);
append_to_output(srv, cs, "ok\n");
return true;
}