diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2004-12-12 19:58:11 +0000 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2004-12-12 19:58:11 +0000 |
commit | 75b19e771c527e8444aae70543b2b617dae2e892 (patch) | |
tree | 7414fdd8d4a9bb9da3a79cd29a833c22f4380284 /src/gui/char_server.cpp | |
parent | 812e679c9befbfe98cc311723b8296df0384515e (diff) | |
download | mana-75b19e771c527e8444aae70543b2b617dae2e892.tar.gz mana-75b19e771c527e8444aae70543b2b617dae2e892.tar.bz2 mana-75b19e771c527e8444aae70543b2b617dae2e892.tar.xz mana-75b19e771c527e8444aae70543b2b617dae2e892.zip |
Ported server list dialog over to Guichan.
Diffstat (limited to 'src/gui/char_server.cpp')
-rw-r--r-- | src/gui/char_server.cpp | 255 |
1 files changed, 153 insertions, 102 deletions
diff --git a/src/gui/char_server.cpp b/src/gui/char_server.cpp index 7217abd8..c84fc167 100644 --- a/src/gui/char_server.cpp +++ b/src/gui/char_server.cpp @@ -25,118 +25,169 @@ #include "../graphic/graphic.h" char server[30]; +int showServerList = 1; -DIALOG char_server_dialog[] = { - /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */ - { tmw_dialog_proc, 300, 240, 200, 104, 0, -1, 0, 0, 0, 0, (char*)"Server select", NULL, NULL }, - { tmw_list_proc, 304, 262, 192, 55, 0, 0, 0, 0, 0, 0, (char*)server_list, NULL, NULL }, - { tmw_button_proc, 398, 322, 44, 18, 0, -1, 'o', D_EXIT, -1, 0, (char*)"&Ok", NULL, NULL }, - { tmw_button_proc, 446, 322, 44, 18, 0, -1, 'c', D_EXIT, -1, 0, (char*)"&Cancel", NULL, NULL }, - { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }, -}; - -/** Helper function to create server list */ -char *server_list(int index, int *size) { - static char buffer[30]; - if (index < 0) { - *size = n_server; - return NULL; - } - sprintf(buffer, "%s (%i)", server_info[index].name, server_info[index].online_users); - return buffer; +ServerListModel *serverListModel; +gcn::ListBox *serverList; + + +void ServerSelectListener::action(const std::string& eventId) { + printf("%s\n", eventId.c_str()); + if (eventId == "ok") { + server_char_server(serverList->getSelected()); + } + else if (eventId == "cancel") { + } + showServerList = 0; +} + + +int ServerListModel::getNumberOfElements() { + return n_server; +} + +std::string ServerListModel::getElementAt(int i) { + static char buffer[30]; + sprintf(buffer, "%s (%i)", server_info[i].name, + server_info[i].online_users); + return buffer; } + void char_server() { - state = LOGIN; - centre_dialog(char_server_dialog); - DIALOG_PLAYER *player = init_dialog(char_server_dialog, -1); - if(!player)ok("Error", "Unable to initialize login dialog"); - int gui_exit = 1; - if(n_server==0)char_server_dialog[2].flags |= D_DISABLED; - while ((!key[KEY_ESC])&&(gui_exit)&&(!key[KEY_ENTER])) { - clear_bitmap(buffer); - blit((BITMAP *)graphic[LOGIN_BMP].dat, buffer, 0, 0, 0, 0, 800, 600); - gui_exit = gui_update(player); - blit(buffer, screen, 0, 0, 0, 0, 800, 600); - } - gui_exit = shutdown_dialog(player); - if((gui_exit==2)||(key[KEY_ENTER])) { - server_char_server(); - } + // Create dialog + gcn::Container *dialog; + gcn::Button *okButton; + gcn::Button *cancelButton; + gcn::ScrollArea *scrollArea; + + serverListModel = new ServerListModel(); + dialog = new gcn::Container(); + serverList = new gcn::ListBox(serverListModel); + scrollArea = new gcn::ScrollArea(serverList); + okButton = new gcn::Button("OK"); + cancelButton = new gcn::Button("Cancel"); + + dialog->setDimension(gcn::Rectangle(300, 200, 200, 100)); + scrollArea->setDimension(gcn::Rectangle(4, 4, 192, 55)); + okButton->setPosition(120, 70); + cancelButton->setPosition(146, 70); + + serverList->setEventId("ok"); + okButton->setEventId("ok"); + cancelButton->setEventId("cancel"); + + ServerSelectListener *actionListener = new ServerSelectListener(); + serverList->addActionListener(actionListener); + okButton->addActionListener(actionListener); + cancelButton->addActionListener(actionListener); + + dialog->add(scrollArea); + dialog->add(okButton); + dialog->add(cancelButton); + + guiTop->add(dialog); + + state = LOGIN; + + if (n_server == 0) { + // Disable Ok button + //okButton->char_server_dialog[2].flags |= D_DISABLED; + } else { + // Select first server + serverList->setSelected(1); + } + + showServerList = 1; + while (showServerList) { + clear_bitmap(buffer); + blit((BITMAP *)graphic[LOGIN_BMP].dat, buffer, 0, 0, 0, 0, 800, 600); + gui_update(NULL); + blit(buffer, screen, 0, 0, 0, 0, 800, 600); + } + + delete dialog; + delete serverList; + delete serverListModel; + delete scrollArea; + delete okButton; + delete cancelButton; + delete actionListener; } -void server_char_server() { - int ret; - state = LOGIN; +void server_char_server(int serverIndex) { + int ret; + state = LOGIN; // Connect to char server - ret = open_session(iptostring(server_info[char_server_dialog[1].d1].address), server_info[char_server_dialog[1].d1].port); - if(ret==SOCKET_ERROR) { - ok("Error", "Unable to connect to char server"); - return; - } - - // Send login infos - WFIFOW(0) = net_w_value(0x0065); - WFIFOL(2) = net_l_value(account_ID); - WFIFOL(6) = net_l_value(session_ID1); - WFIFOL(10) = net_l_value(session_ID2); - WFIFOW(14) = 0; - WFIFOB(16) = net_b_value(sex); - WFIFOSET(17); - - while((in_size<4)||(out_size>0))flush(); - RFIFOSKIP(4); + ret = open_session(iptostring(server_info[serverIndex].address), + server_info[serverIndex].port); + if (ret == SOCKET_ERROR) { + ok("Error", "Unable to connect to char server"); + return; + } + + // Send login infos + WFIFOW(0) = net_w_value(0x0065); + WFIFOL(2) = net_l_value(account_ID); + WFIFOL(6) = net_l_value(session_ID1); + WFIFOL(10) = net_l_value(session_ID2); + WFIFOW(14) = 0; + WFIFOB(16) = net_b_value(sex); + WFIFOSET(17); + + while((in_size<4)||(out_size>0))flush(); + RFIFOSKIP(4); while(in_size<3)flush(); - if(RFIFOW(0)==0x006b) { - while(in_size<RFIFOW(2))flush(); - n_character = (RFIFOW(2)-24)/106; - char_info = (PLAYER_INFO *)malloc(sizeof(PLAYER_INFO)*n_character); - for(int i=0;i<n_character;i++) { - char_info[i].id = RFIFOL(24+106*i); - strcpy(char_info[i].name, RFIFOP(24+106*i+74)); - char_info[i].hp = RFIFOW(24+106*i+42); - char_info[i].max_hp = RFIFOW(24+106*i+44); - char_info[i].xp = RFIFOL(24+106*i+4); - char_info[i].gp = RFIFOL(24+106*i+8); - char_info[i].job_xp = RFIFOL(24+106*i+12); - char_info[i].job_lv = RFIFOL(24+106*i+16); - char_info[i].sp = RFIFOW(24+106*i+46); - char_info[i].max_sp = RFIFOW(24+106*i+48); - char_info[i].lv = RFIFOW(24+106*i+58); - char_info[i].STR = RFIFOB(24+106*i+98); - char_info[i].AGI = RFIFOB(24+106*i+99); - char_info[i].VIT = RFIFOB(24+106*i+100); - char_info[i].INT = RFIFOB(24+106*i+101); - char_info[i].DEX = RFIFOB(24+106*i+102); - char_info[i].LUK = RFIFOB(24+106*i+103); - char_info[i].hair_style = RFIFOW(24+106*i+54); - char_info[i].hair_color = RFIFOW(24+106*i+70); - char_info[i].weapon = RFIFOW(24+106*i+56); - } - state = CHAR_SELECT; - - log("CharServer", "Player: %s (Packet ID: %x, Length: %d", - char_info->name, RFIFOW(0), RFIFOW(2)); - - - RFIFOSKIP(RFIFOW(2)); - } else if(RFIFOW(0)==0x006c) { - switch(RFIFOB(2)) { - case 0: - ok("Error", "Access denied"); - break; - case 1: - ok("Error", "Cannot use this ID"); + if(RFIFOW(0)==0x006b) { + while(in_size<RFIFOW(2))flush(); + n_character = (RFIFOW(2)-24)/106; + char_info = (PLAYER_INFO *)malloc(sizeof(PLAYER_INFO)*n_character); + for(int i=0;i<n_character;i++) { + char_info[i].id = RFIFOL(24+106*i); + strcpy(char_info[i].name, RFIFOP(24+106*i+74)); + char_info[i].hp = RFIFOW(24+106*i+42); + char_info[i].max_hp = RFIFOW(24+106*i+44); + char_info[i].xp = RFIFOL(24+106*i+4); + char_info[i].gp = RFIFOL(24+106*i+8); + char_info[i].job_xp = RFIFOL(24+106*i+12); + char_info[i].job_lv = RFIFOL(24+106*i+16); + char_info[i].sp = RFIFOW(24+106*i+46); + char_info[i].max_sp = RFIFOW(24+106*i+48); + char_info[i].lv = RFIFOW(24+106*i+58); + char_info[i].STR = RFIFOB(24+106*i+98); + char_info[i].AGI = RFIFOB(24+106*i+99); + char_info[i].VIT = RFIFOB(24+106*i+100); + char_info[i].INT = RFIFOB(24+106*i+101); + char_info[i].DEX = RFIFOB(24+106*i+102); + char_info[i].LUK = RFIFOB(24+106*i+103); + char_info[i].hair_style = RFIFOW(24+106*i+54); + char_info[i].hair_color = RFIFOW(24+106*i+70); + char_info[i].weapon = RFIFOW(24+106*i+56); + } + state = CHAR_SELECT; + + log("CharServer", "Player: %s (Packet ID: %x, Length: %d", + char_info->name, RFIFOW(0), RFIFOW(2)); + + + RFIFOSKIP(RFIFOW(2)); + } else if(RFIFOW(0)==0x006c) { + switch(RFIFOB(2)) { + case 0: + ok("Error", "Access denied"); + break; + case 1: + ok("Error", "Cannot use this ID"); + break; + default: + ok("Error", "Rejected from server"); break; - default: - ok("Error", "Rejected from server"); - break; - } - RFIFOSKIP(3); - close_session(); - } else ok("Error", "Unknown error"); - // Todo: add other packets + } + RFIFOSKIP(3); + close_session(); + } else ok("Error", "Unknown error"); + // Todo: add other packets } |