Beispiel #1
0
        public void Init()
        {
            RogueEncampmentWp = null;
            RedPortal         = null;
            InGame            = false;
            FullyEnteredGame  = false;
            LastTeleport      = 0;
            Experience        = 0;
            Me = new Player();
            Logger.Write("Reset GameData");

            SkillLevels.Clear();
            ItemSkillLevels.Clear();
            Players.Clear();
            Npcs.Clear();
            Items.Clear();
            WorldObjects.Clear();

            Inventory = new Container("Inventory", ContainerType.Inventory, InventoryWidth, InventoryHeight);
            Stash     = new Container("Stash", ContainerType.Stash, StashWidth, StashHeight);
            Cube      = new Container("Cube", ContainerType.Cube, CubeWidth, CubeHeight); //todo make configurable
            Belt      = new Container("Belt", ContainerType.Belt, 4, 4);                  //todo make size depend on belt type...

            MalahId                  = 0;
            CurrentLife              = 0;
            FirstNpcInfoPacket       = true;
            AttacksSinceLastTeleport = 0;
            WeaponSet                = 0;
            HasMerc                  = false;
        }
Beispiel #2
0
        public void Init()
        {
            RogueEncampmentWp = null;
            RedPortal         = null;
            InGame            = false;
            FullyEnteredGame  = false;
            LastTeleport      = 0;
            Experience        = 0;
            Me = new Player();
            Logging.Logger.Write("Reset self");

            SkillLevels.Clear();
            ItemSkillLevels.Clear();
            Logging.Logger.Write("Cleared Skills");
            Players.Clear();
            Logging.Logger.Write("Cleared Players");
            Npcs.Clear();
            Logging.Logger.Write("Cleared Npcs");
            Items.Clear();
            WorldObjects.Clear();

            Inventory = new Container("Inventory", GameData.InventoryWidth, GameData.InventoryHeight);
            Stash     = new Container("Stash", GameData.StashWidth, GameData.StashHeight);
            Cube      = new Container("Cube", GameData.CubeWidth, GameData.CubeHeight);
            Belt      = new Container("Belt", 4, 4);

            MalahId                  = 0;
            CurrentLife              = 0;
            FirstNpcInfoPacket       = true;
            AttacksSinceLastTeleport = 0;
            WeaponSet                = 0;
            HasMerc                  = false;
        }
Beispiel #3
0
 public void Clear()
 {
     Data = null;
     Players.Clear();
     Monsters.Clear();
     Npcs.Clear();
     Others.Clear();
 }
Beispiel #4
0
 protected void SoftReset()
 {
     WarpToNextField = false;
     bStarted        = false;
     bLost           = false;
     StageExp        = 0;
     CumulativeExp   = 0;
     MobKills.Clear();
     Mobs.aMobGen.Clear();             // clear default spawns so we can add our own
     Mobs.Clear();
     Npcs.Clear();
 }
Beispiel #5
0
        public void UpdateLocationNpcs()
        {
            ObservableCollection <Npc> updateLocationNpcs = new ObservableCollection <Npc>();

            foreach (Npc Npc in _npcs)
            {
                updateLocationNpcs.Add(Npc);
            }
            Npcs.Clear();

            foreach (Npc npc in updateLocationNpcs)
            {
                Npcs.Add(npc);
            }
        }
Beispiel #6
0
        private void HandleMapComplementaryInformationsDataMessage(IAccount account,
                                                                   MapComplementaryInformationsDataMessage message)
        {
            lock (CheckLock)
            {
                SubAreaId = message.SubAreaId;
                Data      = MapsManager.FromId(message.MapId);
                var subArea = ObjectDataManager.Instance.Get <SubArea>(SubAreaId);
                var mapName =
                    FastD2IReader.Instance.GetText(ObjectDataManager.Instance.Get <Area>(subArea.AreaId).NameId);
                var subAreaName = FastD2IReader.Instance.GetText(subArea.NameId);
                Position = $"[{X}, {Y}]";
                Zone     = $"{mapName} ({subAreaName})";
                Entities.Clear();
                Monsters.Clear();
                Npcs.Clear();
                Players.Clear();
                Resources.Clear();
                AddActors(message.Actors);
                StatedElements.Clear();
                //Populate the StateElements with new ones received.
                //StatesElements are the elements which our current bot in theory can harvest.
                foreach (var statedElement in message.StatedElements)
                {
                    if (!StatedElements.ContainsKey(statedElement.ElementId))
                    {
                        StatedElements.Add(statedElement.ElementId, new StatedElement(statedElement.ElementCellId, (uint)statedElement.ElementId, statedElement.ElementState));
                    }
                }
                InteractiveElements.Clear();
                Doors.Clear();
                //populate the interactiveElements which are essencially items that we can interact with. Their location is hardcoded into the map.layer
                foreach (var interactiveElement in message.InteractiveElements)
                {
                    if (!InteractiveElements.ContainsKey(interactiveElement.ElementId))
                    {
                        InteractiveElements.Add(interactiveElement.ElementId, new InteractiveElement((uint)interactiveElement.ElementId, interactiveElement.ElementTypeId, interactiveElement.EnabledSkills, interactiveElement.DisabledSkills));
                    }
                }
            }

            UpdateMapControl();

            OnMapChanged();
        }
