Пример #1
0
 internal void UnloadMonsters(ushort Zone)
 {
     if (Zone == 0xffff)
     {
         foreach (var g in _fortressGates)
         {
             g.monster.Active = true;
             SetGateState(g.monster, true);
         }
     }
     else
     {
         MonsterIA.DelGroup(_baseGroup + Zone);
     }
 }
Пример #2
0
    void Awake()
    {
        _animator   = GetComponent <Animator>();
        _controller = GetComponent <CharacterController2D>();
        _ia         = GetComponent <MonsterIA>();
        _aSource    = GetComponent <AudioSource>();
        _player     = GameObject.Find("Player").GetComponent <PlayerBehavior>();

        _nextHit = Time.realtimeSinceStartup;

        // listen to some events for illustration purposes
        _controller.onControllerCollidedEvent += onControllerCollider;
        _controller.onTriggerEnterEvent       += onTriggerEnterEvent;
        _controller.onTriggerExitEvent        += onTriggerExitEvent;
        _controller.onTriggerStayEvent        += onTriggerStayEvent;
    }
Пример #3
0
        public override void OnTransition(KanturuBattleOfNightmareState NextState)
        {
            _manager.SendAll(new SKanturuStateChange
            {
                State         = _manager._state,
                btDetailState = (byte)NextState
            });

            switch (NextState)
            {
            case KanturuBattleOfNightmareState.None:
                break;

            case KanturuBattleOfNightmareState.Idle:
                _manager.WarpAllTo(134);
                Trigger(KanturuBattleOfNightmareState.Notify, TimeSpan.FromSeconds(5));
                break;

            case KanturuBattleOfNightmareState.Notify:
                Trigger(KanturuBattleOfNightmareState.Start, TimeSpan.FromSeconds(10));
                _manager.SendAll(new SNotice(NoticeType.Gold, ServerMessages.GetMessage(Messages.Kanturu_NightmareNotify)));
                break;

            case KanturuBattleOfNightmareState.Start:
            {
                _manager.LoadScene(2);
                MonsterIA.InitGroup(23, DieMonster);
                var mob = MonstersMng.Instance.Monsters.FirstOrDefault(x => x.Info.Monster == 361);
                _nightmare           = new PatternManager(mob, Program.XMLConfiguration.Files.NightmarePatterns);
                _nightmare.UseSkill += _nightmare_UseSkill;
                _manager.FailState   = true;
                Trigger(KanturuBattleOfNightmareState.End, TimeSpan.FromSeconds(1200));
                _manager.SendAll(new SKanturuBattleTime {
                        BattleTime = (int)TimeLeft.TotalSeconds
                    });
            }
            break;

            case KanturuBattleOfNightmareState.End:
                _nightmare = null;
                MonsterIA.DelGroup(23);
                _logger.Information("Battle result:{0}", _manager.FailState?"Fail":"Win");
                _manager.SendAll(new SKanturuBattleResult {
                    Result = (byte)(_manager.FailState ? 0 : 1)
                });
                Trigger(KanturuBattleOfNightmareState.EndCycle, TimeSpan.FromSeconds(5));
                break;

            case KanturuBattleOfNightmareState.EndCycle:
                if (_manager.FailState)
                {
                    _manager.Clear();
                }
                else
                {
                    _manager._towerOfRefinement.Initialize();
                    _manager.Trigger(EventState.Closed);
                }
                Trigger(KanturuBattleOfNightmareState.None);
                break;
            }
        }
