Exemple #1
0
        /// <summary> Sets fields / updates network handles based on the server 
        /// indicating it supports the given CPE extension. </summary>
        public void HandleEntry( string ext, int version, NetworkProcessor network )
        {
            ServerExtensionsCount--;

            if( ext == "HeldBlock" ) {
                sendHeldBlock = true;
            } else if( ext == "MessageTypes" ) {
                useMessageTypes = true;
            } else if( ext == "ExtPlayerList" ) {
                network.UsingExtPlayerList = true;
            } else if( ext == "PlayerClick" ) {
                network.UsingPlayerClick = true;
            } else if( ext == "EnvMapAppearance" ) {
                envMapVer = version;
                if( version == 1 ) return;
                network.Set( Opcode.CpeEnvSetMapApperance,
                            network.HandleEnvSetMapAppearance2, 73 );
            } else if( ext == "LongerMessages" ) {
                network.ServerSupportsPartialMessages = true;
            } else if( ext == "FullCP437" ) {
                network.ServerSupportsFullCP437 = true;
            } else if( ext == "BlockDefinitionsExt" ) {
                blockDefsExtVer = version;
                if( version == 1 ) return;
                network.Set( Opcode.CpeDefineBlockExt,
                            network.HandleDefineBlockExt, 88 );
            }
        }
        /// <summary> Sets fields / updates network handles based on the server
        /// indicating it supports the given CPE extension. </summary>
        public void HandleEntry(string ext, int version, NetworkProcessor net)
        {
            ServerExtensionsCount--;

            if (ext == "HeldBlock")
            {
                sendHeldBlock = true;
            }
            else if (ext == "MessageTypes")
            {
                useMessageTypes = true;
            }
            else if (ext == "ExtPlayerList")
            {
                net.UsingExtPlayerList = true;
            }
            else if (ext == "PlayerClick")
            {
                net.UsingPlayerClick = true;
            }
            else if (ext == "EnvMapAppearance")
            {
                envMapVer = version;
                if (version == 1)
                {
                    return;
                }
                net.packetSizes[Opcode.CpeEnvSetMapApperance] += 4;
            }
            else if (ext == "LongerMessages")
            {
                net.SupportsPartialMessages = true;
            }
            else if (ext == "FullCP437")
            {
                net.SupportsFullCP437 = true;
            }
            else if (ext == "BlockDefinitionsExt")
            {
                blockDefsExtVer = version;
                if (version == 1)
                {
                    return;
                }
                net.packetSizes[Opcode.CpeDefineBlockExt] += 3;
            }
            else if (ext == "ExtEntityPositions")
            {
                extEntityPos = true;
                net.packetSizes[Opcode.EntityTeleport]   += 6;
                net.packetSizes[Opcode.AddEntity]        += 6;
                net.packetSizes[Opcode.CpeExtAddEntity2] += 6;

                net.reader.ExtendedPositions = true;
                net.writer.ExtendedPositions = true;
            }
        }
Exemple #3
0
        public void Reset(Game game)
        {
            ServerExtensionsCount = 0;
            sendHeldBlock         = false; useMessageTypes = false;
            envMapVer             = 2; blockDefsExtVer = 2;
            needD3Fix             = false; game.UseCPEBlocks = false;

            NetworkProcessor net = (NetworkProcessor)game.Server;

            net.Reset();
        }
Exemple #4
0
        public void Reset(Game game)
        {
            ServerExtensionsCount  = 0;
            sendHeldBlock          = false; useMessageTypes = false;
            envMapVer              = 2; blockDefsExtVer = 2;
            needD3Fix              = false; extEntityPos = false; twoWayPing = false; fastMap = false;
            game.SupportsCPEBlocks = false;
            NetworkProcessor net = (NetworkProcessor)game.Server;

            net.Reset();
        }
