summaryrefslogtreecommitdiff
path: root/src/players.c
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrik@amftech.nl>2024-01-07 18:04:08 +0100
committerAldrik Ramaekers <aldrik@amftech.nl>2024-01-07 18:04:08 +0100
commitb2bd4db89ac281ffddf23ef4469fa427eaa8b710 (patch)
tree56710119e4d74367c9d488aa5a19cf3a297d75b1 /src/players.c
parent79eb2237b94900941c35859875c4bae21fa4fff6 (diff)
player death
Diffstat (limited to 'src/players.c')
-rw-r--r--src/players.c55
1 files changed, 41 insertions, 14 deletions
diff --git a/src/players.c b/src/players.c
index 627918c..fa3ea22 100644
--- a/src/players.c
+++ b/src/players.c
@@ -61,11 +61,13 @@ void spawn_player(u32 id, network_client client) {
players[i].height = 0.0f;
players[i].client = client;
players[i].sprite = create_sprite(img_gunner_blue_run, 6, 48, 48, 0.1f);
+ players[i].sprite_death = create_sprite(img_gunner_blue_run, 8, 48, 48, 0.1f);
+ players[i].sprite_death.loop = false;
players[i].sprite.zoom = 1.1f;
+ players[i].sprite_death.zoom = 1.1f;
players[i].health = 500;
players[i].max_health = 500;
- players[i].gun_sprite = create_sprite(img_gun_mp5, 4, 256, 256, 0.0f);
players[i].direction = DIRECTION_DOWN;
players[i].connection_state = CONNECTED;
players[i].throwables.grenades = 3;
@@ -129,6 +131,8 @@ void move_user(platform_window* window, u32 id, protocol_move_type move, float d
return;
}
+ if (p->interact_state == INTERACT_DEAD) return;
+
if (p->sec_since_last_step > 0.2f) {
add_audio_event_to_queue(EVENT_FOOTSTEP, p->id, (vec3f){.x = p->playerx, .y = p->playery, .z = p->height});
p->sec_since_last_step = 0.0f;
@@ -321,7 +325,7 @@ void take_player_input(platform_window* window) {
}
}
-void update_players_client() {
+void update_players_orientation() {
for (int i = 0; i < MAX_PLAYERS; i++) {
if (!players[i].active) continue;
@@ -353,6 +357,7 @@ void update_players_client() {
update_sprite(&players[i].sprite);
+ if (players[i].interact_state == INTERACT_DEAD) update_sprite(&players[i].sprite_death);
}
}
@@ -365,6 +370,11 @@ void hurt_player(u32 id, u32 damage) {
p->health -= damage;
p->sec_since_last_damage_taken = 0.0f;
add_audio_event_to_queue(EVENT_PLAYERHURT, p->id, (vec3f){.x = p->playerx, .y = p->playery, .z = p->height});
+
+ if (p->health <= 0) {
+ p->health = 0;
+ p->interact_state = INTERACT_DEAD;
+ }
}
void update_players_server() {
@@ -375,6 +385,8 @@ void update_players_server() {
players[i].sec_since_last_step += SERVER_TICK_RATE;
players[i].sec_since_last_damage_taken += SERVER_TICK_RATE;
+ if (players[i].interact_state == INTERACT_DEAD) continue;
+
// Reloading
gun g = get_gun_by_type(players[i].guntype);
if (players[i].interact_state == INTERACT_RELOADING && players[i].sec_since_interact_state_change >= g.reload_time) {
@@ -393,7 +405,7 @@ void update_players_server() {
}
}
- update_players_client();
+ update_players_orientation();
}
static void draw_player_bullet_cone(platform_window* window, player* p) {
@@ -509,22 +521,37 @@ void draw_player(platform_window* window, player* p, int index) {
frame = sprite_swap_frame_horizontally(frame);
}
- renderer->render_image_quad_partial(get_player_run_sprite_from_index(index),
- player_render_x, player_render_y,
- player_render_x, player_render_y + size,
- player_render_x + size, player_render_y + size,
- player_render_x + size, player_render_y,
- frame.tl, frame.tr, frame.bl, frame.br);
+ if (p->interact_state == INTERACT_DEAD) {
+ frame = sprite_get_frame(img_gunner_blue_die, &p->sprite_death);
+ renderer->render_image_quad_partial(img_gunner_blue_die,
+ player_render_x, player_render_y,
+ player_render_x, player_render_y + size,
+ player_render_x + size, player_render_y + size,
+ player_render_x + size, player_render_y,
+ frame.tl, frame.tr, frame.bl, frame.br);
+ }
+ else {
+ renderer->render_image_quad_partial(get_player_run_sprite_from_index(index),
+ player_render_x, player_render_y,
+ player_render_x, player_render_y + size,
+ player_render_x + size, player_render_y + size,
+ player_render_x + size, player_render_y,
+ frame.tl, frame.tr, frame.bl, frame.br);
+ }
}
- font* name_fnt = get_font(window, 0.2f);
- int name_x = player_render_x + (size)/2 - (renderer->calculate_text_width(name_fnt, name))/2;
- int name_y = player_render_y - name_fnt->px_h - 5;
- renderer->render_text(name_fnt, name_x+1, name_y+1, name, rgba(0,0,0,120));
- renderer->render_text(name_fnt, name_x, name_y, name, rgb(255,255,255));
+ // Nametag
+ {
+ font* name_fnt = get_font(window, 0.2f);
+ int name_x = player_render_x + (size)/2 - (renderer->calculate_text_width(name_fnt, name))/2;
+ int name_y = player_render_y - name_fnt->px_h - 5;
+ renderer->render_text(name_fnt, name_x+1, name_y+1, name, rgba(0,0,0,120));
+ renderer->render_text(name_fnt, name_x, name_y, name, rgb(255,255,255));
+ }
p->gun_height = p->height+0.2;
+ // Disconnected icon
if (p->connection_state == DISCONNECTED) {
float icon_h = (size)/2;
renderer->render_image(img_disconnected, player_render_x + (icon_h/3), player_render_y - icon_h, icon_h, icon_h);