Пример #4
0
        public override void OnTransition(KanturuBattleOfMayaState NextState)
        {
            _manager.SendAll(new SKanturuStateChange {
                State         = _manager._state,
                btDetailState = (byte)NextState
            });

            if (NextState == KanturuBattleOfMayaState.EndCycle1 ||
                NextState == KanturuBattleOfMayaState.EndCycle2 ||
                NextState == KanturuBattleOfMayaState.EndCycle3)
            {
                var str = ServerMessages.GetMessage(Messages.Kanturu_NextBattle);
                Program.MapAnoucement(Maps.Kantru1, str).Wait();
                Program.MapAnoucement(Maps.Kantru2, str).Wait();
                Program.MapAnoucement(Maps.Kantru3, str).Wait();
            }

            switch (NextState)
            {
            // Battle Stage 1
            case KanturuBattleOfMayaState.StandBy1:
                Trigger(KanturuBattleOfMayaState.Notify1, TimeSpan.FromSeconds(120));
                break;

            case KanturuBattleOfMayaState.Notify1:
                if (!_manager.CanRun())
                {
                    _manager.FailState = true;
                    Trigger(KanturuBattleOfMayaState.End);
                    return;
                }

                Trigger(KanturuBattleOfMayaState.Start1, TimeSpan.FromSeconds(15));
                break;

            case KanturuBattleOfMayaState.Start1:
                _manager.LoadScene(0);
                Trigger(KanturuBattleOfMayaState.End1, TimeSpan.FromSeconds(900));
                _manager.SendAll(new SKanturuBattleTime {
                    BattleTime = (int)TimeLeft.TotalMilliseconds
                });
                break;

            case KanturuBattleOfMayaState.Maya1:
            {
                _LeftHand  = false;
                _RightHand = false;
                _manager.LoadScene(3);
                MonsterIA.InitGroup(20, DieMonster);
                var h1 = MonstersMng.Instance.Monsters.FirstOrDefault(x => x.Info.Monster == 363 || x.Info.Monster == 362);
                _hand1           = new PatternManager(h1, Program.XMLConfiguration.Files.MayaLeftHandPatterns);
                _hand1.UseSkill += _hand_UseSkill;
            }
            break;

            case KanturuBattleOfMayaState.End1:
                _hand1.UseSkill -= _hand_UseSkill;
                _hand1           = null;
                MonsterIA.DelGroup(20);
                if (_manager.MonsterCount() > 1 || !_LeftHand)
                {
                    _manager.FailState = true;
                    Trigger(KanturuBattleOfMayaState.End);
                    return;
                }
                Trigger(KanturuBattleOfMayaState.EndCycle1, TimeSpan.FromSeconds(5));
                break;

            case KanturuBattleOfMayaState.EndCycle1:
            {
                Trigger(KanturuBattleOfMayaState.StandBy2, TimeSpan.FromSeconds(3));
            }
            break;

            // Battle Stage 2
            case KanturuBattleOfMayaState.StandBy2:
                Trigger(KanturuBattleOfMayaState.Start2, TimeSpan.FromSeconds(60));
                break;

            case KanturuBattleOfMayaState.Start2:
                _manager.LoadScene(0);
                Trigger(KanturuBattleOfMayaState.End2, TimeSpan.FromSeconds(900));
                _manager.SendAll(new SKanturuBattleTime {
                    BattleTime = (int)TimeLeft.TotalMilliseconds
                });
                break;

            case KanturuBattleOfMayaState.Maya2:
            {
                _LeftHand  = false;
                _RightHand = false;
                MonsterIA.InitGroup(21, DieMonster);
                _manager.LoadScene(4);
                var h1 = MonstersMng.Instance.Monsters.FirstOrDefault(x => x.Info.Monster == 363 || x.Info.Monster == 362);
                _hand2           = new PatternManager(h1, Program.XMLConfiguration.Files.MayaRightHandPatterns);
                _hand2.UseSkill += _hand_UseSkill;
            }
            break;

            case KanturuBattleOfMayaState.End2:
                _hand2.UseSkill -= _hand_UseSkill;
                _hand2           = null;
                MonsterIA.DelGroup(21);
                if (_manager.MonsterCount() > 1 || !_RightHand)
                {
                    _manager.FailState = true;
                    Trigger(KanturuBattleOfMayaState.End);
                    return;
                }
                Trigger(KanturuBattleOfMayaState.EndCycle2, TimeSpan.FromSeconds(5));
                break;

            case KanturuBattleOfMayaState.EndCycle2:
                Trigger(KanturuBattleOfMayaState.StandBy3, TimeSpan.FromSeconds(3));
                break;

            // Battle Stage 3
            case KanturuBattleOfMayaState.StandBy3:
                Trigger(KanturuBattleOfMayaState.Start3, TimeSpan.FromSeconds(60));
                break;

            case KanturuBattleOfMayaState.Start3:
                _manager.LoadScene(1);
                Trigger(KanturuBattleOfMayaState.End3, TimeSpan.FromSeconds(900));
                _manager.SendAll(new SKanturuBattleTime {
                    BattleTime = (int)TimeLeft.TotalMilliseconds
                });
                break;

            case KanturuBattleOfMayaState.Maya3:
            {
                _LeftHand  = false;
                _RightHand = false;
                MonsterIA.InitGroup(22, DieMonster);
                _manager.LoadScene(5);
                var h1 = MonstersMng.Instance.Monsters.FirstOrDefault(x => x.Info.Monster == 362);
                var h2 = MonstersMng.Instance.Monsters.FirstOrDefault(x => x.Info.Monster == 363);
                _hand1           = new PatternManager(h1, Program.XMLConfiguration.Files.MayaLeftHandPatterns);
                _hand2           = new PatternManager(h2, Program.XMLConfiguration.Files.MayaRightHandPatterns);
                _hand1.UseSkill += _hand_UseSkill;
                _hand2.UseSkill += _hand_UseSkill;
            }
            break;

            case KanturuBattleOfMayaState.End3:
                _hand1.UseSkill -= _hand_UseSkill;
                _hand2.UseSkill -= _hand_UseSkill;
                _hand1           = null;
                _hand2           = null;
                MonsterIA.DelGroup(22);
                if (_manager.MonsterCount() > 1 || !_LeftHand || !_RightHand)
                {
                    _manager.FailState = true;
                    Trigger(KanturuBattleOfMayaState.End);
                    return;
                }
                Trigger(KanturuBattleOfMayaState.EndCycle3, TimeSpan.FromSeconds(5));
                break;

            case KanturuBattleOfMayaState.EndCycle3:
                Trigger(KanturuBattleOfMayaState.End, TimeSpan.FromSeconds(3));
                break;

            case KanturuBattleOfMayaState.End:
                Trigger(KanturuBattleOfMayaState.EndCycle, TimeSpan.FromSeconds(3));
                if (_manager.FailState)
                {
                    _manager.SendAll(new SNotice(NoticeType.Gold, ServerMessages.GetMessage(Messages.Kanturu_Fail)));
                }
                break;

            case KanturuBattleOfMayaState.EndCycle:
                if (!_manager.FailState)
                {
                    _manager._battleOfNightmare.Initialize();
                }
                else
                {
                    _manager.Trigger(EventState.Open);
                }
                Trigger(KanturuBattleOfMayaState.None);
                break;
            }
        }
