All pastes #1567560 Raw Edit

Stuff

public diff v1 · immutable
#1567560 ·published 2009-09-15 22:02 UTC
rendered paste body
Index: configure.ac===================================================================--- configure.ac	(revision 14)+++ configure.ac	(working copy)@@ -14,6 +14,9 @@ AC_PROG_INSTALL  # Checks for libraries.+AC_CHECK_LIB([Xxf86vm], [main], [], [echo "ERROR: Xxf86vm library not found." && exit 1])+AC_CHECK_LIB([GL], [main], [], [echo "ERROR: GL library not found." && exit 1])+AC_CHECK_LIB([GLU], [main], [], [echo "ERROR: GLU library not found." && exit 1]) AC_CHECK_LIB([Irrlicht], [main], [], [echo "ERROR: Irrlicht library not found." && exit 1]) AC_CHECK_LIB([ssl], [main], [], [echo "ERROR: ssl library not found." && exit 1]) AC_CHECK_LIB([crypto], [main], [], [echo "ERROR: ssl crypto library not found." && exit 1])Index: src/client/Client.cpp===================================================================--- src/client/Client.cpp	(revision 0)+++ src/client/Client.cpp	(revision 0)@@ -0,0 +1,144 @@+#include "common.h"++#include "Client.h"+#include "ClientNetwork.h"+#include "ClientSession.h"+#include "GUI.h"+#include <fstream>++volatile uint8 Client::_clientState = CS_INIT;+++Client::Client()+{+    sLog.outDebug("Client Master object created");+}++Client::~Client()+{+    sLog.outDebug("Client Master object destroyed");+}++void Client::SetConfigFile(char *c)+{+    _confFileName = c;+}+++void Client::HookSignals(void)+{+    signal(SIGINT, _OnSignal);+    signal(SIGQUIT, _OnSignal);+    signal(SIGTERM, _OnSignal);+    signal(SIGABRT, _OnSignal);+#ifdef _WIN32+    signal(SIGBREAK, _OnSignal);+#endif+}++void Client::UnhookSignals(void)+{+    signal(SIGINT, 0);+    signal(SIGQUIT, 0);+    signal(SIGTERM, 0);+    signal(SIGABRT, 0);+#ifdef _WIN32+    signal(SIGBREAK, 0);+#endif+}++void Client::Terminate(void)+{+    sLog.outString("Terminating client NOW.");+    _clientState = CS_KILL;+}++void Client::Shutdown(void)+{+    sLog.outString("Client shutdown started...");+    _clientState = CS_SHUTDOWN;+}+++void Client::_OnSignal(int s)+{+    switch(s)+    {+        case SIGINT:+        case SIGQUIT:+        case SIGTERM:+            Shutdown();+            break;++        case SIGABRT:+#ifdef _WIN32+        case SIGBREAK:+#endif+            Terminate();+            break;+    }+}++++bool Client::Initialize()+{+    _clientState = CS_INIT;+    sLog.outString("Reading config file %s",_confFileName.c_str());+    if(!_ReadConfig())+    {+	sLog.outError("Could not read config file. Aborting");+	return false;+    }+    _ApplyConfig();+    sLog.outString("Starting GUI");+    if(!sGUI.Initialize())+    {+	sLog.outError("Could not Initialize GUI. Aborting");+    }+    return true;+}++bool Client::_ReadConfig()+{+    std::string line, vv, vn;+    const char *fn = _confFileName.c_str();+    +    std::ifstream ifs(fn);+    while(getline(ifs,line))+    {+	if(line.empty() || (line.at(0)=='/' && line.at(0)=='/') || line.at(0)=='#' )+	{+	    line.clear();+	    continue;+	}+	while(line.at(0)== ' ' || line.at(0)=='\t')+	    line.erase(0,1);+	vn.clear();+	vv.clear();+	unsigned int pos = line.find("=");+	if(pos!=std::string::npos)+	{+	    vn = line.substr(0,pos);+	    vv = line.substr(pos+1,line.length()-1);+	    _confvars[vn] = vv;+	    DEBUG_LOG("Var import [%s] = '%s'",vn.c_str(),vv.c_str());+	}+	line.clear();+    }+    ifs.close();+}++void Client::_ApplyConfig()+{+    _config.LoginserverAdress=(_confvars["Login.Server.IP"].size()>0)?_confvars["Login.Server.IP"]:"127.0.0.1";+    _config.LoginserverPort=(_confvars["Login.Server.Port"].size()>0)?atoi(_confvars["Login.Server.Port"].c_str()):9066;+    _config.GUIwidth=(_confvars["GUI.width"].size()>0)?atoi(_confvars["GUI.width"].c_str()):800;+    _config.GUIheight=(_confvars["GUI.height"].size()>0)?atoi(_confvars["GUI.height"].c_str()):600;+    _config.GUIbitdepth=(_confvars["GUI.bitdepth"].size()>0)?atoi(_confvars["GUI.bitdepth"].c_str()):16;+}++Client& Client::Instance()+{+    return *ACE_Singleton<Client,ACE_Thread_Mutex>::instance();+}\ No newline at end of fileIndex: src/client/Client.h===================================================================--- src/client/Client.h	(revision 0)+++ src/client/Client.h	(revision 0)@@ -0,0 +1,64 @@+#ifndef CLIENT_H+#define CLIENT_H++#include <ace/Basic_Types.h>+#include <ace/Singleton.h>+#include <ace/Thread_Mutex.h>+++#include "common.h"++/* This is the main Client class */+/* It should handle:+    - client settings+    - client states+    - connection to the server++*/+enum ClientStates+{+    CS_INIT = 0,  		//Initial State, not connected to login server+    CS_LOGINSCREEN = 1,		//connected to loginserver+    CS_INGAME = 2,		//logged in+    CS_SHUTDOWN = 3,		//shutting down+    CS_KILL = 4,		//go down in flames+    CS_COUNT = 5+};++struct ClientConfig+{+    std::string LoginserverAdress;+    uint16 LoginserverPort;+    uint16 GUIwidth, GUIheight;+    uint8 GUIbitdepth;+};++class Client+{+public:+    Client();+    ~Client();+    static Client& Instance();++    bool Initialize(void);+    void SetConfigFile(char*);+    inline const ClientConfig *GetConfig(void) { return &_config; }+    static void HookSignals(void);+    static void UnhookSignals(void);+    static void Shutdown(void);+    static void Terminate(void);++    static volatile uint8 _clientState;+ +private:+    static void _OnSignal(int);+    std::string _confFileName;+    ClientConfig _config;+    std::map<std::string,std::string> _confvars; // plaintext config variables+    bool _ReadConfig(void);+    void _ApplyConfig(void);++};+#define sClient Client::Instance()++#endif\ No newline at end of fileIndex: src/client/main.cpp===================================================================--- src/client/main.cpp	(revision 14)+++ src/client/main.cpp	(working copy)@@ -164,26 +164,56 @@ #include <ace/SOCK_Connector.h> #include <ace/SOCK_Stream.h> */+#include "Client.h"+#include "GUI.h" #include "ClientNetwork.h" #include "ClientSession.h" #include "GamePacket.h" #include "mycrc32.h" #include "BigNumber.h" +#ifndef _DEBUG+#define CLIENT_VERSION "Die Zwerge - Game Client V 0.0.001"+#else+#define CLIENT_VERSION "Die Zwerge - Game Client V 0.0.001-debug"+#endif+++ int main(int argc, char **argv) {+    sLog.outString("Platform: %s",PLATFORM_NAME);+    sLog.outString("Compiler: %s ("COMPILER_VERSION_OUT")",COMPILER_NAME,COMPILER_VERSION);+    sLog.outString("Compiled: %s  %s",__DATE__,__TIME__);+    sLog.outString("");+    sLog.outString("Client: "CLIENT_VERSION" starting up...");+    sLog.outString("");++    sClient.SetConfigFile("client.conf");++    if(sClient.Initialize())+    {+	sLog.outString("Init completed.");+    }+    else+    {+	sLog.outString("Init failed for some reason, exiting...");+	return 0;+    }+    sClient.HookSignals();++         network.SetCompression(9);     network.SetCompressionMinsize(70);     network.SetEncrypt(false);     network.SetStreamBuildInterval(50);-    if(!network.Connect("127.0.0.1", 9066))+    if(!network.Connect(sClient.GetConfig()->LoginserverAdress.c_str(), sClient.GetConfig()->LoginserverPort))     {         sLog.outError("Unable to connect!");         ACE_OS::sleep(1);         return 1;     }-    -    session.SetLoginData("test", "test");+   session.SetLoginData("test", "test");      GamePacket pkt(OPCODE_HELLO, 15);     pkt << "DZWC";@@ -196,7 +226,7 @@     sLog.outDebug("Sending NOW");     session.SendPacket(pkt); -    while(network.IsConnected())+    while(network.IsConnected() && sClient._clientState<CS_SHUTDOWN)     {         ACE_Based::Thread::Sleep(200);         session.Update();@@ -206,6 +236,10 @@     ACE_OS::sleep(1);      network.Shutdown();+    sLog.outDebug("Network Shutdown completed");++    sClient.UnhookSignals();+     return 0;      /*Index: src/client/GUI.cpp===================================================================--- src/client/GUI.cpp	(revision 0)+++ src/client/GUI.cpp	(revision 0)@@ -0,0 +1,228 @@+#include "GUI.h"++#include "common.h"+#include "Client.h"+#include "MCamera.h"+#include "MInput.h"+#include "ShTlTerrainSceneNode.h"+++GUIRunnable::GUIRunnable()+{+}++void GUIRunnable::run(void)+{+    sGUI.Run();+    DEBUG_LOG("GUI thread exiting");+}+++using namespace irr;+++GUI& GUI::Instance()+{+    return *ACE_Singleton<GUI,ACE_Thread_Mutex>::instance();+}++GUI::GUI()+{+    sLog.outDebug("GUI object created");+}++GUI::~GUI()+{+    _guithread->wait();+    delete _guithread;+    _guithread = NULL;+    _device->drop();+    _device=NULL;++    sLog.outDebug("GUI object destroyed");+}++bool GUI::Initialize()+{+    _device = createDevice(video::EDT_OPENGL, core::dimension2d<s32>(sClient.GetConfig()->GUIwidth, sClient.GetConfig()->GUIheight), sClient.GetConfig()->GUIbitdepth, false, false, false, 0);+    _driver = _device->getVideoDriver();+    _guienv = _device->getGUIEnvironment();+    _smgr = _device->getSceneManager();+    ACE_OS::sleep(2);++    ACE_Based::Runnable *r = new GUIRunnable();//Probably an evil hackish way to do it.+    _guithread = new ACE_Based::Thread(*r);+++return true;+}+++++uint32 GUI::Run()+{+   sLog.outDebug("Starting GUI Run");+   while(sClient._clientState<CS_SHUTDOWN)+    {+	if(!_driver->beginScene(true, true, video::SColor(255,100,101,140)))sClient._clientState=CS_SHUTDOWN;+            _smgr->drawAll();+	    _guienv->drawAll();+	_driver->endScene();+	core::stringw str = L"Irrlicht Engine [";+	str += _driver->getName();+	str += L"] FPS: ";+	str += (s32)_driver->getFPS();++	_device->setWindowCaption(str.c_str());+ +    }+}+/*+++    MyEventReceiver receiver;++    device->setEventReceiver(&receiver);++    ITimer* timer = device->getTimer();++    // set atributes of terrain+    s32 terrainWidth = 500;+    s32 terrainHeight = 500;+    s32 meshSize = 100;+    f32 tileSize = 1;+    core::vector3df terrainPos(0.0f, 0.0f, 0.0f);++    // setup camera+    MCameraFPS camera(smgr);+    camera.setNearValue(0.1f);+    camera.setFarValue(600);+    camera.setPosition(core::vector3df(terrainWidth*tileSize/2, 0, terrainHeight*tileSize/2) + terrainPos);++    // create terrain scene node+    ShTlTerrainSceneNode* terrain = new ShTlTerrainSceneNode(smgr, terrainWidth, terrainHeight, tileSize, meshSize);+    terrain->drop();++    terrain->setPosition(terrainPos);++    terrain->getMaterial(0).setTexture(1,driver->getTexture("cdata/dirt.bmp"));+    terrain->getMaterial(0).setFlag(video::EMF_LIGHTING, true);+    terrain->getMaterial(0).setFlag(video::EMF_FOG_ENABLE, true);++    // set terrain to render around camera+    terrain->follow(camera.getNode());++    // randomize terrain+    makeRandomHills(terrain, 2000, 20);+    makeRandomHills(terrain, 10000, 5);++    terrain->smoothNormals();++    randomizeColor(terrain);++    randomizeUV(terrain);++    gui::IGUIFont* font = guienv->getFont("cdata/cityblueprint.bmp");+    guienv->getSkin()->setFont(font);++    // movement speed per second+    f32 speed = 15.0f * tileSize;++    // time+    f32 time = 0;+    f32 oldtime;+    // time between frames+    f32 deltaT;++    IMouse& mouse = receiver.mouse;+    IKeys& key = receiver.key;++    bool debugmode = false;++    vector3df cpos = camera.getPosition();+    vector3df lpos = cpos;+    ISceneNode *node;+    ++    //smgr->addLightSceneNode(0, vector3df(40,-40,40),SColorf(1.0f,0.5f,0.5f), 100.0f);++    scene::ILightSceneNode* light = smgr->addLightSceneNode(0, core::vector3df(0,0,0), video::SColorf(1, 1, 1, 1), 1000.0f);+    video::SLight& ldata = light->getLightData();+    ldata.AmbientColor = video::SColorf(0.2f,0.2f,0.2f);+    ldata.DiffuseColor = video::SColorf(1.f,1.f,1.f);+    ldata.SpecularColor = video::SColorf(0.5f,0.5f,0.5f);+    ldata.Type = video::ELT_POINT;+    ldata.Position = lpos + vector3df(0,15,0);+    node = smgr->addCubeSceneNode(1);+    if (node->getMaterialCount())+    {+        node->getMaterial(0).setFlag(video::EMF_LIGHTING, true);+        node->getMaterial(0).setFlag(video::EMF_FOG_ENABLE, true);+        node->getMaterial(0).AmbientColor = SColor(255,255,255,255);+        node->getMaterial(0).EmissiveColor = SColor(255,0,0,100);+        node->getMaterial(0).SpecularColor = SColor(255,255,255,255);+        node->getMaterial(0).Shininess = 20;+    }+    node->setPosition(light->getLightData().Position);++    terrain->getMaterial(0);+    terrain->getMaterial(0).Shininess = 20;+    terrain->getMaterial(0).SpecularColor = SColor(100,100,100,100);++++    IGUIStaticText *text = guienv->addStaticText(L"Text",rect<s32>(0,0,500,50),true,true);+++    while(device->run())+    {+        driver->beginScene(true, true, video::SColor(255,100,101,140));++        // calculate time between frames+        oldtime = time;+        time = (f32)timer->getTime() / 1000.0f;+        deltaT = time - oldtime;++        // camera movement control+        if(key.pressed(KEY_KEY_W)) camera.moveForward(speed * deltaT);+        if(key.pressed(KEY_KEY_S)) camera.moveBack(speed * deltaT);+        if(key.pressed(KEY_KEY_D)) camera.moveRight(speed * deltaT);+        if(key.pressed(KEY_KEY_A)) camera.moveLeft(speed * deltaT);+        if(key.pressed_once(KEY_BACK))+        {+            debugmode = !debugmode;+            terrain->setDebugDataVisible(debugmode ? EDS_FULL : EDS_OFF);+        }++        cpos = camera.getPosition();++        // mouse directional control+        camera.turnRight(50 * (device->getCursorControl()->getRelativePosition().X - 0.5f));+        camera.turnUp(50 * (device->getCursorControl()->getRelativePosition().Y - 0.5f));+        device->getCursorControl()->setPosition(0.5f, 0.5f);++        // camera height control+        if (mouse.wheel < 10) mouse.wheel = 10;+        //camera.setHeight(  mouse.wheel/10 + terrain->getHeight(camera.getPosition())  );+        camera.setHeight(  5 + terrain->getHeight(camera.getPosition())  );++        char t[300];+        sprintf(t,"CAM: X=%.3f Y=%.3f Z=%.3f",cpos.X, cpos.Y, cpos.Z);+        stringw tw = t;+        text->setText(tw.c_str());++++        smgr->drawAll();+        guienv->drawAll();++        driver->endScene();++    }++    device->drop();+++    return 0;+*/\ No newline at end of fileIndex: src/client/ClientNetwork.cpp===================================================================--- src/client/ClientNetwork.cpp	(revision 14)+++ src/client/ClientNetwork.cpp	(working copy)@@ -283,7 +283,7 @@     DEBUG_LOG("Network workers initialized."); } -bool ClientNetwork::Connect(char *addr, uint32 port)+bool ClientNetwork::Connect(const char *addr, uint32 port) {     sLog.outDebug("Connecting...");     ACE_INET_Addr server_addr(port, addr);Index: src/client/Makefile.am===================================================================--- src/client/Makefile.am	(revision 14)+++ src/client/Makefile.am	(working copy)@@ -6,7 +6,9 @@ 		main.cpp\ 		ClientNetwork.cpp\ 		ClientSession.cpp\-		ShTlTerrainSceneNode.cpp+		ShTlTerrainSceneNode.cpp\+		Client.cpp\+		GUI.cpp  client_LDADD = $(top_builddir)/src/shared/libshared.a\ 	       $(top_builddir)/src/ace/libACE.la\Index: src/client/GUI.h===================================================================--- src/client/GUI.h	(revision 0)+++ src/client/GUI.h	(revision 0)@@ -0,0 +1,34 @@+#ifndef GUI_H+#define GUI_H++#include <irrlicht/irrlicht.h>+++#include "common.h"+using namespace irr;++class GUIRunnable : public ACE_Based::Runnable+{+public:+    GUIRunnable();+    void run(void);+};++class GUI+{+public:+    GUI();+    ~GUI();+    static GUI& Instance();+    uint32 Run();+    bool Initialize(void);+private:+IrrlichtDevice* _device;+video::IVideoDriver* _driver;+gui::IGUIEnvironment* _guienv;+scene::ISceneManager* _smgr;+ACE_Based::Thread *_guithread;+};+#define sGUI GUI::Instance()++#endif\ No newline at end of fileIndex: src/client/ClientNetwork.h===================================================================--- src/client/ClientNetwork.h	(revision 14)+++ src/client/ClientNetwork.h	(working copy)@@ -44,7 +44,7 @@     ~ClientNetwork();     static ClientNetwork& instance(void); -    bool Connect(char *addr, uint32 port);+    bool Connect(const char *addr, uint32 port);     void Send(GamePacket *packet); // Hint: Send NULL to shutdown outgoing network     void SetStreamBuildInterval(uint32 ms);     void SetCrypt(PktCrypt *crypt);Index: bin/misc/client.conf===================================================================--- bin/misc/client.conf	(revision 0)+++ bin/misc/client.conf	(revision 0)@@ -0,0 +1,10 @@+######################################+#   Client configuration settings    #+######################################++Server.Login.IP=127.0.0.1+Server.Login.Port=9066++GUI.width=800+GUI.height=600+GUI.bitdepth=16\ No newline at end of file