Exemple #5
0
        /// <summary> Sets fields / updates network handles based on the server
        /// indicating it supports the given CPE extension. </summary>
        public void HandleEntry(string ext, int version, NetworkProcessor network)
        {
            ServerExtensionsCount--;

            if (ext == "HeldBlock")
            {
                sendHeldBlock = true;
            }
            else if (ext == "MessageTypes")
            {
                useMessageTypes = true;
            }
            else if (ext == "ExtPlayerList")
            {
                network.UsingExtPlayerList = true;
            }
            else if (ext == "PlayerClick")
            {
                network.UsingPlayerClick = true;
            }
            else if (ext == "EnvMapAppearance")
            {
                envMapVer = version;
                if (version == 1)
                {
                    return;
                }
                network.Set(Opcode.CpeEnvSetMapApperance,
                            network.HandleEnvSetMapAppearance2, 73);
            }
            else if (ext == "LongerMessages")
            {
                network.ServerSupportsPartialMessages = true;
            }
            else if (ext == "FullCP437")
            {
                network.ServerSupportsFullCP437 = true;
            }
            else if (ext == "BlockDefinitionsExt")
            {
                blockDefsExtVer = version;
                if (version == 1)
                {
                    return;
                }
                network.Set(Opcode.CpeDefineBlockExt,
                            network.HandleDefineBlockExt, 88);
            }
        }
Exemple #6
0
        public void Reset(Game game)
        {
            ServerExtensionsCount = 0;
            sendHeldBlock         = false; useMessageTypes = false;
            envMapVer             = 2; blockDefsExtVer = 2;
            needD3Fix             = false; game.UseCPEBlocks = false;

            NetworkProcessor network = (NetworkProcessor)game.Network;

            network.UsingExtPlayerList            = false;
            network.UsingPlayerClick              = false;
            network.ServerSupportsPartialMessages = false;
            network.ServerSupportsFullCP437       = false;

            network.Set(Opcode.CpeEnvSetMapApperance,
                        network.HandleEnvSetMapAppearance, 69);
            network.Set(Opcode.CpeDefineBlockExt,
                        network.HandleDefineBlockExt, 85);
        }
