Browse Source

improved camera control by mouse

Kolja Strohm 3 years ago
parent
commit
38799a9959

+ 10 - 7
FactoryCraft/BasicBlocks.cpp

@@ -7,7 +7,7 @@
 #include "Globals.h"
 
 
-BasicBlock::BasicBlock( const BlockType* zType, ItemType* zTool, Framework::Vec3<int> pos, Framework::Textur* t )
+BasicBlock::BasicBlock( const BlockType* zType, const char* texture, ItemType* zTool, Framework::Vec3<int> pos, Framework::Textur* t )
     : Block( zType, zTool, pos, false )
 {
     Model3DData* data = 0;
@@ -16,9 +16,9 @@ BasicBlock::BasicBlock( const BlockType* zType, ItemType* zTool, Framework::Vec3
     else
     {
         data = new Model3DData();
-        data->setAmbientFactor( 0.2f );
-        data->setDiffusFactor( 0.4f );
-        data->setSpecularFactor( 0.4f );
+        data->setAmbientFactor( 0.8f );
+        data->setDiffusFactor( 0.1f );
+        data->setSpecularFactor( 0.1f );
         Framework::zM3DRegister()->addModel( dynamic_cast<Model3DData*>(data->getThis()), "cube" );
         float size = 1;
         float left, right, top, bottom;
@@ -160,7 +160,11 @@ BasicBlock::BasicBlock( const BlockType* zType, ItemType* zTool, Framework::Vec3
     setModelDaten( data );
     Bild* b = new Bild();
     b->neuBild( 10, 10, 0xFFFFFFFF );
-    Textur* tex = currentGame->zScreen()->zGraphicsApi()->createOrGetTextur( "dirt", b );
+    Textur* tex = currentGame->zScreen()->zGraphicsApi()->createOrGetTextur( texture, 0 );
+    if( !tex->zBild() )
+        tex->setBildZ( b );
+    else
+        b->release();
     Model3DTextur* textur = new Model3DTextur();
     textur->setPolygonTextur( 0, dynamic_cast<Textur*>(tex->getThis()) );
     textur->setPolygonTextur( 1, dynamic_cast<Textur*>(tex->getThis()) );
@@ -183,8 +187,7 @@ void DirtBlockType::loadSuperBlock( Block* zBlock, Framework::StreamReader* zRea
 
 Block* DirtBlockType::createBlock( Framework::Vec3<int> position )
 {
-    // TODO: load texture
-    Block* b = new BasicBlock( DirtBlockType::INSTANCE, 0, position, 0 ); // TODO: add efective tool
+    Block* b = new BasicBlock( DirtBlockType::INSTANCE, "blocks.ltdb/dirt", 0, position, 0 ); // TODO: add efective tool
     initializeSuperBlock( b );
     return b;
 }

+ 1 - 1
FactoryCraft/BasicBlocks.h

@@ -14,7 +14,7 @@ class DirtBlockItemType;
 class BasicBlock : public Block
 {
 public:
-    BasicBlock( const BlockType* zType, ItemType* zTool, Framework::Vec3<int> pos, Framework::Textur* t );
+    BasicBlock( const BlockType* zType, const char* texture, ItemType* zTool, Framework::Vec3<int> pos, Framework::Textur* t );
 
     friend DirtBlockType;
 };

+ 10 - 0
FactoryCraft/Dimension.cpp

@@ -26,11 +26,19 @@ void Dimension::updateVisibility()
     while( changed )
     {
         changed = false;
+        cs.lock();
         for( auto chunk : chunkList )
         {
             if( chunk )
+            {
+                chunk->getThis();
+                cs.unlock();
                 changed |= chunk->updateVisibility();
+                chunk->release();
+                cs.lock();
+            }
         }
+        cs.unlock();
     }
 }
 
@@ -83,6 +91,7 @@ void Dimension::setChunk( Chunk* chunk, Punkt center )
     char addr[ 8 ];
     getAddrOfWorld( center, addr );
     Chunk* old = chunks->z( addr, 8 );
+    cs.lock();
     if( old )
     {
         for( int i = 0; i < chunkList.getEintragAnzahl(); i++ )
@@ -95,6 +104,7 @@ void Dimension::setChunk( Chunk* chunk, Punkt center )
         }
     }
     chunks->set( addr, 8, chunk );
+    cs.unlock();
     if( chunk )
     {
         chunkList.add( chunk );

+ 2 - 0
FactoryCraft/Dimension.h

@@ -2,6 +2,7 @@
 
 #include <Array.h>
 #include <Trie.h>
+#include <Critical.h>
 
 #include "Chunk.h"
 #include "Entity.h"
@@ -13,6 +14,7 @@ private:
     Framework::Trie<Chunk>* chunks;
     Framework::Array<Chunk*> chunkList;
     Framework::RCArray<Entity>* entities;
+    Framework::Critical cs;
     void getAddrOf( Framework::Punkt cPos, char* addr ) const;
     void getAddrOfWorld( Framework::Punkt wPos, char* addr ) const;
 

+ 2 - 0
FactoryCraft/FactoryCraft.vcxproj

@@ -187,6 +187,7 @@ copy "..\..\..\..\..\Allgemein\Network\x64\Release\Network.dll" "network.dll"</C
     <ClCompile Include="ItemSlot.cpp" />
     <ClCompile Include="ItemStack.cpp" />
     <ClCompile Include="ItemType.cpp" />
+    <ClCompile Include="Load.cpp" />
     <ClCompile Include="Login.cpp" />
     <ClCompile Include="Main.cpp" />
     <ClCompile Include="Menu.cpp" />
@@ -218,6 +219,7 @@ copy "..\..\..\..\..\Allgemein\Network\x64\Release\Network.dll" "network.dll"</C
     <ClInclude Include="ItemSlot.h" />
     <ClInclude Include="ItemStack.h" />
     <ClInclude Include="ItemType.h" />
+    <ClInclude Include="Load.h" />
     <ClInclude Include="Login.h" />
     <ClInclude Include="Menu.h" />
     <ClInclude Include="NetworkHandler.h" />

+ 53 - 41
FactoryCraft/FactoryCraft.vcxproj.filters

@@ -1,10 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
-    <Filter Include="Quelldateien">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
     <Filter Include="Headerdateien">
       <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
       <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
@@ -31,28 +27,20 @@
     <Filter Include="world\view">
       <UniqueIdentifier>{494659c8-0209-497f-9200-86215d7680bf}</UniqueIdentifier>
     </Filter>
+    <Filter Include="Menu">
+      <UniqueIdentifier>{541476ec-c3b5-404d-9e66-436d3159dcc4}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Network">
+      <UniqueIdentifier>{52eeabff-f704-4376-8981-d14ed202c951}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Start">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Main.cpp">
-      <Filter>Quelldateien</Filter>
-    </ClCompile>
-    <ClCompile Include="Menu.cpp">
-      <Filter>Quelldateien</Filter>
-    </ClCompile>
-    <ClCompile Include="Login.cpp">
-      <Filter>Quelldateien</Filter>
-    </ClCompile>
-    <ClCompile Include="NetworkHandler.cpp">
-      <Filter>Quelldateien</Filter>
-    </ClCompile>
-    <ClCompile Include="FactoryClient.cpp">
-      <Filter>Quelldateien</Filter>
-    </ClCompile>
-    <ClCompile Include="DirectConnect.cpp">
-      <Filter>Quelldateien</Filter>
-    </ClCompile>
-    <ClCompile Include="Game.cpp">
-      <Filter>Quelldateien</Filter>
+      <Filter>Start</Filter>
     </ClCompile>
     <ClCompile Include="World.cpp">
       <Filter>world</Filter>
@@ -111,26 +99,29 @@
     <ClCompile Include="NoBlock.cpp">
       <Filter>world\blocks</Filter>
     </ClCompile>
+    <ClCompile Include="Game.cpp">
+      <Filter>Menu</Filter>
+    </ClCompile>
+    <ClCompile Include="Login.cpp">
+      <Filter>Menu</Filter>
+    </ClCompile>
+    <ClCompile Include="DirectConnect.cpp">
+      <Filter>Menu</Filter>
+    </ClCompile>
+    <ClCompile Include="Menu.cpp">
+      <Filter>Menu</Filter>
+    </ClCompile>
+    <ClCompile Include="FactoryClient.cpp">
+      <Filter>Network</Filter>
+    </ClCompile>
+    <ClCompile Include="NetworkHandler.cpp">
+      <Filter>Network</Filter>
+    </ClCompile>
+    <ClCompile Include="Load.cpp">
+      <Filter>Menu</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="Menu.h">
-      <Filter>Headerdateien</Filter>
-    </ClInclude>
-    <ClInclude Include="Login.h">
-      <Filter>Headerdateien</Filter>
-    </ClInclude>
-    <ClInclude Include="NetworkHandler.h">
-      <Filter>Headerdateien</Filter>
-    </ClInclude>
-    <ClInclude Include="FactoryClient.h">
-      <Filter>Headerdateien</Filter>
-    </ClInclude>
-    <ClInclude Include="DirectConnect.h">
-      <Filter>Headerdateien</Filter>
-    </ClInclude>
-    <ClInclude Include="Game.h">
-      <Filter>Headerdateien</Filter>
-    </ClInclude>
     <ClInclude Include="Entity.h">
       <Filter>Headerdateien</Filter>
     </ClInclude>
@@ -200,5 +191,26 @@
     <ClInclude Include="NoBlock.h">
       <Filter>world\blocks</Filter>
     </ClInclude>
+    <ClInclude Include="Load.h">
+      <Filter>Menu</Filter>
+    </ClInclude>
+    <ClInclude Include="Login.h">
+      <Filter>Menu</Filter>
+    </ClInclude>
+    <ClInclude Include="Menu.h">
+      <Filter>Menu</Filter>
+    </ClInclude>
+    <ClInclude Include="Game.h">
+      <Filter>Menu</Filter>
+    </ClInclude>
+    <ClInclude Include="DirectConnect.h">
+      <Filter>Menu</Filter>
+    </ClInclude>
+    <ClInclude Include="NetworkHandler.h">
+      <Filter>Network</Filter>
+    </ClInclude>
+    <ClInclude Include="FactoryClient.h">
+      <Filter>Network</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>

+ 1 - 5
FactoryCraft/Game.cpp

@@ -33,7 +33,7 @@ Game::Game( Bildschirm* zScreen )
     elements.add( debug );
 }
 
-void Game::updatePositionAndFace( Vec3<float> position, Vec2<float> face )
+void Game::updatePosition( Vec3<float> position )
 {
     Text txt = "Position: (";
     txt.setPrecision( 2 );
@@ -42,10 +42,6 @@ void Game::updatePositionAndFace( Vec3<float> position, Vec2<float> face )
     txt += position.y;
     txt += ", ";
     txt += position.z;
-    txt += ") Face: (";
-    txt += face.x;
-    txt += ", ";
-    txt += face.y;
     txt += ")";
     debug->setText( txt );
 }

+ 1 - 1
FactoryCraft/Game.h

@@ -14,5 +14,5 @@ public:
     // Konstruktor
     Game( Bildschirm* zScreen );
 
-    void updatePositionAndFace( Vec3<float> position, Vec2<float> face );
+    void updatePosition( Vec3<float> position );
 };

+ 4 - 1
FactoryCraft/Globals.cpp

@@ -4,6 +4,7 @@
 #include "Login.h"
 #include "DirectConnect.h"
 #include "Game.h"
+#include "Load.h"
 
 
 void initVariables()
@@ -17,15 +18,17 @@ void initVariables()
     } );
     network = new NetworkHandler();
     currentGame = 0;