Beispiel #7
0
        void NewGame()
        {
            var assets = Resolve <IAssetManager>();

            PartyMembers.Clear();
            foreach (PartyCharacterId charId in Enum.GetValues(typeof(PartyCharacterId)))
            {
                PartyMembers.Add(charId, assets.LoadCharacter(AssetType.PartyMember, charId));
            }

            Npcs.Clear();
            foreach (NpcCharacterId charId in Enum.GetValues(typeof(NpcCharacterId)))
            {
                Npcs.Add(charId, assets.LoadCharacter(AssetType.Npc, charId));
            }

            Chests.Clear();
            foreach (ChestId id in Enum.GetValues(typeof(ChestId)))
            {
                Chests.Add(id, assets.LoadChest(id));
            }

            Merchants.Clear();
            foreach (MerchantId id in Enum.GetValues(typeof(MerchantId)))
            {
                Merchants.Add(id, assets.LoadMerchant(id));
            }

            _party.Clear();

            Raise(new AddPartyMemberEvent(PartyCharacterId.Tom));
            Raise(new AddPartyMemberEvent(PartyCharacterId.Rainer));
            Raise(new AddPartyMemberEvent(PartyCharacterId.Drirr));
            Raise(new AddPartyMemberEvent(PartyCharacterId.Sira));
            Raise(new AddPartyMemberEvent(PartyCharacterId.Mellthas));
            Raise(new AddPartyMemberEvent(PartyCharacterId.Khunag));

            SetupTestState();
            Raise(new ReloadAssetsEvent()); // No need to keep character info cached once we've loaded it. New game is also a good point to clear out state.
            Raise(new PartyChangedEvent());
            Raise(new LoadMapEvent(MapDataId.Toronto2DGesamtkarteSpielbeginn));
            Raise(new StartClockEvent());
            Loaded = true;
        }
 public void LoadAlgorithmSettings()
 {
     FloorSettings.Clear();
     TileLayers.Clear();
     TileData.Clear();
     Items.Clear();
     Npcs.Clear();
     Rooms.Clear();
     if (Algorithm > -1)
     {
         FloorAlgorithm settingsGuide = GameData.FloorAlgorithmDex[Algorithm];
         for (int i = 0; i < settingsGuide.FloorSettings.Count; i++)
         {
             FloorSettings.Add(settingsGuide.FloorSettings[i].Item1, 0);
         }
         for (int i = 0; i < settingsGuide.LayerSettings.Count; i++)
         {
             TileLayers.Add(settingsGuide.LayerSettings[i], new List <Maps.TileAnim>());
         }
         for (int i = 0; i < settingsGuide.TileSettings.Count; i++)
         {
             TileData.Add(settingsGuide.TileSettings[i], new List <Maps.TileData>());
         }
         for (int i = 0; i < settingsGuide.ItemGroups.Count; i++)
         {
             Items.Add(settingsGuide.ItemGroups[i], new List <Tuple <ItemPreset, int> >());
         }
         for (int i = 0; i < settingsGuide.NpcGroups.Count; i++)
         {
             Npcs.Add(settingsGuide.NpcGroups[i], new List <Tuple <NpcPreset, int> >());
         }
         for (int i = 0; i < settingsGuide.RoomGroups.Count; i++)
         {
             Rooms.Add(settingsGuide.RoomGroups[i], new List <Tuple <int, int> >());
         }
     }
 }
Beispiel #9
0
        private void HandleMapComplementaryInformationsDataMessage(IAccount account,
                                                                   MapComplementaryInformationsDataMessage message)
        {
            lock (CheckLock)
            {
                SubAreaId = message.SubAreaId;
                Data      = MapsManager.FromId(message.MapId);

                var subArea = ObjectDataManager.Instance.Get <SubArea>(SubAreaId);
                var mapName =
                    FastD2IReader.Instance.GetText(ObjectDataManager.Instance.Get <Area>(subArea.AreaId).NameId);
                var subAreaName = FastD2IReader.Instance.GetText(subArea.NameId);
                Position = $"[{X}, {Y}]";
                Zone     = $"{mapName} ({subAreaName})";
                Entities.Clear();
                Monsters.Clear();
                Npcs.Clear();
                Players.Clear();
                AddActors(message.Actors);
                StatedElements.Clear();
                foreach (var statedElementDofus in message.StatedElements)
                {
                    if (!StatedElements.ContainsKey(statedElementDofus.ElementId) && statedElementDofus.OnCurrentMap)
                    {
                        StatedElements.Add(statedElementDofus.ElementId,
                                           new StatedElement(statedElementDofus.ElementCellId, (uint)statedElementDofus.ElementId,
                                                             statedElementDofus.ElementState));
                    }
                }
                InteractiveElements.Clear();
                Doors.Clear();
                foreach (var element in message.InteractiveElements)
                {
                    if (!element.OnCurrentMap)
                    {
                        continue;
                    }
                    InteractiveElements.Add(element.ElementId,
                                            new InteractiveElement((uint)element.ElementId, element.ElementTypeId,
                                                                   element.EnabledSkills.ToList(), element.DisabledSkills.ToList()));
                    var interactiveElement = element;
                    var listDoorSkillId    = new List <int>(new[] { 184, 183, 187, 198, 114 });
                    var listDoorTypeId     = new List <int>(new[] { -1, 128, 168, 16 });
                    if (!listDoorTypeId.Contains(interactiveElement.ElementTypeId) ||
                        interactiveElement.EnabledSkills.Count <= 0 ||
                        !listDoorSkillId.Contains((int)interactiveElement.EnabledSkills[0].SkillId))
                    {
                        continue;
                    }
                    foreach (var layer in ((API.Gamedata.D2p.Map)Data).Layers)
                    {
                        foreach (var cell in layer.Cells)
                        {
                            foreach (var layerElement in cell.Elements)
                            {
                                if (layerElement is GraphicalElement graphicalElement)
                                {
                                    if (graphicalElement.Identifier == interactiveElement.ElementId &&
                                        !Doors.ContainsKey(cell.CellId))
                                    {
                                        Doors.Add(cell.CellId,
                                                  new InteractiveElement((uint)element.ElementId, element.ElementTypeId,
                                                                         element.EnabledSkills.ToList(), element.DisabledSkills.ToList()));
                                    }
                                }
                            }
                        }
                    }
                }
            }

            UpdateMapControl();

            OnMapChanged();
        }