Exemple #7
0
        public void HandleEntry(string ext, int version, NetworkProcessor net)
        {
            ServerExtensionsCount--;

            if (Utils.CaselessEq(ext, "HeldBlock"))
            {
                sendHeldBlock = true;
            }
            else if (Utils.CaselessEq(ext, "MessageTypes"))
            {
                useMessageTypes = true;
            }
            else if (Utils.CaselessEq(ext, "ExtPlayerList"))
            {
                net.UsingExtPlayerList = true;
            }
            else if (Utils.CaselessEq(ext, "BlockPermissions"))
            {
                blockPerms = true;
            }
            else if (Utils.CaselessEq(ext, "PlayerClick"))
            {
                net.UsingPlayerClick = true;
            }
            else if (Utils.CaselessEq(ext, "EnvMapAppearance"))
            {
                envMapVer = version;
                if (version == 1)
                {
                    return;
                }
                net.packetSizes[Opcode.CpeEnvSetMapApperance] += 4;
            }
            else if (Utils.CaselessEq(ext, "LongerMessages"))
            {
                net.SupportsPartialMessages = true;
            }
            else if (Utils.CaselessEq(ext, "FullCP437"))
            {
                net.SupportsFullCP437 = true;
            }
            else if (Utils.CaselessEq(ext, "BlockDefinitionsExt"))
            {
                blockDefsExtVer = version;
                if (version == 1)
                {
                    return;
                }
                net.packetSizes[Opcode.CpeDefineBlockExt] += 3;
            }
            else if (Utils.CaselessEq(ext, "ExtEntityPositions"))
            {
                extEntityPos = true;
                net.packetSizes[Opcode.EntityTeleport]   += 6;
                net.packetSizes[Opcode.AddEntity]        += 6;
                net.packetSizes[Opcode.CpeExtAddEntity2] += 6;

                net.reader.ExtendedPositions = true;
                net.writer.ExtendedPositions = true;
            }
            else if (Utils.CaselessEq(ext, "TwoWayPing"))
            {
                twoWayPing = true;
            }
            else if (Utils.CaselessEq(ext, "FastMap"))
            {
                net.packetSizes[Opcode.LevelInit] += 4;
                fastMap = true;
            }
            else if (Utils.CaselessEq(ext, "ExtendedTextures"))
            {
                net.packetSizes[Opcode.CpeDefineBlock]    += 3;
                net.packetSizes[Opcode.CpeDefineBlockExt] += 6;
                extTexs = true;
            }
                        #if !ONLY_8BIT
            else if (Utils.CaselessEq(ext, "ExtendedBlocks"))
            {
                if (!game.AllowCustomBlocks)
                {
                    return;
                }
                net.packetSizes[Opcode.SetBlock]              += 1;
                net.packetSizes[Opcode.CpeHoldThis]           += 1;
                net.packetSizes[Opcode.CpeDefineBlock]        += 1;
                net.packetSizes[Opcode.CpeSetBlockPermission] += 1;
                net.packetSizes[Opcode.CpeUndefineBlock]      += 1;
                net.packetSizes[Opcode.CpeDefineBlockExt]     += 1;
                net.packetSizes[Opcode.CpeSetInventoryOrder]  += 2;
                net.packetSizes[Opcode.CpeBulkBlockUpdate]    += 256 / 4;

                net.reader.ExtendedBlocks = true;
                net.writer.ExtendedBlocks = true;
                if (BlockInfo.Count < 768)
                {
                    BlockInfo.Allocate(768);
                    BlockInfo.Reset();
                    game.Inventory.Map = new BlockID[768];
                    game.Inventory.SetDefaultMapping();
                }
            }
                        #endif
        }
        /// <summary> Sets fields / updates network handles based on the server
        /// indicating it supports the given CPE extension. </summary>
        public void HandleEntry(string ext, int version, NetworkProcessor net)
        {
            ServerExtensionsCount--;

            if (ext == "HeldBlock")
            {
                sendHeldBlock = true;
            }
            else if (ext == "MessageTypes")
            {
                useMessageTypes = true;
            }
            else if (ext == "ExtPlayerList")
            {
                net.UsingExtPlayerList = true;
            }
            else if (ext == "BlockPermissions")
            {
                blockPerms = true;
            }
            else if (ext == "PlayerClick")
            {
                net.UsingPlayerClick = true;
            }
            else if (ext == "EnvMapAppearance")
            {
                envMapVer = version;
                if (version == 1)
                {
                    return;
                }
                net.packetSizes[Opcode.CpeEnvSetMapApperance] += 4;
            }
            else if (ext == "LongerMessages")
            {
                net.SupportsPartialMessages = true;
            }
            else if (ext == "FullCP437")
            {
                net.SupportsFullCP437 = true;
            }
            else if (ext == "BlockDefinitionsExt")
            {
                blockDefsExtVer = version;
                if (version == 1)
                {
                    return;
                }
                net.packetSizes[Opcode.CpeDefineBlockExt] += 3;
            }
            else if (ext == "ExtEntityPositions")
            {
                extEntityPos = true;
                net.packetSizes[Opcode.EntityTeleport]   += 6;
                net.packetSizes[Opcode.AddEntity]        += 6;
                net.packetSizes[Opcode.CpeExtAddEntity2] += 6;

                net.reader.ExtendedPositions = true;
                net.writer.ExtendedPositions = true;
            }
            else if (ext == "TwoWayPing")
            {
                twoWayPing = true;
            }
                        #if USE16_BIT
            else if (ext == "ExtBlocks")
            {
                net.packetSizes[Opcode.SetBlock]              += 1;
                net.packetSizes[Opcode.CpeHoldThis]           += 1;
                net.packetSizes[Opcode.CpeDefineBlock]        += 1;
                net.packetSizes[Opcode.CpeSetBlockPermission] += 1;
                net.packetSizes[Opcode.CpeUndefineBlock]      += 1;
                net.packetSizes[Opcode.CpeDefineBlockExt]     += 1;
                net.packetSizes[Opcode.CpeSetInventoryOrder]  += 2;
                // TODO: do this one more efficiently
                net.packetSizes[Opcode.CpeBulkBlockUpdate] += 256;

                net.reader.ExtendedBlocks = true;
                net.writer.ExtendedBlocks = true;
                if (BlockInfo.Count < 768)
                {
                    BlockInfo.Allocate(768);
                    BlockInfo.Reset();
                }
            }
                        #endif
        }
