diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2009-06-15 14:01:36 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2009-06-15 14:01:36 +0000 |
| commit | 7b68ff42773976cafe39b59dc026350cda5c05fd (patch) | |
| tree | a64ff77b56d62f3860e82513df4874436c353621 /src | |
| parent | 0160f2651448c2c2df332d2447629e23d5bd4a9a (diff) | |
| download | zcatch-7b68ff42773976cafe39b59dc026350cda5c05fd.tar.gz zcatch-7b68ff42773976cafe39b59dc026350cda5c05fd.zip | |
fixed chaining of console commands, allows snatching updates of console variables. cleaned up some code
Diffstat (limited to 'src')
| -rw-r--r-- | src/engine/client/ec_client.c | 4 | ||||
| -rw-r--r-- | src/engine/e_console.c | 21 | ||||
| -rw-r--r-- | src/engine/e_console.h | 10 | ||||
| -rw-r--r-- | src/game/client/components/menus_demo.cpp | 63 | ||||
| -rw-r--r-- | src/game/client/gameclient.cpp | 20 | ||||
| -rw-r--r-- | src/game/client/gameclient.hpp | 3 |
6 files changed, 80 insertions, 41 deletions
diff --git a/src/engine/client/ec_client.c b/src/engine/client/ec_client.c index e741958f..0c707ccf 100644 --- a/src/engine/client/ec_client.c +++ b/src/engine/client/ec_client.c @@ -417,6 +417,10 @@ int client_send_msg() if(!info) return -1; + + if(client_state() == CLIENTSTATE_OFFLINE) + return 0; + mem_zero(&packet, sizeof(NETCHUNK)); diff --git a/src/engine/e_console.c b/src/engine/e_console.c index 0f6e6acd..5c0f37f3 100644 --- a/src/engine/e_console.c +++ b/src/engine/e_console.c @@ -428,6 +428,27 @@ static void str_variable_command(void *result, void *user_data) } } +static void console_chain(void *result, void *user_data) +{ + COMMANDCHAIN *info = (COMMANDCHAIN *)user_data; + info->chain_callback(result, info->user_data, info->callback, info->callback_user_data); +} + +void console_chain_command(const char *cmd, COMMANDCHAIN *chaininfo, CONSOLE_CHAIN_CALLBACK cb, void *user) +{ + COMMAND *command = console_get_command(cmd); + + /* store info */ + chaininfo->chain_callback = cb; + chaininfo->callback = command->callback; + chaininfo->callback_user_data = command->user_data; + chaininfo->user_data = user; + + /* chain */ + command->callback = console_chain; + command->user_data = chaininfo; +} + void console_init() { MACRO_REGISTER_COMMAND("echo", "r", CFGFLAG_SERVER|CFGFLAG_CLIENT, con_echo, 0x0, "Echo the text"); diff --git a/src/engine/e_console.h b/src/engine/e_console.h index c2393e39..b37931b2 100644 --- a/src/engine/e_console.h +++ b/src/engine/e_console.h @@ -6,6 +6,7 @@ extern "C"{ #endif typedef void (*CONSOLE_CALLBACK)(void *result, void *user_data); +typedef void (*CONSOLE_CHAIN_CALLBACK)(void *result, void *user_data, CONSOLE_CALLBACK cb, void *cbuser); typedef struct COMMAND_t { @@ -18,6 +19,14 @@ typedef struct COMMAND_t struct COMMAND_t *next; } COMMAND; +typedef struct COMMANDCHAIN_t +{ + CONSOLE_CHAIN_CALLBACK chain_callback; + CONSOLE_CALLBACK callback; + void *callback_user_data; + void *user_data; +} COMMANDCHAIN; + void console_init(); void console_register(COMMAND *cmd); void console_execute_line(const char *str); @@ -25,6 +34,7 @@ void console_execute_line_stroked(int stroke, const char *str); void console_execute_file(const char *filename); void console_possible_commands(const char *str, int flagmask, void (*callback)(const char *cmd, void *user), void *user); COMMAND *console_get_command(const char *cmd); +void console_chain_command(const char *cmd, COMMANDCHAIN *chaininfo, CONSOLE_CHAIN_CALLBACK cb, void *user); void console_print(const char *str); void console_register_print_callback(void (*callback)(const char *, void *user_data), void *user_data); diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index efcf05b8..594ee3df 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -178,6 +178,8 @@ static float listbox_rowheight; static int listbox_itemindex; static int listbox_selected_index; static int listbox_new_selected; +static int listbox_doneevents; +static int listbox_numitems; void MENUS::ui_do_listbox_start(void *id, const RECT *rect, float row_height, const char *title, int num_items, int selected_index) { @@ -207,6 +209,8 @@ void MENUS::ui_do_listbox_start(void *id, const RECT *rect, float row_height, co listbox_new_selected = selected_index; listbox_itemindex = 0; listbox_rowheight = row_height; + listbox_numitems = num_items; + listbox_doneevents = 0; //int num_servers = client_serverbrowse_sorted_num(); @@ -270,6 +274,25 @@ MENUS::LISTBOXITEM MENUS::ui_do_listbox_nextitem(void *id) if(listbox_selected_index==listbox_itemindex) { + if(!listbox_doneevents) + { + listbox_doneevents = 1; + + for(int i = 0; i < num_inputevents; i++) + { + if(inputevents[i].flags&INPFLAG_PRESS) + { + if(inputevents[i].key == KEY_DOWN) listbox_new_selected++; + if(inputevents[i].key == KEY_UP) listbox_new_selected--; + } + } + + if(listbox_new_selected >= listbox_numitems) + listbox_new_selected = listbox_numitems-1; + if(listbox_new_selected < 0) + listbox_new_selected = 0; + } + //selected_index = i; RECT r = row; ui_margin(&r, 1.5f, &r); @@ -289,28 +312,6 @@ int MENUS::ui_do_listbox_end() return listbox_new_selected; } -/* -void MENUS::demolist_listdir_callback(const char *name, int is_dir, void *user) -{ - - (*count)++; - LISTBOXITEM item = ui_do_listbox_nextitem((void*)(10+*count)); - if(item.visible) - ui_do_label(&item.rect, name, item.rect.h*fontmod_height, -1); -} - - - DEMOITEM *demos; - int num_demos; - */ - -/*void MENUS::demolist_count_callback(const char *name, int is_dir, void *user) -{ - if(is_dir || name[0] == '.') - return; - (*(int *)user)++; -}*/ - struct FETCH_CALLBACKINFO { MENUS *self; @@ -329,32 +330,14 @@ void MENUS::demolist_fetch_callback(const char *name, int is_dir, void *user) str_format(item.filename, sizeof(item.filename), "%s/%s", info->prefix, name); str_copy(item.name, name, sizeof(item.name)); info->self->demos.add(item); - - /* - if(info->count == info->self->num_demos) - return; - - info->count++; - */ } - void MENUS::demolist_populate() { demos.clear(); - /*if(demos) - mem_free(demos); - demos = 0; - num_demos = 0;*/ - char buf[512]; str_format(buf, sizeof(buf), "%s/demos", client_user_directory()); - //fs_listdir(buf, demolist_count_callback, &num_demos); - //fs_listdir("demos", demolist_count_callback, &num_demos); - - //demos = (DEMOITEM *)mem_alloc(sizeof(DEMOITEM)*num_demos, 1); - //mem_zero(demos, sizeof(DEMOITEM)*num_demos); FETCH_CALLBACKINFO info = {this, buf, 0}; fs_listdir(buf, demolist_fetch_callback, &info); diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index fc17b94f..fa2f4de0 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -248,7 +248,18 @@ void GAMECLIENT::on_console_init() // let all the other components register their console commands for(int i = 0; i < all.num; i++) all.components[i]->on_console_init(); - + + + // + { static COMMANDCHAIN chain; console_chain_command("player_name", &chain, conchain_special_infoupdate, this); } + { static COMMANDCHAIN chain; console_chain_command("player_use_custom_color", &chain, conchain_special_infoupdate, this); } + { static COMMANDCHAIN chain; console_chain_command("player_color_body", &chain, conchain_special_infoupdate, this); } + { static COMMANDCHAIN chain; console_chain_command("player_color_feet", &chain, conchain_special_infoupdate, this); } + { static COMMANDCHAIN chain; console_chain_command("player_skin", &chain, conchain_special_infoupdate, this); } + + + + // suppress_events = false; } @@ -954,3 +965,10 @@ void GAMECLIENT::con_kill(void *result, void *user_data) { ((GAMECLIENT*)user_data)->send_kill(-1); } + +void GAMECLIENT::conchain_special_infoupdate(void *result, void *user_data, CONSOLE_CALLBACK cb, void *cbuser) +{ + cb(result, cbuser); + if(console_arg_num(result)) + ((GAMECLIENT*)user_data)->send_info(false); +} diff --git a/src/game/client/gameclient.hpp b/src/game/client/gameclient.hpp index 35b95f27..e354430d 100644 --- a/src/game/client/gameclient.hpp +++ b/src/game/client/gameclient.hpp @@ -1,5 +1,6 @@ #include <base/vmath.hpp> +#include <engine/e_console.h> #include <game/gamecore.hpp> #include "render.hpp" @@ -34,6 +35,8 @@ class GAMECLIENT static void con_team(void *result, void *user_data); static void con_kill(void *result, void *user_data); + static void conchain_special_infoupdate(void *result, void *user_data, CONSOLE_CALLBACK cb, void *cbuser); + public: bool suppress_events; bool new_tick; |