+    window = 0;
 }
 
 void initMenus()
 {
+    menuRegister->put( "load", RCPointer<Menu>::of( new LoadMenu( uiFactory.initParam.bildschirm ) ) );
     menuRegister->put( "login", RCPointer<Menu>::of( new LoginMenu( uiFactory.initParam.bildschirm ) ) );
     menuRegister->put( "directConnect", RCPointer<Menu>::of( new DirectConnect( uiFactory.initParam.bildschirm ) ) );
     menuRegister->put( "game", RCPointer<Menu>::of( new Game( uiFactory.initParam.bildschirm ) ) );
 
-    menuRegister->get( "login" )->show();
+    menuRegister->get( "load" )->show();
 }
 
 void releaseVariables()

+ 2 - 0
FactoryCraft/Globals.h

@@ -6,6 +6,7 @@
 #include <Schrift.h>
 #include <DLLRegister.h>
 #include <Bildschirm.h>
+#include <Fenster.h>
 
 #include "Menu.h"
 #include "NetworkHandler.h"
@@ -21,6 +22,7 @@ variable Framework::HashMap<Framework::Text, Framework::RCPointer<Schrift>>* fon
 variable NetworkHandler* network;
 variable DLLRegister* dlls;
 variable World* currentGame;
+variable Framework::WFenster* window;
 
 
 void initVariables();