Exemple #9
0
        internal void OnLoad()
        {
                        #if ANDROID
            Graphics = new OpenGLESApi();
                        #elif !USE_DX
            Graphics = new OpenGLApi(window);
                        #else
            Graphics = new Direct3D9Api(window);
                        #endif
            Graphics.MakeApiInfo();
            ErrorHandler.ExtraInfo = Graphics.ApiInfo;

                        #if ANDROID
            Drawer2D = new CanvasDrawer2D(Graphics);
                        #else
            Drawer2D = new GdiPlusDrawer2D(Graphics);
                        #endif
            UpdateClientSize();

            Entities = new EntityList(this);
            TextureCache.Init();

                        #if SURVIVAL_TEST
            if (Options.GetBool(OptionsKey.SurvivalMode, false))
            {
                Mode = new SurvivalGameMode();
            }
            else
            {
                Mode = new CreativeGameMode();
            }
                        #endif

            Input           = new InputHandler(this);
            ParticleManager = new ParticleManager(); Components.Add(ParticleManager);
            TabList         = new TabList(); Components.Add(TabList);
            LoadOptions();
            LoadGuiOptions();
            Chat = new Chat(); Components.Add(Chat);

            Events.OnNewMap        += OnNewMapCore;
            Events.OnNewMapLoaded  += OnNewMapLoadedCore;
            Events.TextureChanged  += TextureChangedCore;
            Events.LowVRAMDetected += OnLowVRAMDetected;

            BlockInfo.Allocate(256);
            BlockInfo.Init();

            ModelCache = new ModelCache(this);
            ModelCache.InitCache();
            Downloader = new AsyncDownloader(Drawer2D); Components.Add(Downloader);
            Lighting   = new BasicLighting(); Components.Add(Lighting);

            Drawer2D.UseBitmappedChat = ClassicMode || !Options.GetBool(OptionsKey.UseChatFont, false);
            Drawer2D.BlackTextShadows = Options.GetBool(OptionsKey.BlackText, false);
            Graphics.Mipmaps          = Options.GetBool(OptionsKey.Mipmaps, false);

            Atlas1D.game  = this;
            Atlas2D.game  = this;
            Animations    = new Animations(); Components.Add(Animations);
            Inventory     = new Inventory(); Components.Add(Inventory);
            Inventory.Map = new BlockID[BlockInfo.Count];

            BlockInfo.SetDefaultPerms();
            World       = new World(this);
            LocalPlayer = new LocalPlayer(this); Components.Add(LocalPlayer);
            Entities.List[EntityList.SelfID] = LocalPlayer;

            MapRenderer        = new MapRenderer(this);
            ChunkUpdater       = new ChunkUpdater(this);
            EnvRenderer        = new EnvRenderer(); Components.Add(EnvRenderer);
            MapBordersRenderer = new MapBordersRenderer(); Components.Add(MapBordersRenderer);

            string renType = Options.Get(OptionsKey.RenderType, "normal");
            int    flags   = CalcRenderType(renType);
            if (flags == -1)
            {
                flags = 0;
            }

            MapBordersRenderer.legacy = (flags & 1) != 0;
            EnvRenderer.legacy        = (flags & 1) != 0;
            EnvRenderer.minimal       = (flags & 2) != 0;

            if (IPAddress == null)
            {
                Server = new Singleplayer.SinglePlayerServer(this);
            }
            else
            {
                Server = new Network.NetworkProcessor(this);
            }
            Components.Add(Server);
            Graphics.LostContextFunction = Server.Tick;

            Cameras.Add(new FirstPersonCamera(this));
            Cameras.Add(new ThirdPersonCamera(this, false));
            Cameras.Add(new ThirdPersonCamera(this, true));
            Camera = Cameras[0];
            UpdateProjection();

            Gui               = new GuiInterface(this); Components.Add(Gui);
            CommandList       = new CommandList(); Components.Add(CommandList);
            SelectionManager  = new SelectionManager(); Components.Add(SelectionManager);
            WeatherRenderer   = new WeatherRenderer(); Components.Add(WeatherRenderer);
            HeldBlockRenderer = new HeldBlockRenderer(); Components.Add(HeldBlockRenderer);

            Graphics.DepthTest = true;
            Graphics.DepthTestFunc(CompareFunc.LessEqual);
            //Graphics.DepthWrite = true;
            Graphics.AlphaBlendFunc(BlendFunc.SourceAlpha, BlendFunc.InvSourceAlpha);
            Graphics.AlphaTestFunc(CompareFunc.Greater, 0.5f);
            Culling           = new FrustumCulling();
            Picking           = new PickedPosRenderer(); Components.Add(Picking);
            AudioPlayer       = new AudioPlayer(); Components.Add(AudioPlayer);
            AxisLinesRenderer = new AxisLinesRenderer(); Components.Add(AxisLinesRenderer);
            SkyboxRenderer    = new SkyboxRenderer(); Components.Add(SkyboxRenderer);

            List <string> nonLoaded = PluginLoader.LoadAll(this);

            for (int i = 0; i < Components.Count; i++)
            {
                Components[i].Init(this);
            }
            ExtractInitialTexturePack();
            for (int i = 0; i < Components.Count; i++)
            {
                Components[i].Ready(this);
            }
            InitScheduledTasks();

            if (nonLoaded != null)
            {
                for (int i = 0; i < nonLoaded.Count; i++)
                {
                    Overlay warning = new PluginOverlay(this, nonLoaded[i]);
                    Gui.ShowOverlay(warning, false);
                }
            }

            LoadIcon();
            string connectString = "Connecting to " + IPAddress + ":" + Port + "..";
            if (Graphics.WarnIfNecessary(Chat))
            {
                MapBordersRenderer.UseLegacyMode(true);
                EnvRenderer.UseLegacyMode(true);
            }
            Gui.SetNewScreen(new LoadingScreen(this, connectString, ""));
            Server.BeginConnect();
        }