Beispiel #10
0
        public void EndGame(bool gmtrig)
        {
            this.Active = false;
            InvalidateProperties();

            if (gmtrig == false)
            {
                if (m_Team1 > 0 && m_Team2 == 0 && m_Team3 == 0 && m_Team4 == 0)
                {
                    World.Broadcast(0x22, true, m_Team1Name + " has won in Paintball!");
                    foreach (Mobile mob in Announcers)
                    {
                        mob.PublicOverheadMessage(MessageType.Regular, 0x22, false, m_Team1Name + " has won");
                    }
                }
                else if (m_Team2 > 0 && m_Team1 == 0 && m_Team3 == 0 && m_Team4 == 0)
                {
                    World.Broadcast(0x22, true, "Team 2 has won in Paintball!");
                    foreach (Mobile mob in Announcers)
                    {
                        mob.PublicOverheadMessage(MessageType.Regular, 0x22, false, m_Team2Name + " has won");
                    }
                }
                else if (m_Team3 > 0 && m_Team1 == 0 && m_Team2 == 0 && m_Team4 == 0)
                {
                    World.Broadcast(0x22, true, "Team 3 has won in Paintball!");
                    foreach (Mobile mob in Announcers)
                    {
                        mob.PublicOverheadMessage(MessageType.Regular, 0x22, false, m_Team3Name + " has won");
                    }
                }
                else if (m_Team4 > 0 && m_Team1 == 0 && m_Team2 == 0 && m_Team3 == 0)
                {
                    World.Broadcast(0x22, true, "Team 4 has won in Paintball!");
                    foreach (Mobile mob in Announcers)
                    {
                        mob.PublicOverheadMessage(MessageType.Regular, 0x22, false, m_Team4Name + " has won");
                    }
                }
                else
                {
                    World.Broadcast(0x22, true, "Error:");
                    World.Broadcast(0x22, true, m_Team1.ToString() + " = team 1");
                    World.Broadcast(0x22, true, m_Team2.ToString() + " = team 2");
                    World.Broadcast(0x22, true, m_Team3.ToString() + " = team 3");
                    World.Broadcast(0x22, true, m_Team4.ToString() + " = team 4");
                }
            }
            else if (gmtrig == true)
            {
                World.Broadcast(0x22, true, "The Paintball game was ended by the GM. No winner was declared.");
            }

            ArrayList MobDel = new ArrayList();

            if (Players != null)
            {
                foreach (Mobile pm in Players)
                {
                    pm.SendMessage("The game has ended.");

                    pm.Hidden  = true;
                    pm.Warmode = false;
                    pm.Frozen  = false;
                    if (gmtrig == false)
                    {
                        GivePrizes(pm);
                    }

                    Item PBSI;


                    Item LPackI;
                    Item IPackI;


                    Container bank = pm.FindBankNoCreate();

                    PBSI   = bank.FindItemByType(typeof(PBPlayerStorage));
                    LPackI = bank.FindItemByType(typeof(LayerPack));
                    IPackI = bank.FindItemByType(typeof(ItemsPack));

                    pm.AddToBackpack(PBSI);
                    pm.AddToBackpack(LPackI);
                    pm.AddToBackpack(IPackI);

                    List <Item> Layer = LPackI.Items;
                    if (Layer != null && LPackI != null)
                    {
                        if (Layer.Count > 0)
                        {
                            for (int i = Layer.Count - 1; i >= 0; --i)
                            {
                                if (i >= Layer.Count)
                                {
                                    continue;
                                }

                                pm.AddItem(Layer[i]);
                            }
                        }
                        LPackI.Delete();
                    }

                    List <Item> Pack = IPackI.Items;
                    if (Pack != null && IPackI != null)
                    {
                        if (Pack.Count > 0)
                        {
                            for (int i = Pack.Count - 1; i >= 0; --i)
                            {
                                if (i >= Pack.Count)
                                {
                                    continue;
                                }

                                pm.AddToBackpack(Pack[i]);
                            }
                        }
                        IPackI.Delete();
                    }



                    if (PBSI != null)
                    {
                        PBPlayerStorage PBStorage = PBSI as PBPlayerStorage;
                        if (PBStorage != null)
                        {
                            PBStorage.Use(pm);
                        }
                    }


                    ArrayList toDelete = new ArrayList();

                    foreach (Item litem in pm.Items)
                    {
                        if (litem is PBArmor || litem is PBWeapon || litem is PaintBall || litem is Cloak || litem is Squash || litem is PBGrenade)
                        {
                            toDelete.Add(litem);
                        }
                    }

                    if (pm.Backpack != null)
                    {
                        foreach (Item bitem in pm.Backpack.Items)
                        {
                            if (bitem is PBArmor || bitem is PBWeapon || bitem is PaintBall || bitem is Cloak ||
                                bitem is Squash || bitem is PBGrenade)
                            {
                                toDelete.Add(bitem);
                            }
                        }
                    }

                    foreach (Item ditem in toDelete)
                    {
                        ditem.Delete();
                    }
                }
            }
            if (DeadPlayers != null)
            {
                foreach (Mobile dm in DeadPlayers)
                {
                    dm.SendMessage("The game has ended.");

                    dm.Hidden  = true;
                    dm.Warmode = false;
                    dm.Frozen  = false;

                    if (gmtrig == false)
                    {
                        GivePrizes(dm);
                    }


                    Item            PBSI;
                    PBPlayerStorage PBS;

                    Item LPackI;
                    Item IPackI;



                    Container bank = dm.FindBankNoCreate();

                    PBSI   = bank.FindItemByType(typeof(PBPlayerStorage));
                    LPackI = bank.FindItemByType(typeof(LayerPack));
                    IPackI = bank.FindItemByType(typeof(ItemsPack));


                    dm.AddToBackpack(PBSI);
                    dm.AddToBackpack(LPackI);
                    dm.AddToBackpack(IPackI);


                    PBS = (PBPlayerStorage)PBSI;

                    List <Item> Layer = LPackI.Items;
                    if (Layer != null && LPackI != null)
                    {
                        if (Layer.Count > 0)
                        {
                            for (int i = Layer.Count - 1; i >= 0; --i)
                            {
                                if (i >= Layer.Count)
                                {
                                    continue;
                                }

                                dm.AddItem(Layer[i]);
                            }
                        }
                        LPackI.Delete();
                    }

                    List <Item> Pack = IPackI.Items;
                    if (Pack != null && IPackI != null)
                    {
                        if (Pack.Count > 0)
                        {
                            for (int i = Pack.Count - 1; i >= 0; --i)
                            {
                                if (i >= Pack.Count)
                                {
                                    continue;
                                }

                                dm.AddToBackpack(Pack[i]);
                            }
                        }
                        IPackI.Delete();
                    }



                    ArrayList toDelete = new ArrayList();

                    foreach (Item item in dm.Items)
                    {
                        if (item is PBArmor || item is PBWeapon || item is PaintBall || item is Cloak || item is Squash || item is PBGrenade)
                        {
                            toDelete.Add(item);
                        }
                    }

                    if (dm.Backpack != null)
                    {
                        foreach (Item bpitem in dm.Backpack.Items)
                        {
                            if (bpitem is PBArmor || bpitem is PBWeapon || bpitem is PaintBall || bpitem is Cloak || bpitem is Squash || bpitem is PBGrenade)
                            {
                                toDelete.Add(bpitem);
                            }

                            if (PBS != null)
                            {
                                PBS.Use(dm);
                            }
                        }
                    }
                    if (toDelete != null)
                    {
                        foreach (Item item in toDelete)
                        {
                            item.Delete();
                        }
                    }
                }
            }
            if (NpcPlayers != null)
            {
                foreach (Mobile npc  in NpcPlayers)
                {
                    MobDel.Add(npc);
                }
                NpcPlayers.Clear();
                NpcPlayers = new ArrayList();
            }

            if (MobDel != null)
            {
                foreach (Mobile Mob in  MobDel)
                {
                    if (Mob != null)
                    {
                        Mob.Delete();
                    }
                }
            }

            if (Players != null)
            {
                Players.Clear();
                Players = new ArrayList();
            }



            if (Npcs != null)
            {
                Npcs.Clear();
            }


            if (m_WinnersPrizes != null)
            {
                m_WinnersPrizes.Clear();
            }
            if (m_Team1List != null)
            {
                m_Team1List.Clear();
            }
            if (m_Team2List != null)
            {
                m_Team2List.Clear();
            }
            if (m_Team3List != null)
            {
                m_Team3List.Clear();
            }
            if (m_Team4List != null)
            {
                m_Team4List.Clear();
            }


            m_Team1 = 0;
            m_Team2 = 0;
            m_Team3 = 0;
            m_Team4 = 0;

            UpdateTeams();

            m_CurrentTeam = 0;

            Players = new ArrayList();
            m_Npcs  = new ArrayList();

            m_Team1List = new ArrayList();
            m_Team2List = new ArrayList();
            m_Team3List = new ArrayList();
            m_Team4List = new ArrayList();

            NpcPlayers      = new ArrayList();
            m_WinnersPrizes = new ArrayList();
            DeadPlayers     = new ArrayList();
            Reset();

            /* if( m_Timer != null )
             *      m_Timer.Stop(); */
        }