+ 9 - 9
FactoryCraft/Initialisierung.cpp

@@ -112,15 +112,6 @@ LDiag* initLinienDiagramm( int x, int y, int br, int h
     return ret;
 }
 
-FBalken* initFBalken( int x, int y, int br, int hö, __int64 style )
-{
-    FBalken* ret = uiFactory.createFBalken( uiFactory.initParam );
-    ret->addStyle( style );
-    ret->setPosition( x, y );
-    ret->setSize( br, hö );
-    return ret;
-}
-
 AuswahlListe* initAuswahlListe( int x, int y, int br, int hö, __int64 style, std::initializer_list< char* > values )
 {
     AuswahlListe* ret = uiFactory.createAuswahlListe( uiFactory.initParam );
@@ -152,4 +143,13 @@ void initToolTip( Zeichnung* obj, const char* txt )
 {
     obj->setToolTipText( txt, uiFactory.initParam.bildschirm, uiFactory.initParam.schrift );
     obj->zToolTip()->addStyle( TextFeld::Style::Mehrzeilig );
+}
+
+FBalken* initFBalken( int x, int y, int br, int hö, __int64 style )
+{
+    FBalken* ret = uiFactory.createFBalken( uiFactory.initParam );
+    ret->addStyle( style );
+    ret->setPosition( x, y );
+    ret->setSize( br, hö );
+    return ret;
 }

+ 2 - 0
FactoryCraft/Initialisierung.h

@@ -6,6 +6,7 @@
 #include <AuswahlBox.h>
 #include <Tabelle.h>
 #include <Diagramm.h>
+#include <Fortschritt.h>
 #include <initializer_list>
 
 using namespace Framework;
@@ -24,5 +25,6 @@ TextFeld* initTextFeld( int x, int y, int br, int h
 AuswahlBox* initAuswahlBox( int x, int y, int br, int hö, __int64 style, std::initializer_list< char* > values );
 ObjTabelle* initObjTabelle( int x, int y, int br, int hö, __int64 style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHöhe );
 LDiag* initLinienDiagramm( int x, int y, int br, int hö, __int64 style, DiagDaten* data );
+FBalken* initFBalken( int x, int y, int br, int hö, __int64 style );
 
 #endif

+ 63 - 0
FactoryCraft/Load.cpp

@@ -0,0 +1,63 @@
+#include "Load.h"
+#include "Initialisierung.h"
+#include <AsynchronCall.h>
+#include <Datei.h>
+#include <Array.h>
+#include <DateiSystem.h>
+#include <Text.h>
+#include "Globals.h"
+#include <Textur.h>
+
+
+LoadMenu::LoadMenu( Bildschirm* zScreen )
+    : Menu( zScreen )
+{
+    step = initFBalken( 10, 90, 200, 30, FBalken::Style::normal );
+    stage = initFBalken( 10, 50, 200, 30, FBalken::Style::normal );
+    all = initFBalken( 10, 10, 200, 30, FBalken::Style::normal );
+    elements.add( step );
+    elements.add( stage );
+    elements.add( all );
+
+    new AsynchronCall( [this, zScreen]() {
+        Sleep( 1000 );
+        all->setAktionAnzahl( 1 );
+        all->reset();
+        // loading textures
+        Datei texturF;
+        texturF.setDatei( "data/textures" );
+        RCArray<Text>* files = texturF.getDateiListe();
+        if( files )
+        {
+            int count = 0;
+            for( Text* fileName : *files )
+            {
+                LTDBDatei dat;
+                dat.setDatei( new Text( Text( "data/textures/" ) + *fileName ) );
+                dat.leseDaten( 0 );
+                count += dat.getBildAnzahl();
+            }
+            stage->setAktionAnzahl( count );
+            stage->reset();
+            for( Text* fileName : *files )
+            {
+                LTDBDatei dat;
+                dat.setDatei( new Text( Text( "data/textures/" ) + *fileName ) );
+                dat.leseDaten( 0 );
+                for( Text* name : *dat.zBildListe() )
+                {
+                    step->reset();
+                    Bild* b = dat.laden( step, new Text( *name ) );
+                    zScreen->zGraphicsApi()->createOrGetTextur( *fileName + "/" + *name, b )->release();
+                    stage->aktionPlus();
+                }
+            }
+            files->release();
+        }
+        all->aktionPlus();
+        zScreen->lock();
+        hide();
+        menuRegister->get( "login" )->show();
+        zScreen->unlock();
+    } );
+}

+ 16 - 0
FactoryCraft/Load.h

@@ -0,0 +1,16 @@
+#pragma once
+
+#include <Fortschritt.h>
+#include "Menu.h"
+#undef LoadMenu
+
+class LoadMenu : public Menu
+{
+private:
+    FBalken* step;
+    FBalken* stage;
+    FBalken* all;
+
+public:
+    LoadMenu( Bildschirm* zScreen );
+};

+ 2 - 1
FactoryCraft/Main.cpp

@@ -32,10 +32,11 @@ int KSGStart Framework::Start( Framework::Startparam p )
     list->release();
 
     WFenster window;
+    ::window = &window;
     WNDCLASS wc = Framework::F_Normal( p.hinst );
     wc.lpszClassName = "Factory Craft";
     window.erstellen( WS_POPUPWINDOW, wc );
-    Monitor m = Framework::getMonitor( 0 );
+    Monitor m = Framework::getMonitor( 2 );
     window.setBounds( Punkt( m.x, m.y ), Punkt( m.breite, m.height ) );
     window.setAnzeigeModus( SW_SHOWNORMAL );
     window.setVSchließAktion( [&window]( void* p, void* f ) {

+ 44 - 4
FactoryCraft/PlayerKam.cpp

@@ -4,18 +4,19 @@
 PlayerKam::PlayerKam( Framework::Bildschirm3D* zScreen )
     : Kam3D()
 {
+    kameraControll = 0;
     setBildschirmPosition( 0, 0 );
     setBildschirmSize( zScreen->getBackBufferSize() );
     setStyle( Kam3D::Style::Tick | Kam3D::Style::Movable | Kam3D::Style::Rotatable );
-    setRotation( { 0, 0, 0 } );
+    setRotation( { (float)PI / 2.f, 0, 0 } );
 }
 
-void PlayerKam::setDirection( Framework::Vec2<float> direction )
+void PlayerKam::setDirection( Framework::Vec3<float> direction )
 {
     if( direction.getLengthSq() > 0 )
     {
         float rotZ = std::atan2( direction.y, direction.x ) + (float)PI / 2;
-        setRotation( { (float)PI / 2.f, getRotation().y, rotZ } );
+        setRotation( { getRotation().x, getRotation().y, rotZ } );
     }
 }
 
@@ -109,12 +110,51 @@ void PlayerKam::doTastaturEreignis( Framework::TastaturEreignis& te )
             action[ 1 ] = 7;
             network->zFactoryClient()->sendPlayerAction( action, 2 );
         }
+        if( te.taste == T_Esc )
+        {
+            kameraControll = 0;
+            ShowCursor( true );
+        }
     }
 }
 
 void PlayerKam::doMausEreignis( Framework::MausEreignis& me )
 {
-
+    if( me.verarbeitet )
+    {
+        kameraControll = 0;
+        ShowCursor( true );
+    }
+    else
+    {
+        if( !kameraControll )
+        {
+            if( me.id == ME_PLinks )
+            {
+                lastMousePos = { me.originalX, me.originalY };
+                kameraControll = 1;
+            }
+        }
+        else
+        {
+            if( me.id == ME_Bewegung && kameraControll )
+            {
+                int yDir = lastMousePos.y - me.originalY;
+                int xDir = lastMousePos.x - me.originalX;
+                setRotation( { min( max( getRotation().x - yDir * 0.005f, 0.1f ), 2.5f ), getRotation().y, getRotation().z - xDir * 0.005f } );
+                Vec3<float> direction = getWorldDirection( getScreenPos() + getScreenSize() / 2 );
+                char action[ 13 ];
+                action[ 0 ] = 2;
+                *(float*)(action + 1) = direction.x;
+                *(float*)(action + 5) = direction.y;
+                *(float*)(action + 9) = direction.z;
+                network->zFactoryClient()->sendPlayerAction( action, 13 );
+                SetCursorPos( lastMousePos.x + window->getPosition().x, lastMousePos.y + window->getPosition().y );
+                ShowCursor( false );
+            }
+        }
+        me.verarbeitet = 1;
+    }
 }
 
 bool PlayerKam::tick( double time )

+ 5 - 1
FactoryCraft/PlayerKam.h

@@ -5,9 +5,13 @@
 
 class PlayerKam : public Framework::Kam3D
 {
+private:
+    bool kameraControll;
+    Framework::Punkt lastMousePos;
+
 public:
     PlayerKam( Framework::Bildschirm3D* zScreen );
-    void setDirection( Framework::Vec2<float> direction );
+    void setDirection( Framework::Vec3<float> direction );
     void doTastaturEreignis( Framework::TastaturEreignis& te ) override;
     void doMausEreignis( Framework::MausEreignis& me ) override;
     bool tick( double time ) override;

+ 12 - 6
FactoryCraft/World.cpp

@@ -26,6 +26,7 @@ World::World( Bildschirm3D* zScreen )
     kam = new PlayerKam( zScreen );
     kam->setWelt( renderedWorld );
     zScreen->addKamera( kam );
+    firstMessage = 1;
     start();
 }
 
@@ -56,17 +57,22 @@ void World::update( bool background )
         if( type == 4 ) // POSITION UPDATE
         {
             Vec3<float> pos;
-            Vec2<float> dir;
+            Vec3<float> dir;
             serverMessageReader->lese( (char*)&pos.x, 4 );
             serverMessageReader->lese( (char*)&pos.y, 4 );
             serverMessageReader->lese( (char*)&pos.z, 4 );
             kam->setPosition( pos + Vec3<float>( 0.f, 0.f, 2.f ) );
-            serverMessageReader->lese( (char*)&dir.x, 4 );
-            serverMessageReader->lese( (char*)&dir.y, 4 );
-            ((Game*)(Menu*)menuRegister->get( "game" ))->updatePositionAndFace( pos, dir );
-            kam->setDirection( { dir.x, dir.y } );
+            if( firstMessage )
+            {
+                firstMessage = 0;
+                serverMessageReader->lese( (char*)&dir.x, 4 );
+                serverMessageReader->lese( (char*)&dir.y, 4 );
+                serverMessageReader->lese( (char*)&dir.z, 4 );
+                kam->setDirection( dir );
+            }
+            ((Game*)(Menu*)menuRegister->get( "game" ))->updatePosition( pos );
             for( Dimension* dim : *dimensions )
-                dim->removeDistantChunks( { (int)dir.x, (int)dir.y } );
+                dim->removeDistantChunks( { (int)pos.x, (int)pos.y } );
         }
         network->zFactoryClient()->endMessageReading( background );
     }

+ 1 - 0
FactoryCraft/World.h

@@ -17,6 +17,7 @@ private:
     Framework::Welt3D* renderedWorld;
     Framework::Bildschirm3D* zScreenPtr;
     PlayerKam* kam;
+    bool firstMessage;
 
 public:
     World( Framework::Bildschirm3D* zScreen );