Exemple #10
0
        internal void OnLoad()
        {
            Mouse    = window.Mouse;
            Keyboard = window.Keyboard;

                        #if ANDROID
            Graphics = new OpenGLESApi();
                        #elif !USE_DX
            Graphics = new OpenGLApi();
                        #else
            Graphics = new Direct3D9Api(this);
                        #endif
            Graphics.MakeApiInfo();
            ErrorHandler.AdditionalInfo = Graphics.ApiInfo;

                        #if ANDROID
            Drawer2D = new CanvasDrawer2D(Graphics);
                        #else
            Drawer2D = new GdiPlusDrawer2D(Graphics);
                        #endif

            Entities = new EntityList(this);
            AcceptedUrls.Load();
            DeniedUrls.Load();
            ETags.Load();
            LastModified.Load();

            if (Options.GetBool(OptionsKey.SurvivalMode, false))
            {
                Mode = new SurvivalGameMode();
            }
            else
            {
                Mode = new CreativeGameMode();
            }
            Components.Add(Mode);

            Input           = new InputHandler(this);
            defaultIb       = Graphics.MakeDefaultIb();
            ParticleManager = new ParticleManager(); Components.Add(ParticleManager);
            TabList         = new TabList(); Components.Add(TabList);
            LoadOptions();
            LoadGuiOptions();
            Chat = new Chat(); Components.Add(Chat);

            WorldEvents.OnNewMap       += OnNewMapCore;
            WorldEvents.OnNewMapLoaded += OnNewMapLoadedCore;
            Events.TextureChanged      += TextureChangedCore;

            BlockInfo.Init();
            ModelCache = new ModelCache(this);
            ModelCache.InitCache();
            AsyncDownloader = new AsyncDownloader(Drawer2D); Components.Add(AsyncDownloader);
            Lighting        = new BasicLighting(); Components.Add(Lighting);

            Drawer2D.UseBitmappedChat = ClassicMode || !Options.GetBool(OptionsKey.UseChatFont, false);
            Drawer2D.BlackTextShadows = Options.GetBool(OptionsKey.BlackText, false);
            Graphics.Mipmaps          = Options.GetBool(OptionsKey.Mipmaps, false);

            TerrainAtlas1D = new TerrainAtlas1D(this);
            TerrainAtlas   = new TerrainAtlas2D(this);
            Animations     = new Animations(); Components.Add(Animations);
            Inventory      = new Inventory(); Components.Add(Inventory);

            BlockInfo.SetDefaultPerms();
            World       = new World(this);
            LocalPlayer = new LocalPlayer(this); Components.Add(LocalPlayer);
            Entities.List[EntityList.SelfID] = LocalPlayer;
            Width = window.Width; Height = window.Height;

            MapRenderer = new MapRenderer(this);
            string renType = Options.Get(OptionsKey.RenderType) ?? "normal";
            if (!SetRenderType(renType))
            {
                SetRenderType("normal");
            }

            if (IPAddress == null)
            {
                Server = new Singleplayer.SinglePlayerServer(this);
            }
            else
            {
                Server = new Network.NetworkProcessor(this);
            }
            Graphics.LostContextFunction = Server.Tick;

            Cameras.Add(new FirstPersonCamera(this));
            Cameras.Add(new ThirdPersonCamera(this, false));
            Cameras.Add(new ThirdPersonCamera(this, true));
            Camera = Cameras[0];
            UpdateProjection();

            Gui               = new GuiInterface(this); Components.Add(Gui);
            CommandList       = new CommandList(); Components.Add(CommandList);
            SelectionManager  = new SelectionManager(); Components.Add(SelectionManager);
            WeatherRenderer   = new WeatherRenderer(); Components.Add(WeatherRenderer);
            HeldBlockRenderer = new HeldBlockRenderer(); Components.Add(HeldBlockRenderer);

            Graphics.DepthTest = true;
            Graphics.DepthTestFunc(CompareFunc.LessEqual);
            //Graphics.DepthWrite = true;
            Graphics.AlphaBlendFunc(BlendFunc.SourceAlpha, BlendFunc.InvSourceAlpha);
            Graphics.AlphaTestFunc(CompareFunc.Greater, 0.5f);
            Culling           = new FrustumCulling();
            Picking           = new PickedPosRenderer(); Components.Add(Picking);
            AudioPlayer       = new AudioPlayer(); Components.Add(AudioPlayer);
            AxisLinesRenderer = new AxisLinesRenderer(); Components.Add(AxisLinesRenderer);
            SkyboxRenderer    = new SkyboxRenderer(); Components.Add(SkyboxRenderer);

            plugins = new PluginLoader(this);
            List <string> nonLoaded = plugins.LoadAll();

            for (int i = 0; i < Components.Count; i++)
            {
                Components[i].Init(this);
            }
            ExtractInitialTexturePack();
            for (int i = 0; i < Components.Count; i++)
            {
                Components[i].Ready(this);
            }
            InitScheduledTasks();

            if (nonLoaded != null)
            {
                for (int i = 0; i < nonLoaded.Count; i++)
                {
                    plugins.MakeWarning(this, nonLoaded[i]);
                }
            }

            window.LoadIcon();
            string connectString = "Connecting to " + IPAddress + ":" + Port + "..";
            if (Graphics.WarnIfNecessary(Chat))
            {
                MapBordersRenderer.UseLegacyMode(true);
                EnvRenderer.UseLegacyMode(true);
            }
            Gui.SetNewScreen(new LoadingMapScreen(this, connectString, ""));
            Server.Connect(IPAddress, Port);
        }