Beispiel #11
0
        private void AddServerToRecent(string server, string password)
        {
            if (string.IsNullOrWhiteSpace(server))
            {
                return;
            }
            var split = server.Split(':');

            if (split.Length < 2 || string.IsNullOrWhiteSpace(split[0]) || string.IsNullOrWhiteSpace(split[1]) || !int.TryParse(split[1], out int tmpPort))
            {
                return;
            }

            if (!PlayerSettings.RecentServers.Contains(server))
            {
                PlayerSettings.RecentServers.Add(server);
                if (PlayerSettings.RecentServers.Count > 20)
                {
                    PlayerSettings.RecentServers.RemoveAt(0);
                }
                Util.Util.SaveSettings(GTANInstallDir + "\\settings.xml");

                var item = new UIMenuItem(server)
                {
                    Description = server
                };
                item.SetRightLabel(server);
                item.Activated += (sender, selectedItem) =>
                {
                    if (IsOnServer())
                    {
                        Client.Disconnect("Switching servers");
                        NetEntityHandler.ClearAll();


                        if (Npcs != null)
                        {
                            Npcs.ToList().ForEach(pair => pair.Value.Clear());
                            Npcs.Clear();
                        }

                        while (IsOnServer())
                        {
                            Script.Yield();
                        }
                    }

                    var splt = server.Split(':');
                    if (splt.Length < 2)
                    {
                        return;
                    }
                    if (!int.TryParse(splt[1], out int port))
                    {
                        return;
                    }

                    ConnectToServer(splt[0], port, false, password);
                    MainMenu.TemporarilyHidden = true;
                    _connectTab.RefreshIndex();
                };
                _recentBrowser.Items.Add(item);
            }
        }
