about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJakob Fries <jakob.fries@gmail.com>2007-11-24 14:07:06 +0000
committerJakob Fries <jakob.fries@gmail.com>2007-11-24 14:07:06 +0000
commit79d495233fa7f14c3ad5ad3e6c3db26220d2f2a3 (patch)
treeb1c1df5a3cb1685fe22f7a253f5d3404ddb11765
parent51710edd8e8869a8233e7b8c4204e6b2e3fcbe42 (diff)
downloadzcatch-79d495233fa7f14c3ad5ad3e6c3db26220d2f2a3.tar.gz
zcatch-79d495233fa7f14c3ad5ad3e6c3db26220d2f2a3.zip
autoswitch weapons option
-rw-r--r--src/game/client/game_client.cpp16
-rw-r--r--src/game/client/menu.cpp56
-rw-r--r--src/game/game_protocol.h3
-rw-r--r--src/game/game_variables.h1
-rw-r--r--src/game/server/game_server.cpp13
5 files changed, 83 insertions, 6 deletions
diff --git a/src/game/client/game_client.cpp b/src/game/client/game_client.cpp
index d31d0147..c2846c15 100644
--- a/src/game/client/game_client.cpp
+++ b/src/game/client/game_client.cpp
@@ -53,6 +53,8 @@ const obj_player_info *local_info = 0;
 static const obj_flag *flags[2] = {0,0};
 static const obj_game *gameobj = 0;
 
+static int picked_up_weapon = 0;
+
 static struct client_data
 {
 	char name[64];
@@ -2147,7 +2149,11 @@ void render_game()
 
 			if(inp_key_presses(config.key_next_weapon) || inp_key_presses(config.key_prev_weapon))
 				input.wanted_weapon = 0;
-			else
+			else if (config.autoswitch_weapons && picked_up_weapon)
+            {
+                input.wanted_weapon = picked_up_weapon;
+            }
+            else
 			{
 				if(inp_key_presses(config.key_weapon1)) input.wanted_weapon = 1;
 				if(inp_key_presses(config.key_weapon2)) input.wanted_weapon = 2;
@@ -2156,6 +2162,8 @@ void render_game()
 				if(inp_key_presses(config.key_weapon5)) input.wanted_weapon = 5;
 				if(inp_key_presses(config.key_weapon6)) input.wanted_weapon = 6;
 			}
+
+            picked_up_weapon = 0;
 		}
 
 		// stress testing
@@ -2766,6 +2774,12 @@ extern "C" void modc_message(int msg)
 			client_datas[cid].skin_info.color_feet = vec4(1,1,1,1);
 		}
 	}