Exemple #11
0
        internal void OnLoad()
        {
            Mouse    = window.Mouse;
            Keyboard = window.Keyboard;
                        #if !USE_DX
            Graphics = new OpenGLApi();
                        #else
            Graphics = new Direct3D9Api(this);
                        #endif
            Graphics.MakeGraphicsInfo();

            Options.Load();
            Entities = new EntityList(this);
            AcceptedUrls.Load();
            DeniedUrls.Load();
            ETags.Load();
            InputHandler    = new InputHandler(this);
            defaultIb       = Graphics.MakeDefaultIb();
            ParticleManager = AddComponent(new ParticleManager());
            TabList         = AddComponent(new TabList());
            LoadOptions();
            LoadGuiOptions();
            Chat = AddComponent(new Chat());
            WorldEvents.OnNewMap       += OnNewMapCore;
            WorldEvents.OnNewMapLoaded += OnNewMapLoadedCore;

            BlockInfo = new BlockInfo();
            BlockInfo.Init();
            ModelCache = new ModelCache(this);
            ModelCache.InitCache();
            AsyncDownloader           = AddComponent(new AsyncDownloader());
            Drawer2D                  = new GdiPlusDrawer2D(Graphics);
            Drawer2D.UseBitmappedChat = ClassicMode || !Options.GetBool(OptionsKey.ArialChatFont, false);
            Drawer2D.BlackTextShadows = Options.GetBool(OptionsKey.BlackTextShadows, false);

            TerrainAtlas1D = new TerrainAtlas1D(Graphics);
            TerrainAtlas   = new TerrainAtlas2D(Graphics, Drawer2D);
            Animations     = AddComponent(new Animations());
            Inventory      = AddComponent(new Inventory());

            BlockInfo.SetDefaultBlockPermissions(Inventory.CanPlace, Inventory.CanDelete);
            World              = new World(this);
            LocalPlayer        = AddComponent(new LocalPlayer(this));
            Entities[255]      = LocalPlayer;
            width              = Width;
            height             = Height;
            MapRenderer        = new MapRenderer(this);
            MapBordersRenderer = AddComponent(new MapBordersRenderer());
            EnvRenderer        = AddComponent(new StandardEnvRenderer());
            if (IPAddress == null)
            {
                Network = new Singleplayer.SinglePlayerServer(this);
            }
            else
            {
                Network = new Network.NetworkProcessor(this);
            }
            Graphics.LostContextFunction = Network.Tick;

            firstPersonCam        = new FirstPersonCamera(this);
            thirdPersonCam        = new ThirdPersonCamera(this);
            forwardThirdPersonCam = new ForwardThirdPersonCamera(this);
            Camera = firstPersonCam;
            UpdateProjection();
            CommandManager    = AddComponent(new CommandManager());
            SelectionManager  = AddComponent(new SelectionManager());
            WeatherRenderer   = AddComponent(new WeatherRenderer());
            BlockHandRenderer = AddComponent(new BlockHandRenderer());

            Graphics.DepthTest = true;
            Graphics.DepthTestFunc(CompareFunc.LessEqual);
            //Graphics.DepthWrite = true;
            Graphics.AlphaBlendFunc(BlendFunc.SourceAlpha, BlendFunc.InvSourceAlpha);
            Graphics.AlphaTestFunc(CompareFunc.Greater, 0.5f);
            fpsScreen         = AddComponent(new FpsScreen(this));
            hudScreen         = AddComponent(new HudScreen(this));
            Culling           = new FrustumCulling();
            Picking           = AddComponent(new PickedPosRenderer());
            AudioPlayer       = AddComponent(new AudioPlayer());
            AxisLinesRenderer = AddComponent(new AxisLinesRenderer());
            SkyboxRenderer    = AddComponent(new SkyboxRenderer());

            foreach (IGameComponent comp in Components)
            {
                comp.Init(this);
            }
            ExtractInitialTexturePack();
            foreach (IGameComponent comp in Components)
            {
                comp.Ready(this);
            }

            LoadIcon();
            string connectString = "Connecting to " + IPAddress + ":" + Port + "..";
            if (Graphics.WarnIfNecessary(Chat))
            {
                MapBordersRenderer.UseLegacyMode(true);
                ((StandardEnvRenderer)EnvRenderer).UseLegacyMode(true);
            }
            SetNewScreen(new LoadingMapScreen(this, connectString, "Waiting for handshake"));
            Network.Connect(IPAddress, Port);
        }