Пример #5
0
 internal void LoadMonsters(ushort Zone)
 {
     _activeMobs = MonsterIA.InitGroup(_baseGroup + Zone, OnMonsterDead);
     StandBy(Zone, false);
 }
Пример #6
0
        public override void Update()
        {
            base.Update();
            switch (CurrentState)
            {
            case EventState.Open:
                if (_players.Where(x => x.Eventer).Count() <= 0)
                {
                    break;
                }
                Trigger(EventState.Playing);
                break;

            case EventState.Playing:
                if (_players.Where(x => x.Eventer).Count() == 0)
                {
                    Trigger(EventState.Open);
                    return;
                }
                switch (_subState)
                {
                case FortressSubState.Phaze1:
                case FortressSubState.Phaze2:
                case FortressSubState.Phaze3:
                case FortressSubState.Phaze4:
                    var ts = _subStateEnd - DateTime.Now;
                    if (_lastNotify != (int)ts.TotalMinutes)
                    {
                        _lastNotify = (int)ts.TotalMinutes;
                        _           = Program.MapAnoucement((Maps)_map.Map, $"Portal will be closed after {_lastNotify} minutes");
                        _           = _map.SendAsync(_eventState);
                    }

                    foreach (var t in _traps)
                    {
                        foreach (var p in _players.Where(x => x.Eventer))
                        {
                            if (t.Position.Substract(p.Player.Character.Position).LengthSquared() <= 5)
                            {
                                DamageType dmg;
                                Spell      spell;

                                var att = t.MonsterAttack(out dmg, out spell);
                                _ = p.Player.Character.GetAttacked(t.Index, t.Direction, 120, att, dmg, spell);
                            }
                        }
                    }

                    break;
                }

                if (_subStateEnd <= DateTime.Now)
                {
                    if (_subState == FortressSubState.End)
                    {
                        _subState = FortressSubState.None;
                        Trigger(EventState.Open);
                        return;
                    }
                    _logger.Information("Fortress state {0}->{1}", _subState++, _subState);
                    switch (_subState)
                    {
                    case FortressSubState.None:
                        _subStateEnd = DateTime.Now;
                        break;

                    case FortressSubState.StandBy1:
                        _subStateEnd = DateTime.Now.AddMinutes(1);
                        foreach (var g in _fortressGates)
                        {
                            g.monster.Active = true;
                        }
                        _eventState.State = 1;
                        break;

                    case FortressSubState.Phaze1:
                        _subStateEnd = DateTime.Now.AddMinutes(10);
                        _fortressGates[0].monster.Type = ObjectType.Gate;
                        _activeMobs = MonsterIA.Group(_baseGroup, true, OnMonsterDead);
                        break;

                    case FortressSubState.Standby2:
                        _subStateEnd = DateTime.Now.AddMinutes(3);
                        MonsterIA.Group(_baseGroup, false, OnMonsterDead);
                        _eventState.State = 2;
                        break;

                    case FortressSubState.Phaze2:
                        _subStateEnd = DateTime.Now.AddMinutes(10);
                        _fortressGates[3].monster.Type = ObjectType.Gate;
                        _activeMobs = MonsterIA.Group(_baseGroup + 1, true, OnMonsterDead);
                        break;

                    case FortressSubState.StandBy3:
                        _subStateEnd = DateTime.Now.AddMinutes(3);
                        MonsterIA.Group(_baseGroup + 1, false, OnMonsterDead);
                        _eventState.State = 3;
                        break;

                    case FortressSubState.Phaze3:
                        _subStateEnd = DateTime.Now.AddMinutes(10);
                        _fortressGates[6].monster.Type = ObjectType.Gate;
                        _activeMobs = MonsterIA.Group(_baseGroup + 2, true, OnMonsterDead);
                        break;

                    case FortressSubState.StandBy4:
                        if (_eventDay != (DayOfWeek)7)
                        {
                            _subState = FortressSubState.End;
                        }

                        _subStateEnd = DateTime.Now.AddMinutes(3);
                        MonsterIA.Group(_baseGroup + 2, false, OnMonsterDead);
                        _eventState.State = 4;
                        break;

                    case FortressSubState.Phaze4:
                        _subStateEnd = DateTime.Now.AddMinutes(10);
                        _fortressGates[9].monster.Type = ObjectType.Gate;
                        _activeMobs = MonsterIA.Group(_baseGroup + 3, true, OnMonsterDead);
                        break;

                    case FortressSubState.End:
                        _subStateEnd = DateTime.Now.AddMinutes(3);
                        MonsterIA.Group(_baseGroup + 2, false, OnMonsterDead);
                        MonsterIA.Group(_baseGroup + 3, false, OnMonsterDead);
                        break;
                    }
                    _ = _map.SendAsync(_eventState);
                }
                break;
            }
        }