Beispiel #12
0
        private void BuildMainMenu()
        {
            MainMenu = new TabView("Cherry Multiplayer")
            {
                CanLeave      = false,
                MoneySubtitle = "Cherry MP " + CurrentVersion
            };

            _mainMapItem = new TabMapItem();

            #region Welcome Screen
            {
                _welcomePage = new TabWelcomeMessageItem("Welcome to Cherry Multiplayer", "Development branch.");
                MainMenu.Tabs.Add(_welcomePage);
            }
            #endregion

            #region ServerBrowser
            {
                var dConnect = new TabButtonArrayItem("Quick Connect");

                {
                    var ipButton = new TabButton
                    {
                        Text = "IP Address",
                        Size = new Size(500, 40)
                    };
                    ipButton.Activated += (sender, args) =>
                    {
                        MainMenu.TemporarilyHidden = true;
                        var newIp = InputboxThread.GetUserInput(_clientIp ?? "", 30, TickSpinner);
                        _clientIp     = newIp;
                        ipButton.Text = string.IsNullOrWhiteSpace(newIp) ? "IP Address" : newIp;
                        MainMenu.TemporarilyHidden = false;
                    };
                    dConnect.Buttons.Add(ipButton);
                }

                {
                    var ipButton = new TabButton
                    {
                        Text = "Port",
                        Size = new Size(500, 40)
                    };
                    ipButton.Activated += (sender, args) =>
                    {
                        MainMenu.TemporarilyHidden = true;
                        var port = InputboxThread.GetUserInput(Port.ToString(), 30, TickSpinner);

                        if (string.IsNullOrWhiteSpace(port))
                        {
                            port = "4499";
                        }

                        if (!int.TryParse(port, out int newPort))
                        {
                            Util.Util.SafeNotify("Wrong port format!");
                            MainMenu.TemporarilyHidden = false;
                            return;
                        }
                        Port          = newPort;
                        ipButton.Text = Port.ToString();
                        MainMenu.TemporarilyHidden = false;
                    };
                    dConnect.Buttons.Add(ipButton);
                }

                {
                    var ipButton = new TabButton
                    {
                        Text = "Password",
                        Size = new Size(500, 40)
                    };
                    ipButton.Activated += (sender, args) =>
                    {
                        MainMenu.TemporarilyHidden = true;
                        var newIp = InputboxThread.GetUserInput("", 30, TickSpinner);
                        MainMenu.TemporarilyHidden = false;
                        _QCpassword   = newIp;
                        ipButton.Text = string.IsNullOrWhiteSpace(newIp) ? "Password" : "*******";
                    };
                    dConnect.Buttons.Add(ipButton);
                }

                {
                    var ipButton = new TabButton
                    {
                        Text = "Connect",
                        Size = new Size(500, 40)
                    };
                    ipButton.Activated += (sender, args) =>
                    {
                        var isPassworded = false;
                        if (!string.IsNullOrWhiteSpace(_QCpassword))
                        {
                            isPassworded = true;
                        }

                        AddServerToRecent(_clientIp + ":" + Port, _QCpassword);
                        ConnectToServer(_clientIp, Port, isPassworded, _QCpassword);
                        MainMenu.TemporarilyHidden = true;
                    };
                    dConnect.Buttons.Add(ipButton);
                }

                _Verified      = new TabInteractiveListItem("Verified", new List <UIMenuItem>());
                _serverBrowser = new TabInteractiveListItem("Internet", new List <UIMenuItem>());
                _favBrowser    = new TabInteractiveListItem("Favorites", new List <UIMenuItem>());
                _lanBrowser    = new TabInteractiveListItem("Local Network", new List <UIMenuItem>());
                _recentBrowser = new TabInteractiveListItem("Recent", new List <UIMenuItem>());

                _connectTab = new TabSubmenuItem("connect", new List <TabItem>()
                {
                    dConnect, _favBrowser, _Verified, _serverBrowser, _lanBrowser, _recentBrowser
                });

                MainMenu.AddTab(_connectTab);
                _connectTab.DrawInstructionalButtons += (sender, args) =>
                {
                    MainMenu.DrawInstructionalButton(4, Control.Jump, "Refresh");

                    if (Game.IsControlJustPressed(0, Control.Jump))
                    {
                        RebuildServerBrowser();
                    }
                    #region Verified, Iternet, LAN and Recent
                    if (_connectTab.Index == 2 && _connectTab.Items[2].Focused || _connectTab.Index == 3 && _connectTab.Items[3].Focused || _connectTab.Index == 4 && _connectTab.Items[4].Focused || _connectTab.Index == 5 && _connectTab.Items[5].Focused)
                    {
                        MainMenu.DrawInstructionalButton(5, Control.Enter, "Add to Favorites");
                        if (Game.IsControlJustPressed(0, Control.Enter))
                        {
                            var selectedServer = _serverBrowser.Items[_serverBrowser.Index];
                            if (_connectTab.Index == 2 && _connectTab.Items[2].Focused)
                            {
                                selectedServer = _Verified.Items[_Verified.Index];
                            }
                            else if (_connectTab.Index == 4 && _connectTab.Items[4].Focused)
                            {
                                selectedServer = _lanBrowser.Items[_lanBrowser.Index];
                            }
                            else if (_connectTab.Index == 5 && _connectTab.Items[5].Focused)
                            {
                                selectedServer = _recentBrowser.Items[_recentBrowser.Index];
                            }
                            selectedServer.SetRightBadge(UIMenuItem.BadgeStyle.None);
                            if (PlayerSettings.FavoriteServers.Contains(selectedServer.Description))
                            {
                                var favItem = _favBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description);
                                if (favItem != null)
                                {
                                    selectedServer.SetRightBadge(UIMenuItem.BadgeStyle.None);
                                    RemoveFromFavorites(selectedServer.Description);
                                    _favBrowser.Items.Remove(favItem);
                                    _favBrowser.RefreshIndex();
                                }
                            }
                            else
                            {
                                AddToFavorites(selectedServer.Description);
                                selectedServer.SetRightBadge(UIMenuItem.BadgeStyle.Star);
                                var item = new UIMenuItem(selectedServer.Text)
                                {
                                    Description = selectedServer.Description
                                };
                                item.SetRightLabel(selectedServer.RightLabel);
                                item.SetLeftBadge(selectedServer.LeftBadge);
                                item.Activated += (faf, selectedItem) =>
                                {
                                    if (IsOnServer())
                                    {
                                        Client.Disconnect("Switching servers");
                                        NetEntityHandler.ClearAll();

                                        if (Npcs != null)
                                        {
                                            Npcs.ToList().ForEach(pair => pair.Value.Clear());
                                            Npcs.Clear();
                                        }

                                        while (IsOnServer())
                                        {
                                            Script.Yield();
                                        }
                                    }
                                    bool pass = false;
                                    if (selectedServer.LeftBadge == UIMenuItem.BadgeStyle.Lock)
                                    {
                                        pass = true;
                                    }

                                    var splt = selectedServer.Description.Split(':');

                                    if (splt.Length < 2)
                                    {
                                        return;
                                    }
                                    if (!int.TryParse(splt[1], out int port))
                                    {
                                        return;
                                    }

                                    ConnectToServer(splt[0], port, pass);
                                    MainMenu.TemporarilyHidden = true;
                                    _connectTab.RefreshIndex();
                                };
                                _favBrowser.Items.Add(item);
                            }
                        }
                    }
                    #endregion

                    #region Favorites
                    if (_connectTab.Index == 1 && _connectTab.Items[1].Focused)
                    {
                        MainMenu.DrawInstructionalButton(6, Control.NextCamera, "Add Server");

                        #region Add server
                        if (Game.IsControlJustPressed(0, Control.NextCamera))
                        {
                            MainMenu.TemporarilyHidden = true;
                            var serverIp = InputboxThread.GetUserInput("Server IP(:Port)", 40, TickSpinner);

                            if (serverIp.Contains("Server IP(:Port)") || string.IsNullOrWhiteSpace(serverIp))
                            {
                                Util.Util.SafeNotify("Incorrect input!");
                                MainMenu.TemporarilyHidden = false;
                                return;
                            }
                            else if (!serverIp.Contains(":"))
                            {
                                serverIp += ":4499";
                            }
                            MainMenu.TemporarilyHidden = false;

                            if (!PlayerSettings.FavoriteServers.Contains(serverIp))
                            {
                                AddToFavorites(serverIp);
                                var item = new UIMenuItem(serverIp)
                                {
                                    Description = serverIp
                                };
                                _favBrowser.Items.Add(item);
                            }
                            else
                            {
                                Util.Util.SafeNotify("Server already on the list");
                                return;
                            }
                        }
                        #endregion

                        MainMenu.DrawInstructionalButton(5, Control.Enter, "Remove");

                        #region Remove
                        if (Game.IsControlJustPressed(0, Control.Enter))
                        {
                            var selectedServer = _favBrowser.Items[_favBrowser.Index];
                            var favItem        = _favBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description);

                            if (_Verified.Items.FirstOrDefault(i => i.Description == selectedServer.Description) != null)
                            {
                                _Verified.Items.FirstOrDefault(i => i.Description == selectedServer.Description).SetRightBadge(UIMenuItem.BadgeStyle.None);
                            }

                            if (_serverBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description) != null)
                            {
                                _serverBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description).SetRightBadge(UIMenuItem.BadgeStyle.None);
                            }

                            if (_lanBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description) != null)
                            {
                                _lanBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description).SetRightBadge(UIMenuItem.BadgeStyle.None);
                            }

                            if (_recentBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description) != null)
                            {
                                _recentBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description).SetRightBadge(UIMenuItem.BadgeStyle.None);
                            }

                            if (favItem != null)
                            {
                                Util.Util.SafeNotify("Server removed from Favorites!");
                                RemoveFromFavorites(selectedServer.Description);
                                _favBrowser.Items.Remove(favItem);
                                _favBrowser.RefreshIndex();
                            }
                        }
                        #endregion
                    }
                    #endregion
                };
                CherryDiscord.CherryDiscord.InMenuDiscordInitialize(CurrentVersion.ToString());
                CherryDiscord.CherryDiscord.InMenuDiscordUpdatePresence();
            }
            #endregion

            #region Settings
            {
                #region General Menu
                var GeneralMenu = new TabInteractiveListItem("General", new List <UIMenuItem>());
                {
                    var nameItem = new UIMenuItem("Display Name");
                    nameItem.SetRightLabel(PlayerSettings.DisplayName);
                    nameItem.Activated += (sender, item) =>
                    {
                        if (IsOnServer())
                        {
                            GTA.UI.Screen.ShowNotification("You cannot change your Display Name while connected to a server.");
                            return;
                        }
                        MainMenu.TemporarilyHidden = true;
                        var newName = InputboxThread.GetUserInput(PlayerSettings.DisplayName ?? "Enter a new Display Name", 32, TickSpinner);
                        if (!string.IsNullOrWhiteSpace(newName))
                        {
                            if (newName.Length > 32)
                            {
                                newName = newName.Substring(0, 32);
                            }

                            newName = newName.Replace(' ', '_');

                            PlayerSettings.DisplayName = newName;
                            SaveSettings();
                            nameItem.SetRightLabel(newName);
                        }
                        MainMenu.TemporarilyHidden = false;
                    };

                    GeneralMenu.Items.Add(nameItem);
                }
                {
                    var debugItem = new UIMenuCheckboxItem("Show Game FPS Counter", PlayerSettings.ShowFPS);
                    debugItem.CheckboxEvent += (sender, @checked) =>
                    {
                        PlayerSettings.ShowFPS = @checked;
                        DebugInfo.FPS          = @checked;
                        SaveSettings();
                    };
                    GeneralMenu.Items.Add(debugItem);
                }
                {
                    var debugItem = new UIMenuCheckboxItem("Disable Rockstar Editor", PlayerSettings.DisableRockstarEditor);
                    debugItem.CheckboxEvent += (sender, @checked) =>
                    {
                        PlayerSettings.DisableRockstarEditor = @checked;
                        SaveSettings();
                    };
                    GeneralMenu.Items.Add(debugItem);
                }
                {
                    var debugItem = new UIMenuCheckboxItem("Allow Webcam/Microphone Streaming (Requires restart)", PlayerSettings.MediaStream);
                    debugItem.CheckboxEvent += (sender, @checked) =>
                    {
                        PlayerSettings.MediaStream = @checked;
                        SaveSettings();
                    };
                    GeneralMenu.Items.Add(debugItem);
                }
                {
                    var nameItem = new UIMenuItem("Update Channel");
                    nameItem.SetRightLabel(PlayerSettings.UpdateChannel);
                    nameItem.Activated += (sender, item) =>
                    {
                        MainMenu.TemporarilyHidden = true;
                        var newName = InputboxThread.GetUserInput(PlayerSettings.UpdateChannel ?? "stable", 40, TickSpinner);
                        if (!string.IsNullOrWhiteSpace(newName))
                        {
                            PlayerSettings.UpdateChannel = newName;
                            SaveSettings();
                            nameItem.SetRightLabel(newName);
                        }
                        MainMenu.TemporarilyHidden = false;
                    };

                    GeneralMenu.Items.Add(nameItem);
                }
                #endregion

                #region Chat
                var ChatboxMenu = new TabInteractiveListItem("Chat", new List <UIMenuItem>());

                {
                    var chatItem = new UIMenuCheckboxItem("Enable Timestamp", PlayerSettings.Timestamp);
                    chatItem.CheckboxEvent += (sender, @checked) =>
                    {
                        PlayerSettings.Timestamp = @checked;
                        SaveSettings();
                    };
                    ChatboxMenu.Items.Add(chatItem);
                }
                {
                    var chatItem = new UIMenuCheckboxItem("Use Military Time", PlayerSettings.Militarytime);
                    chatItem.CheckboxEvent += (sender, @checked) =>
                    {
                        PlayerSettings.Militarytime = @checked;
                        SaveSettings();
                    };
                    ChatboxMenu.Items.Add(chatItem);
                }
                {
                    var chatItem = new UIMenuCheckboxItem("Scale Chatbox With Safezone", PlayerSettings.ScaleChatWithSafezone);
                    chatItem.CheckboxEvent += (sender, @checked) =>
                    {
                        PlayerSettings.ScaleChatWithSafezone = @checked;
                        SaveSettings();
                    };
                    ChatboxMenu.Items.Add(chatItem);
                }

                {
                    var chatItem = new UIMenuItem("Horizontal Chatbox Offset");
                    chatItem.SetRightLabel(PlayerSettings.ChatboxXOffset.ToString());
                    chatItem.Activated += (sender, item) =>
                    {
                        MainMenu.TemporarilyHidden = true;
                        var strInput = InputboxThread.GetUserInput(PlayerSettings.ChatboxXOffset.ToString(),
                                                                   10, TickSpinner);

                        if (!int.TryParse(strInput, out int newSetting))
                        {
                            Util.Util.SafeNotify("Input was not in the correct format.");
                            MainMenu.TemporarilyHidden = false;
                            return;
                        }
                        MainMenu.TemporarilyHidden    = false;
                        PlayerSettings.ChatboxXOffset = newSetting;
                        chatItem.SetRightLabel(PlayerSettings.ChatboxXOffset.ToString());
                        SaveSettings();
                    };
                    ChatboxMenu.Items.Add(chatItem);
                }

                {
                    var chatItem = new UIMenuItem("Vertical Chatbox Offset");
                    chatItem.SetRightLabel(PlayerSettings.ChatboxYOffset.ToString());
                    chatItem.Activated += (sender, item) =>
                    {
                        MainMenu.TemporarilyHidden = true;
                        var strInput = InputboxThread.GetUserInput(PlayerSettings.ChatboxYOffset.ToString(),
                                                                   10, TickSpinner);

                        if (!int.TryParse(strInput, out int newSetting))
                        {
                            Util.Util.SafeNotify("Input was not in the correct format.");
                            MainMenu.TemporarilyHidden = false;
                            return;
                        }
                        MainMenu.TemporarilyHidden    = false;
                        PlayerSettings.ChatboxYOffset = newSetting;
                        chatItem.SetRightLabel(PlayerSettings.ChatboxYOffset.ToString());
                        SaveSettings();
                    };
                    ChatboxMenu.Items.Add(chatItem);
                }

                {
                    var chatItem = new UIMenuCheckboxItem("Use Classic Chatbox", PlayerSettings.UseClassicChat);
                    chatItem.CheckboxEvent += (sender, @checked) =>
                    {
                        PlayerSettings.UseClassicChat = @checked;
                        SaveSettings();
                    };
                    ChatboxMenu.Items.Add(chatItem);
                }
                #endregion

                #region Experimental
                var ExpMenu = new TabInteractiveListItem("Experimental", new List <UIMenuItem>());
                {
                    var expItem = new UIMenuCheckboxItem("Disable Chromium Embedded Framework (Requires restart)", PlayerSettings.DisableCEF);
                    expItem.CheckboxEvent += (sender, @checked) =>
                    {
                        PlayerSettings.DisableCEF = @checked;
                        SaveSettings();
                    };
                    ExpMenu.Items.Add(expItem);
                }
                #endregion

                #region Debug Menu
                var DebugMenu = new TabInteractiveListItem("Debug", new List <UIMenuItem>());
                {
                    {
                        var expItem = new UIMenuCheckboxItem("Enable CEF Development Tools (http://localhost:9222) [Restart required]", PlayerSettings.CEFDevtool);
                        expItem.CheckboxEvent += (sender, @checked) =>
                        {
                            PlayerSettings.CEFDevtool = @checked;
                            SaveSettings();
                        };
                        DebugMenu.Items.Add(expItem);
                    }

                    {
                        var expItem = new UIMenuCheckboxItem("Enable Debug mode (Requires an extra tool)", PlayerSettings.DebugMode);
                        expItem.CheckboxEvent += (sender, @checked) =>
                        {
                            PlayerSettings.DebugMode = @checked;
                            SaveSettings();
                        };
                        DebugMenu.Items.Add(expItem);
                    }

                    {
                        var expItem = new UIMenuCheckboxItem("Save Debug to File (Huge performance impact)", SaveDebugToFile);
                        expItem.CheckboxEvent += (sender, @checked) =>
                        {
                            SaveDebugToFile = @checked;
                            SaveSettings();
                        };
                        DebugMenu.Items.Add(expItem);
                    }

                    {
                        var debugItem = new UIMenuCheckboxItem("Remove Game Entities", RemoveGameEntities);
                        debugItem.CheckboxEvent += (sender, @checked) =>
                        {
                            RemoveGameEntities = @checked;
                        };
                        DebugMenu.Items.Add(debugItem);
                    }

                    {
                        var debugItem = new UIMenuCheckboxItem("Show Streamer Debug Data", DebugInfo.StreamerDebug);
                        debugItem.CheckboxEvent += (sender, @checked) =>
                        {
                            DebugInfo.StreamerDebug = @checked;
                        };
                        DebugMenu.Items.Add(debugItem);
                    }

                    {
                        var debugItem = new UIMenuCheckboxItem("Disable Nametag Draw", ToggleNametagDraw);
                        debugItem.CheckboxEvent += (sender, @checked) =>
                        {
                            ToggleNametagDraw = @checked;
                        };
                        DebugMenu.Items.Add(debugItem);
                    }

                    {
                        var debugItem = new UIMenuCheckboxItem("Disable Position Update", TogglePosUpdate);
                        debugItem.CheckboxEvent += (sender, @checked) =>
                        {
                            TogglePosUpdate = @checked;
                        };
                        DebugMenu.Items.Add(debugItem);
                    }
                }
                #endregion

                var welcomeItem = new TabSubmenuItem("settings", new List <TabItem>()
                {
                    GeneralMenu,
                    ChatboxMenu,
                    //DisplayMenu,
                    //GraphicsMenu,
                    ExpMenu,
                    DebugMenu
                });
                MainMenu.AddTab(welcomeItem);
            }
            #endregion

            #region Quit
            {
                var welcomeItem = new TabTextItem("Quit", "Quit Cherry Multiplayer", "Are you sure you want to quit Cherry Multiplayer and return to desktop?")
                {
                    CanBeFocused = false
                };
                welcomeItem.Activated += (sender, args) =>
                {
                    if (Client != null && IsOnServer())
                    {
                        Client.Disconnect("Quit");
                    }
                    CEFManager.Dispose();
                    CEFManager.DisposeCef();
                    Script.Wait(500);
                    //Environment.Exit(0);
                    Process.GetProcessesByName("GTA5")[0].Kill();
                    Process.GetCurrentProcess().Kill();
                };
                MainMenu.Tabs.Add(welcomeItem);
            }
            #endregion

            #region Current Server Tab

            #region Players
            _serverPlayers = new TabItemSimpleList("Players", new Dictionary <string, string>());
            #endregion

            var favTab = new TabTextItem("Favorite", "Add to Favorites", "Add the current server to favorites.")
            {
                CanBeFocused = false
            };
            favTab.Activated += (sender, args) =>
            {
                var serb = _currentServerIp + ":" + _currentServerPort;
                AddToFavorites(_currentServerIp + ":" + _currentServerPort);
                var item = new UIMenuItem(serb)
                {
                    Description = serb
                };
                Util.Util.SafeNotify("Server added to favorites!");
                item.Activated += (faf, selectedItem) =>
                {
                    if (IsOnServer())
                    {
                        Client.Disconnect("Switching servers");

                        NetEntityHandler.ClearAll();

                        if (Npcs != null)
                        {
                            Npcs.ToList().ForEach(pair => pair.Value.Clear());
                            Npcs.Clear();
                        }

                        while (IsOnServer())
                        {
                            Script.Yield();
                        }
                    }

                    var splt = serb.Split(':');

                    if (splt.Length < 2)
                    {
                        return;
                    }
                    if (!int.TryParse(splt[1], out int port))
                    {
                        return;
                    }

                    ConnectToServer(splt[0], port);
                    MainMenu.TemporarilyHidden = true;
                    _connectTab.RefreshIndex();
                    AddServerToRecent(serb, "");
                };
                _favBrowser.Items.Add(item);
            };

            var dcItem = new TabTextItem("Disconnect", "Disconnect", "Disconnect from the current server.")
            {
                CanBeFocused = false
            };
            dcItem.Activated += (sender, args) =>
            {
                if (Client != null)
                {
                    Client.Disconnect("Quit");
                }
            };

            _statsItem = new TabTextItem("Statistics", "Network Statistics", "")
            {
                CanBeFocused = false
            };

            _serverItem = new TabSubmenuItem("server", new List <TabItem>()
            {
                _serverPlayers, favTab, _statsItem, dcItem
            })
            {
                Parent = MainMenu
            };
            #endregion

            MainMenu.RefreshIndex();
        }