int main(int argc, char * argv[]) { ParseArg(argc,argv); if (gDaemonFlag) { CUtil::DaemonInit(); } sSessCtrl; sLog->Initialize(); //if (!CUtil::SetRLimit()) // return 0; if (!g_serverIni.OpenFile("server.ini")) { IME_ERROR("Cannot open server.ini"); return 0; } if (!InitServer()) { IME_ERROR("InitServer failed"); return 0; } // //do many init db here // if (!StartDB()) // { // IME_ERROR("StartDB failed"); // return 0; // } IME_LOG("GameServer Start!"); //todo //hooksignal HookSignals(); ///- Launch CNetRunnable thread CNetRunnable * pNetRunnable = new CNetRunnable; ZThread::Thread netThread(pNetRunnable); netThread.setPriority((ZThread::Priority)1); ZThread::Thread *pRelayClientThread = NULL; if (CSet::ClientSessionRun) { ///- Launch CRelayClientRunnable thread CRelayClientRunnable * pRelayClientRunnable = new CRelayClientRunnable; // ZThread::Thread relayClientThread(pRelayClientRunnable); // relayClientThread.setPriority((ZThread::Priority)1); pRelayClientThread = new ZThread::Thread(pRelayClientRunnable); pRelayClientThread->setPriority((ZThread::Priority)1); } ///- Launch CWorldRunnable thread ZThread::Thread worldThread(new CWorldRunnable); worldThread.setPriority((ZThread::Priority)1); worldThread.wait(); netThread.wait(); //relayClientThread.wait(); if (pRelayClientThread != NULL) pRelayClientThread->wait(); //unhooksignal UnHookSignals(); EndServer(); IME_LOG("GameServer End!"); return 0; }
void GraphicsTCOD::drawMainInterface() { Widget::setConsole(output); HBox *hMenu=new HBox(12,-1,0); ToolBar *menuToolbar = new ToolBar(0,0,6,NULL,NULL); menuToolbar->addWidget(new Button("Menu",NULL,menuCbk,NULL)); hMenu->addWidget(menuToolbar); ToolBar *playerToolbar = new ToolBar(0,0,6, NULL, NULL); playerToolbar->addWidget(new Button("Player", NULL, NULL, NULL)); hMenu->addWidget(playerToolbar); ToolBar *socialToolbar = new ToolBar(0,0,6, NULL, NULL); socialToolbar->addWidget(new Button("Social", NULL, NULL, NULL)); hMenu->addWidget(socialToolbar); ToolBar *worldToolbar = new ToolBar(0,0,6, NULL, NULL); worldToolbar->addWidget(new Button("World", NULL, NULL, NULL)); hMenu->addWidget(worldToolbar); ToolBar *toolsToolbar = new ToolBar(0,0,6, NULL, NULL); toolsToolbar->addWidget(new Button("Tools", NULL, NULL, NULL)); hMenu->addWidget(toolsToolbar); ToolBar *helpToolbar = new ToolBar(0,0,6, NULL, NULL); helpToolbar->addWidget(new Button("Help", NULL, NULL, NULL)); hMenu->addWidget(helpToolbar); hMenu->setBackgroundColor(TCODColor(0,0,0), TCODColor(128,128,128)); chatBox = new ScrollBox(0, 0, textOutputConsole->getWidth(), textOutputConsole->getHeight(), 512, textOutputConsole, cMap, this); serverBox = new ScrollBox(0, 0, serverConsole->getWidth(), serverConsole->getHeight()-2, 512, serverConsole, cMap, this); //serverBox->setConsole(serverConsole); chatBox->setRealPosition(0, 32); chatBox->takeCommands(true); commandConsole = chatBox; serverBox->setRealPosition(MAIN_WIDTH/2, 32); serverBox->takeCommands(true); serverBox->insertText("Welcome to The ASCII Project"); serverBox->insertText(" Version 0.0.0o "); serverBox->insertText(" "); serverBox->insertText("Tip: all server input begins with "); serverBox->insertText("The / character."); serverBox->insertText(" "); serverBox->insertText(" "); serverBox->insertText(" "); serverBox->insertText("Please /connect to continue..."); sConsole = chatBox; inputText = new TCODText(1, serverConsole->getHeight()-2, serverConsole->getWidth()-2, 1, serverConsole->getWidth()-2); inputText->setProperties(32, 1000, "$>", 1); inputText->setColors(TCODColor(0,255,0), TCODColor(0,0,0), 1.0f); inputText->render(serverConsole); //offscreenConsole->print(0,0, "Welcome To The ASCII Project"); serverConsole->hline(0,serverConsole->getHeight()-1, serverConsole->getWidth()); serverConsole->hline(0,serverConsole->getHeight()-3, serverConsole->getWidth()); serverConsole->vline(0,0, serverConsole->getHeight()); serverConsole->vline(serverConsole->getWidth()-1,0, serverConsole->getHeight()); bool textInput = false; bool popupOpen = false; //bool placeActionMode = false; unpacking = true; connected = false; loggedIn = false; commandMode = false; APIinQueue = false; chatMessageInQueue = false; actionMode = "placeFloor"; chatText = ""; boost::asio::io_service pri_io_service; tcp::resolver pri_resolver(pri_io_service); if(DEBUG_MODE) { tcp::resolver::query pri_query("localhost", "5250"); tcp::resolver::iterator iterator = pri_resolver.resolve(pri_query); cnet = new ClientSession(pri_io_service, iterator, cMap, this); } else { tcp::resolver::query pri_query("pub.theasciiproject.com", "5250"); tcp::resolver::iterator iterator = pri_resolver.resolve(pri_query); cnet = new ClientSession(pri_io_service, iterator, cMap, this); } boost::thread netThread(&GraphicsTCOD::requestMap, this); //TCODConsole::disableKeyboardRepeat(); while( !TCODConsole::isWindowClosed() ) { TCOD_key_t key; TCOD_mouse_t mouse; TCODSystem::checkForEvent(TCOD_EVENT_KEY_PRESS|TCOD_EVENT_MOUSE,&key,&mouse); Widget::updateWidgets(key,mouse); if(!popupOpen) { if(textInput) inputText->update(key); chatBox->update(mouse); serverBox->update(mouse); } if(drawMenuCheck) { menuPopup=new VBox(35,10,0); ToolBar *menuPopupOptions = new ToolBar(0,0,6,NULL,NULL); menuPopupOptions->addWidget(new Button("Return",NULL,closeMenuCbk,NULL)); menuPopupOptions->addWidget(new Button("Quit",NULL,quitCbk,NULL)); menuPopup->addWidget(menuPopupOptions); popupOpen = true; drawMenuCheck = false; } if(closeMenuCheck) { menuPopup->clear(); delete menuPopup; output->clear(); fixBottom(); popupOpen = false; closeMenuCheck = false; } if(!textInput && loggedIn) { if(key.vk == TCODK_SPACE) { if(commandMode) commandMode = false; else commandMode = true; } if(key.vk == TCODK_UP) { apiCall = "/8"; APIinQueue = true; } else if(key.vk == TCODK_DOWN) { apiCall = "/2"; APIinQueue = true; } else if(key.vk == TCODK_RIGHT) { apiCall = "/6"; APIinQueue = true; } else if(key.vk == TCODK_LEFT) { apiCall = "/4"; APIinQueue = true; } else if(key.c == 'w' && !commandMode) { apiCall = "/8"; APIinQueue = true; } else if(key.c == 'a' && !commandMode) { apiCall = "/4"; APIinQueue = true; } else if(key.c == 's' && !commandMode) { apiCall = "/2"; APIinQueue = true; } else if(key.c == 'd' && !commandMode) { apiCall = "/6"; APIinQueue = true; } else if(key.c == '5' && commandMode) { apiCall = "/mapReset"; APIinQueue = true; } else if(key.c == '<' && !commandMode) { apiCall = "/5"; APIinQueue = true; } else if(key.c == '>' && !commandMode) { apiCall = "/15"; APIinQueue = true; } else if(key.c == 'i' && !commandMode) { if(actionMode == "removeTile") apiCall = "/18"; else if(actionMode == "placeWall") apiCall = "/28"; else if(actionMode == "placeFloor") apiCall = "/38"; else if(actionMode == "digHole") apiCall = "/48"; APIinQueue = true; } else if(key.c == 'j' && !commandMode) { if(actionMode == "removeTile") apiCall = "/14"; else if(actionMode == "placeWall") apiCall = "/24"; else if(actionMode == "placeFloor") apiCall = "/34"; else if(actionMode == "digHole") apiCall = "/44"; APIinQueue = true; } else if(key.c == 'k' && !commandMode) { if(actionMode == "removeTile") apiCall = "/12"; else if(actionMode == "placeWall") apiCall = "/22"; else if(actionMode == "placeFloor") apiCall = "/32"; else if(actionMode == "digHole") apiCall = "/42"; APIinQueue = true; } else if(key.c == 'l' && !commandMode) { if(actionMode == "removeTile") apiCall = "/16"; else if(actionMode == "placeWall") apiCall = "/26"; else if(actionMode == "placeFloor") apiCall = "/36"; else if(actionMode == "digHole") apiCall = "/46"; APIinQueue = true; } else if(key.c == 'u' && !commandMode) { if(actionMode == "digHole") { apiCall = "/25"; APIinQueue = true; } } else if(key.c == 'o' && !commandMode) { if(actionMode == "digHole") { apiCall = "/35"; APIinQueue = true; } } else if((key.c == 'd' || key.c == 'r') && commandMode) { actionMode = "removeTile"; } else if(key.c == 'w' && commandMode) { actionMode = "placeWall"; } else if(key.c == 'D' && commandMode) { actionMode = "digHole"; } else if(key.c == 'f' && commandMode) { actionMode = "placeFloor"; } } if(key.vk == TCODK_ESCAPE) { if(!textInput && !popupOpen) { drawMenuCheck = true; } inputText->reset(); textInput = false; if(popupOpen) { closeMenuCheck = true; } } if(key.vk == TCODK_ENTER && textInput == true) { std::string tmpText = inputText->getText(); if(tmpText != "" && tmpText.at(0) != '/') { if(!connected) { chatText = tmpText; serverBox->insertText(chatText); chatText = ""; } else { //chatText.clear(); chatText = tmpText; chatMessageInQueue = true; } } if(tmpText != "" && tmpText.at(0) == '/') { if(tmpText == "/connect" && !connected) { // Begin Networking if(cnet->Connect()) { chatBox->insertText("Connected Successfully"); chatBox->insertText(" "); cnet->getLoginScreen(); chatBox->insertText(" "); chatBox->insertText(" "); connected = true; } else { chatBox->insertText("Failed to Connect, please retry"); connected = false; } } else if(tmpText == "/connect" && connected) { chatBox->insertText("Already Connected"); } else if(tmpText == "/quit" && connected) { serverCommandInQueue = true; serverCall = "/quit"; } else if (tmpText == "/quit" && !connected) { exit(0); } else { if(!connected) { chatBox->insertText("Not Connected, please /connect first"); } else if(connected && !loggedIn) { cnet->sendCommand(tmpText); cnet->getResponse(); } else if(connected && loggedIn) { serverCommandInQueue = true; serverCall = tmpText; } } } inputText->reset(); delete inputText; inputText = new TCODText(1, serverConsole->getHeight()-2, serverConsole->getWidth()-2, 1, serverConsole->getWidth()-2); inputText->setProperties(32, 1000, "$>", 1); inputText->setColors(TCODColor(0,255,0), TCODColor(0,0,0), 1.0f); textInput = false; } else if(key.vk == TCODK_ENTER && textInput == false) { textInput = true; } mapOutput->clear(); if(connected && loggedIn && !commandMode) { mapOutput->setDefaultForeground(TCODColor(255,255,255)); mapOutput->printEx(mapOutput->getWidth()/2, mapOutput->getHeight()-1, TCOD_BKGND_NONE, TCOD_CENTER, "Action Mode", TCODColor(255,255,255)); } else if(connected && loggedIn && commandMode) { mapOutput->setDefaultForeground(TCODColor(255,255,255)); mapOutput->printEx(mapOutput->getWidth()/2, mapOutput->getHeight()-1, TCOD_BKGND_NONE, TCOD_CENTER, "Select Mode", TCODColor(255,255,255)); } requestMap(); // if(!unpacking) // drawAll(); drawAll(); TCODConsole::blit(mapOutput, 0, 0, 0, 0, output, 0, 2); inputText->render(serverConsole); chatBox->render(); serverBox->render(); Widget::renderWidgets(); fixBottom(); TCODConsole::blit(serverConsole,0,0,0,0,output,MAIN_WIDTH/2,32, 1.0f, 1.0f); TCODConsole::blit(textOutputConsole,0,0,0,0,output,0,32, 1.0f, 1.0f); render(); //mapOutput->clear(); /* if((key.c == 'a' || key.c == 's' || key.c == 'w' || key.c == 'd') && connected && loggedIn && !textInput) { while(key.vk != TCODK_NONE) { TCODSystem::checkForEvent(TCOD_EVENT_KEY_PRESS|TCOD_EVENT_MOUSE,&key,&mouse); } } */ } }