Пример #7
0
        static void Main(string[] args)
        {
            Predicate <GSSession> MustNotBeLoggedIn     = session => session.Player.Status == LoginStatus.NotLogged;
            Predicate <GSSession> MustBeLoggedIn        = session => session.Player.Status == LoginStatus.Logged;
            Predicate <GSSession> MustBePlaying         = session => session.Player.Status == LoginStatus.Playing;
            Predicate <GSSession> MustBeLoggedOrPlaying = session => session.Player.Status == LoginStatus.Logged || session.Player.Status == LoginStatus.Playing;
            Predicate <GSSession> MustBeGameMaster      = session => (session.Player.Character.CtlCode & ControlCode.GameMaster) != 0;

            string output = "{Timestamp: HH:mm:ss} [{Level} {SourceContext}][{AID}:{AUser}] {Message}{NewLine}{Exception}";

            Log.Logger = new LoggerConfiguration()
                         .Destructure.ByTransforming <IPEndPoint>(endPoint => endPoint.ToString())
                         .Destructure.ByTransforming <EndPoint>(endPoint => endPoint.ToString())
                         .WriteTo.File("GameServer_.txt", outputTemplate: output, rollingInterval: RollingInterval.Day)
                         .WriteTo.Console(outputTemplate: output)
                         .MinimumLevel.Debug()
                         .CreateLogger();

            ServerMessages = new ServerMessages();
            ServerMessages.LoadMessages("./Data/Lang/ServerMessages(es).xml");

            if (!File.Exists("./Server.xml"))
            {
                Log.Logger.Error(ServerMessages.GetMessage(Messages.Server_Cfg));
                ResourceLoader.XmlSaver("./Server.xml", new ServerInfoDto());
                Task.Delay(10000);
                return;
            }

            var xml = ResourceLoader.XmlLoader <ServerInfoDto>("./Server.xml");

            ServerMessages.LoadMessages($"./Data/Lang/ServerMessages({xml.Lang}).xml");

            Console.Title = ServerMessages.GetMessage(Messages.Server_Title, xml.Code, xml.Name, xml.Version, xml.Serial, xml.DataBase);

            ConnectionString = $"Server={xml.DBIp};port=3306;Database={xml.DataBase};user={xml.BDUser};password={xml.DBPassword};Convert Zero Datetime=True;";

            SimpleModulus.LoadDecryptionKey("./Data/Dec1.dat");
            SimpleModulus.LoadEncryptionKey("./Data/Enc2.dat");
            byte[] key = { 0x44, 0x9D, 0x0F, 0xD0, 0x37, 0x22, 0x8F, 0xCB, 0xED, 0x0D, 0x37, 0x04, 0xDE, 0x78, 0x00, 0xE4, 0x33, 0x86, 0x20, 0xC2, 0x79, 0x35, 0x92, 0x26, 0xD4, 0x37, 0x37, 0x30, 0x98, 0xEF, 0xA4, 0xDE };
            PacketEncrypt.Initialize(key);

            var ip   = new IPEndPoint(IPAddress.Parse(xml.IP), xml.Port);
            var csIP = new IPEndPoint(IPAddress.Parse(xml.ConnectServerIP), 44405);

            AutoRegistre = xml.AutoRegistre;
            ServerCode   = (ushort)xml.Code;
            Experience   = xml.Experience;
            Zen          = xml.Zen;
            DropRate     = xml.DropRate;
            Season       = xml.Season;

            var mh = new MessageHandler[] {
                new FilteredMessageHandler <GSSession>()
                .AddHandler(new AuthServices())
                .AddHandler(new GlobalServices())
                .AddHandler(new GameServices())
                .AddHandler(new CashShopServices())
                .AddHandler(new EventServices())
                .AddHandler(new QuestSystemServices())
                .AddHandler(new GuildServices())
                .AddHandler(new AntiHackServices())
                .AddHandler(new PCPShopServices())
                .AddHandler(new GensServices())
                .RegisterRule <CIDAndPass>(MustNotBeLoggedIn)
                .RegisterRule <CCharacterList>(MustBeLoggedIn)
                .RegisterRule <CCharacterMapJoin>(MustBeLoggedIn)
                .RegisterRule <CCharacterMapJoin2>(MustBeLoggedIn)
                .RegisterRule <CCloseWindow>(MustBePlaying)
                .RegisterRule <CDataLoadOK>(MustBePlaying)
                .RegisterRule <CAction>(MustBePlaying)
                .RegisterRule <SSkillKey>(MustBePlaying)
            };
            var mf = new MessageFactory[]
            {
                new AuthMessageFactory(),
                new GlobalMessageFactory(),
                new GameMessageFactory(),
                new CashShopMessageFactory(),
                new EventMessageFactory(),
                new QuestSystemMessageFactory(),
                new GuildMessageFactory(),
                new AntiHackMessageFactory(),
                new PCPShopMessageFactory(),
                new GensMessageFactory(),
            };

            server = new WZGameServer(ip, mh, mf, xml.Rijndael);
            server.ClientVersion = xml.Version;
            server.ClientSerial  = xml.Serial;

            var cmh = new MessageHandler[]
            {
                new FilteredMessageHandler <CSClient>()
                .AddHandler(new CSServices())
            };

            var cmf = new MessageFactory[]
            {
                new CSMessageFactory()
            };

            try
            {
                ResourceCache.Initialize(".\\Data");
                // Event Config
                EventConfig(xml);
                MonstersMng.Initialize();
                MonstersMng.Instance.LoadMonster("./Data/Monsters/Monster");
                MonsterIA.Initialize("./Data/Monsters/");
                EventInitialize();

                MapServerManager.Initialize("./Data/MapServer.xml");
                MonstersMng.Instance.LoadSetBase("./Data/" + xml.MonsterSetBase);
                GuildManager.Initialize();
                PartyManager.Initialzie(400);
                DuelSystem.Initialize();
                SubSystem.Initialize();
                Marlon.Initialize();
            }catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                Log.Error(ex, ServerMessages.GetMessage(Messages.Server_MySQL_Error));
                //Migrate(null, new EventArgs());
                //Log.Information("Server needs restart to reload all changes");
                Task.Delay(10000);
            }
            catch (Exception ex)
            {
                Log.Error(ex, ServerMessages.GetMessage(Messages.Server_Error));
            }

            try
            {
                client = new CSClient(csIP, cmh, cmf, (ushort)xml.Code, server, (byte)xml.Show, xml.APIKey);
            }catch (Exception)
            {
                Log.Error(ServerMessages.GetMessage(Messages.Server_CSServer_Error));
            }

            Log.Information(ServerMessages.GetMessage(Messages.Server_Disconnecting_Accounts));
            try
            {
                using (var db = new GameContext())
                {
                    var accs = from acc in db.Accounts
                               where acc.IsConnected && acc.ServerCode == xml.Code
                               select acc;

                    foreach (var acc in accs)
                    {
                        acc.IsConnected = false;
                    }

                    db.Accounts.UpdateRange(accs);
                    db.SaveChanges();
                }
            }catch (Exception)
            {
                Log.Error("MySQL unavailable. please use \"db create\" or \"db migrate\" command");
                Task.Delay(15000);
            }

            Log.Information(ServerMessages.GetMessage(Messages.Server_Ready));

            Handler.AddCommand(new Command <GSSession>("exit", Close, autority: MustBeGameMaster))
            .AddCommand(new Command <GSSession>("quit", Close, autority: MustBeGameMaster))
            .AddCommand(new Command <GSSession>("stop", Close, autority: MustBeGameMaster))
            .AddCommand(new Command <GSSession>("reload", autority: MustBeGameMaster)
                        .AddCommand(new Command <GSSession>("shops", (object a, CommandEventArgs b) => ResourceCache.Instance.ReloadShops()))
                        .AddCommand(new Command <GSSession>("gates", (object a, CommandEventArgs b) => ResourceCache.Instance.ReloadGates())))
            .AddCommand(new Command <GSSession>("create", autority: MustBeGameMaster)
                        .AddCommand(new Command <GSSession>("movereq", DumpMoveReq)))
            .AddCommand(new Command <GSSession>("db", autority: MustBeGameMaster)
                        .AddCommand(new Command <GSSession>("migrate", Migrate))
                        .AddCommand(new Command <GSSession>("create", Create))
                        .AddCommand(new Command <GSSession>("delete", Delete)))
            .AddCommand(new Command <GSSession>("!", (object a, CommandEventArgs b) => GlobalAnoucement(b.Argument).Wait(), MustBeGameMaster).SetPartial())
            .AddCommand(new Command <GSSession>("/").SetPartial()
                        .AddCommand(new Command <GSSession>("add").SetPartial()
                                    .AddCommand(new Command <GSSession>("str", Character.AddStr))
                                    .AddCommand(new Command <GSSession>("agi", Character.AddAgi))
                                    .AddCommand(new Command <GSSession>("vit", Character.AddVit))
                                    .AddCommand(new Command <GSSession>("ene", Character.AddEne))
                                    .AddCommand(new Command <GSSession>("cmd", Character.AddCmd)))
                        .AddCommand(new Command <GSSession>("set", autority: MustBeGameMaster)
                                    .AddCommand(new Command <GSSession>("hp", (object a, CommandEventArgs b) => ((GSSession)a).Player.Character.Health = float.Parse(b.Argument)))
                                    .AddCommand(new Command <GSSession>("zen", (object a, CommandEventArgs b) => ((GSSession)a).Player.Character.Money = uint.Parse(b.Argument))
                                                .AddCommand(new Command <GSSession>("exp", (object a, CommandEventArgs b) => ((GSSession)a).Player.Character.Experience = uint.Parse(b.Argument)))))
                        .AddCommand(new Command <GSSession>("levelup", LevelUp, MustBeGameMaster)))
            .AddCommand(new Command <GSSession>("#", PostCommand).SetPartial())   //Post
            //.AddCommand(new Command<GSSession>("~").SetPartial())
            /*.AddCommand(new Command<GSSession>("]").SetPartial())*/;

            while (true)
            {
                var input = Console.ReadLine();
                if (input == null)
                {
                    break;
                }

                Handler.ProcessCommands(null, input);
            }
        }