Пример #1
0
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;
}
Пример #2
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);
         }
         } */
        
        
    }
    
    
    
}