From 1c1677f02300e5ab10bca9c74ce7f49d4605b9d6 Mon Sep 17 00:00:00 2001 From: Magnus Auvinen Date: Sat, 12 Jan 2008 12:08:26 +0000 Subject: merged 0.3.3 changes over to trunk --- src/game/client/gc_client.cpp | 129 ++++++++++++++++++++++++++++-------------- 1 file changed, 88 insertions(+), 41 deletions(-) (limited to 'src/game/client/gc_client.cpp') diff --git a/src/game/client/gc_client.cpp b/src/game/client/gc_client.cpp index 5598c44f..68c6db00 100644 --- a/src/game/client/gc_client.cpp +++ b/src/game/client/gc_client.cpp @@ -33,6 +33,8 @@ data_container *data = 0x0; static player_input input_data = {0}; static int input_target_lock = 0; +static int64 debug_firedelay = 0; + extern void modmenu_render(); extern void menu_init(); @@ -79,8 +81,25 @@ static struct client_data int emoticon_start; player_core predicted; - tee_render_info skin_info; + tee_render_info skin_info; // this is what the server reports + tee_render_info render_info; // this is what we use + void update_render_info() + { + render_info = skin_info; + + // force team colors + if(gameobj && gameobj->gametype != GAMETYPE_DM) + { + const int team_colors[2] = {65387, 10223467}; + if(team >= 0 || team <= 1) + { + render_info.texture = skin_get(skin_id)->color_texture; + render_info.color_body = skin_get_color(team_colors[team]); + render_info.color_feet = skin_get_color(team_colors[team]); + } + } + } } client_datas[MAX_CLIENTS]; class client_effects @@ -915,6 +934,9 @@ extern "C" void modc_newsnapshot() if(item.type == OBJTYPE_PLAYER_INFO) { const obj_player_info *info = (const obj_player_info *)data; + + client_datas[info->clientid].team = info->team; + if(info->local) { local_info = info; @@ -938,6 +960,9 @@ extern "C" void modc_newsnapshot() } } } + + for(int i = 0; i < MAX_CLIENTS; i++) + client_datas[i].update_render_info(); } void send_info(bool start) @@ -963,8 +988,15 @@ void send_emoticon(int emoticon) client_send_msg(); } -static void render_projectile(const obj_projectile *prev, const obj_projectile *current, int itemid) +static void render_projectile(const obj_projectile *current, int itemid) { + if(debug_firedelay) + { + debug_firedelay = time_get()-debug_firedelay; + dbg_msg("game", "firedelay=%.2f ms", debug_firedelay/(float)time_freq()*1000.0f); + debug_firedelay = 0; + } + gfx_texture_set(data->images[IMAGE_GAME].id); gfx_quads_begin(); @@ -1143,10 +1175,10 @@ void anim_eval_add(animstate *state, animation *anim, float time, float amount) anim_add(state, &add, amount); } -static void render_hand(int skin_id, vec2 center_pos, vec2 dir, float angle_offset, vec2 post_rot_offset) +static void render_hand(tee_render_info *info, vec2 center_pos, vec2 dir, float angle_offset, vec2 post_rot_offset) { // for drawing hand - const skin *s = skin_get(skin_id); + //const skin *s = skin_get(skin_id); float basesize = 10.0f; //dir = normalize(hook_pos-pos); @@ -1168,8 +1200,9 @@ static void render_hand(int skin_id, vec2 center_pos, vec2 dir, float angle_offs hand_pos += diry * post_rot_offset.y; //gfx_texture_set(data->images[IMAGE_CHAR_DEFAULT].id); - gfx_texture_set(s->color_texture); + gfx_texture_set(info->texture); gfx_quads_begin(); + gfx_setcolor(info->color_body.r, info->color_body.g, info->color_body.b, info->color_body.a); // two passes for (int i = 0; i < 2; i++) @@ -1382,11 +1415,6 @@ static void render_player( } } - // TODO: proper skin selection - int skin_id = client_datas[info.clientid].skin_id; //charids[info.clientid]; - //if(gametype != GAMETYPE_DM) - //skin_id = info.team*9; // 0 or 9 - vec2 direction = get_direction(player.angle); float angle = player.angle/256.0f; vec2 position = mix(vec2(prev.x, prev.y), vec2(player.x, player.y), intratick); @@ -1463,7 +1491,7 @@ static void render_player( gfx_quads_setrotation(0); gfx_quads_end(); - render_hand(skin_id, position, normalize(hook_pos-pos), -pi/2, vec2(20, 0)); + render_hand(&client_datas[info.clientid].render_info, position, normalize(hook_pos-pos), -pi/2, vec2(20, 0)); } // draw gun @@ -1581,9 +1609,9 @@ static void render_player( switch (player.weapon) { - case WEAPON_GUN: render_hand(skin_id, p, direction, -3*pi/4, vec2(-15, 4)); break; - case WEAPON_SHOTGUN: render_hand(skin_id, p, direction, -pi/2, vec2(-5, 4)); break; - case WEAPON_ROCKET: render_hand(skin_id, p, direction, -pi/2, vec2(-4, 7)); break; + case WEAPON_GUN: render_hand(&client_datas[info.clientid].render_info, p, direction, -3*pi/4, vec2(-15, 4)); break; + case WEAPON_SHOTGUN: render_hand(&client_datas[info.clientid].render_info, p, direction, -pi/2, vec2(-5, 4)); break; + case WEAPON_ROCKET: render_hand(&client_datas[info.clientid].render_info, p, direction, -pi/2, vec2(-4, 7)); break; } } @@ -1592,14 +1620,14 @@ static void render_player( if(info.local && config.debug) { vec2 ghost_position = mix(vec2(prev_char->x, prev_char->y), vec2(player_char->x, player_char->y), client_intratick()); - tee_render_info ghost = client_datas[info.clientid].skin_info; + tee_render_info ghost = client_datas[info.clientid].render_info; ghost.color_body.a = 0.5f; ghost.color_feet.a = 0.5f; render_tee(&state, &ghost, player.emote, direction, ghost_position); // render ghost } // render the tee - render_tee(&state, &client_datas[info.clientid].skin_info, player.emote, direction, position); + render_tee(&state, &client_datas[info.clientid].render_info, player.emote, direction, position); if(player.state == STATE_CHATTING) { @@ -2103,7 +2131,7 @@ void render_scoreboard(float x, float y, float w, int team, const char *title) gfx_quads_end(); } - render_tee(&idlestate, &client_datas[info->clientid].skin_info, EMOTE_NORMAL, vec2(1,0), vec2(x+90, y+28)); + render_tee(&idlestate, &client_datas[info->clientid].render_info, EMOTE_NORMAL, vec2(1,0), vec2(x+90, y+28)); y += 50.0f; @@ -2202,9 +2230,9 @@ void render_world(float center_x, float center_y, float zoom) if(item.type == OBJTYPE_PROJECTILE) { - const void *prev = snap_find_item(SNAP_PREV, item.type, item.id); - if(prev) - render_projectile((const obj_projectile *)prev, (const obj_projectile *)data, item.id); + //const void *prev = snap_find_item(SNAP_PREV, item.type, item.id); + //if(prev) + render_projectile((const obj_projectile *)data, item.id); } else if(item.type == OBJTYPE_POWERUP) { @@ -2235,8 +2263,6 @@ void render_world(float center_x, float center_y, float zoom) const void *prev_info = snap_find_item(SNAP_PREV, OBJTYPE_PLAYER_INFO, item.id); const void *info = snap_find_item(SNAP_CURRENT, OBJTYPE_PLAYER_INFO, item.id); - client_datas[((const obj_player_info *)info)->clientid].team = ((const obj_player_info *)info)->team; - if(prev && prev_info && info) { render_player( @@ -2364,28 +2390,29 @@ void render_game() chat_mode = CHATMODE_NONE; } - int c = inp_last_char(); - int k = inp_last_key(); - - if (!(c >= 0 && c < 32)) + for(int i = 0; i < inp_num_events(); i++) { - if (chat_input_len < sizeof(chat_input) - 1) + INPUTEVENT e = inp_get_event(i); + + if (!(e.ch >= 0 && e.ch < 32)) { - chat_input[chat_input_len] = c; - chat_input[chat_input_len+1] = 0; - chat_input_len++; + if (chat_input_len < sizeof(chat_input) - 1) + { + chat_input[chat_input_len] = e.ch; + chat_input[chat_input_len+1] = 0; + chat_input_len++; + } } - } - if(k == KEY_BACKSPACE) - { - if(chat_input_len > 0) + if(e.key == KEY_BACKSPACE) { - chat_input[chat_input_len-1] = 0; - chat_input_len--; + if(chat_input_len > 0) + { + chat_input[chat_input_len-1] = 0; + chat_input_len--; + } } } - } else { @@ -2413,7 +2440,7 @@ void render_game() } if (!menu_active) - inp_clear(); + inp_clear_events(); // fetch new input if(!menu_active && !emoticon_selector_active) @@ -2451,6 +2478,8 @@ void render_game() // update some input if(!menu_active && chat_mode == CHATMODE_NONE) { + bool do_direct = false; + if(!emoticon_selector_active) { if(do_input(&input_data.fire, config.key_fire)) @@ -2460,6 +2489,17 @@ void render_game() input_data.target_x = (int)mouse_pos.x; input_data.target_y = (int)mouse_pos.y; input_target_lock = 1; + + if(inp_key_presses(config.key_fire)) + { + if(config.dbg_firedelay) + { + if(debug_firedelay == 0) + debug_firedelay = time_get(); + } + + do_direct = true; + } } } @@ -2480,6 +2520,9 @@ void render_game() if(inp_key_presses(config.key_weapon5)) input_data.wanted_weapon = 5; if(inp_key_presses(config.key_weapon6)) input_data.wanted_weapon = 6; } + + if(do_direct) // do direct input if wanted + client_direct_input((int *)&input_data, sizeof(input_data)); } @@ -2720,7 +2763,7 @@ void render_game() } } - render_tee(&idlestate, &client_datas[killmsgs[r].victim].skin_info, EMOTE_PAIN, vec2(-1,0), vec2(x, y+28)); + render_tee(&idlestate, &client_datas[killmsgs[r].victim].render_info, EMOTE_PAIN, vec2(-1,0), vec2(x, y+28)); x -= 32.0f; // render weapon @@ -2756,7 +2799,7 @@ void render_game() // render killer tee x -= 24.0f; - render_tee(&idlestate, &client_datas[killmsgs[r].killer].skin_info, EMOTE_ANGRY, vec2(1,0), vec2(x, y+28)); + render_tee(&idlestate, &client_datas[killmsgs[r].killer].render_info, EMOTE_ANGRY, vec2(1,0), vec2(x, y+28)); x -= 32.0f; // render killer name @@ -2913,7 +2956,7 @@ void render_game() const char *name = client_datas[id].name; float w = gfx_pretty_text_width(10, name, -1); gfx_pretty_text(whole-40-5-w, 300-40-15+t*20+2, 10, name, -1); - tee_render_info info = client_datas[id].skin_info; + tee_render_info info = client_datas[id].render_info; info.size = 18.0f; render_tee(&idlestate, &info, EMOTE_NORMAL, vec2(1,0), @@ -3117,6 +3160,8 @@ extern "C" void modc_statechange(int state, int old) menu_do_disconnected(); menu_game_active = false; } + else if(state == CLIENTSTATE_LOADING) + menu_do_connecting(); else if(state == CLIENTSTATE_CONNECTING) menu_do_connecting(); else if (state == CLIENTSTATE_ONLINE) @@ -3171,6 +3216,8 @@ extern "C" void modc_message(int msg) client_datas[cid].skin_info.color_body = vec4(1,1,1,1); client_datas[cid].skin_info.color_feet = vec4(1,1,1,1); } + + client_datas[cid].update_render_info(); } else if(msg == MSG_WEAPON_PICKUP) { -- cgit 1.4.1