+    else if(msg == MSG_WEAPON_PICKUP)
+    {
+        int weapon = msg_unpack_int();
+
+        picked_up_weapon = weapon+1;
+    }
 	else if(msg == MSG_READY_TO_ENTER)
 	{
 		client_entergame();
diff --git a/src/game/client/menu.cpp b/src/game/client/menu.cpp
index 6067edf0..9395965d 100644
--- a/src/game/client/menu.cpp
+++ b/src/game/client/menu.cpp
@@ -944,8 +944,24 @@ static void middle_render(const struct rect *r)
             {
                 static struct rect browser;
                 static bool inited = false;
+
                 ui_margin(r, 5, &browser);
-                ui_do_button_rect(&browser, "b", 0, &browser, draw_teewars_button, 0);
+
+                {
+                    struct rect button_row;
+                    static struct rect button_refresh, button_connect;
+
+                    ui_hsplit_b(&browser, 30, &browser, &button_row);
+                    ui_vsplit_l(&button_row, 100, &button_refresh, &button_row);
+                    ui_vsplit_l(&button_row, 100, &button_connect, &button_row);
+
+                    if (ui_do_button_rect(&button_refresh, "Refresh", 0, &button_refresh, draw_teewars_button, 0))
+                        client_serverbrowse_refresh(0);
+
+                    if (ui_do_button_rect(&button_connect, "Connect", 0, &button_connect, draw_teewars_button, 0))
+                    {}
+
+                }
 
                 if (!inited)
                 {
@@ -957,7 +973,34 @@ static void middle_render(const struct rect *r)
                     int server_count = client_serverbrowse_sorted_num();
                     int i;
 
-                    struct rect rest = *r;
+                    struct rect rest = browser;
+
+                    struct rect button_row;
+
+                    static struct rect button_name, button_players, button_players_max, button_map, button_latency, button_progression;
+
+                    ui_hsplit_t(&rest, 32, &button_row, &rest);
+                    ui_margin(&button_row, 1, &button_row);
+
+                    ui_vsplit_l(&button_row, 400, &button_name, &button_row);
+                    ui_vsplit_l(&button_row, 40, &button_players, &button_row);
+                    ui_vsplit_l(&button_row, 40, &button_players_max, &button_row);
+                    ui_vsplit_l(&button_row, 80, &button_map, &button_row);
+                    ui_vsplit_l(&button_row, 40, &button_latency, &button_row);
+                    ui_vsplit_l(&button_row, 40, &button_progression, &button_row);
+
+                    if (ui_do_button_rect(&button_name, "Name", 0, &button_name, draw_teewars_button, 0))
+                        config.b_sort = BROWSESORT_NAME;
+                    if (ui_do_button_rect(&button_players, "Players", 0, &button_players, draw_teewars_button, 0))
+                        config.b_sort = BROWSESORT_NUMPLAYERS;
+                    if (ui_do_button_rect(&button_players_max, "Max Players", 0, &button_players_max, draw_teewars_button, 0))
+                        config.b_sort = BROWSESORT_NUMPLAYERS; // TODO: real enum here
+                    if (ui_do_button_rect(&button_map, "Map", 0, &button_map, draw_teewars_button, 0))
+                        config.b_sort = BROWSESORT_MAP;
+                    if (ui_do_button_rect(&button_latency, "Ping", 0, &button_latency, draw_teewars_button, 0))
+                        config.b_sort = BROWSESORT_PING;
+                    if (ui_do_button_rect(&button_progression, "Progression", 0, &button_progression, draw_teewars_button, 0))
+                        config.b_sort = BROWSESORT_PING; // TODO: real enum here
 
                     for (i = 0; i < server_count; i++)
                     {
@@ -966,7 +1009,12 @@ static void middle_render(const struct rect *r)
                         struct rect col_name, col_players, col_players_max, col_map, col_latency, col_progression;
                         char temp[16];
 
+
                         ui_hsplit_t(&rest, 32, &row, &rest);
+
+                        if (rest.h < 0)
+                            break;
+
                         ui_margin(&row, 1, &row);
 
                         ui_vsplit_l(&row, 400, &col_name, &row);
@@ -1728,10 +1776,10 @@ static int menu_render(bool ingame)
 		ui_scale(scale);
 		int retn = ui_menu_render(screen);
 
-		gfx_texture_set(-1);
+        /*gfx_texture_set(-1);
 		gfx_lines_begin();
 		ui_foreach_rect(draw_rect);
-		gfx_lines_end();
+		gfx_lines_end();*/
 
 		return retn;
     }
diff --git a/src/game/game_protocol.h b/src/game/game_protocol.h
index eb59590a..1060a653 100644
--- a/src/game/game_protocol.h
+++ b/src/game/game_protocol.h
@@ -48,7 +48,8 @@ enum
 	MSG_EMOTICON,
 	MSG_STARTINFO, // client -> server
 	MSG_CHANGEINFO, // client -> server
-	MSG_READY_TO_ENTER // server -> client
+	MSG_READY_TO_ENTER, // server -> client
+    MSG_WEAPON_PICKUP
 };
 
 enum
diff --git a/src/game/game_variables.h b/src/game/game_variables.h
index 421f376e..1ab84f62 100644
--- a/src/game/game_variables.h
+++ b/src/game/game_variables.h
@@ -19,6 +19,7 @@ MACRO_CONFIG_INT(key_emoticon, 'E', 32, 512)
 MACRO_CONFIG_INT(key_chat, 'T', 32, 512)
 MACRO_CONFIG_INT(key_teamchat, 'Y', 32, 512)
 
+MACRO_CONFIG_INT(autoswitch_weapons, 0, 0, 1)
 MACRO_CONFIG_INT(scroll_weapon, 1, 0, 1)
 
 MACRO_CONFIG_INT(scorelimit, 20, 0, 1000)
diff --git a/src/game/server/game_server.cpp b/src/game/server/game_server.cpp
index 797f31bf..1ef23052 100644
--- a/src/game/server/game_server.cpp
+++ b/src/game/server/game_server.cpp
@@ -1189,6 +1189,9 @@ void powerup::reset()
 		spawntick = -1;
 }
 
+
+void send_weapon_pickup(int cid, int weapon);
+
 void powerup::tick()
 {
 	// wait for respawn
@@ -1245,6 +1248,8 @@ void powerup::tick()
 						create_sound(pos, SOUND_PICKUP_ROCKET);
 					else if(subtype == WEAPON_SHOTGUN)
 						create_sound(pos, SOUND_PICKUP_SHOTGUN);
+
+                    send_weapon_pickup(pplayer->client_id, subtype);
 				}
 			}
 			break;
@@ -1537,6 +1542,14 @@ void send_emoticon(int cid, int emoticon)
 	server_send_msg(-1);
 }
 
+void send_weapon_pickup(int cid, int weapon)
+{
+	msg_pack_start(MSG_WEAPON_PICKUP, MSGFLAG_VITAL);
+	msg_pack_int(weapon);
+	msg_pack_end();
+	server_send_msg(cid);
+}
+
 void mods_client_enter(int client_id)
 {
 	world->insert_entity(&players[client_id]);