private void SetSplitList()
        {
            var aslSettings = new ASLSettings();

            aslSettings.AddBasicSetting("resethardware");
            aslSettings.AddBasicSetting("debug");
            if (_autostart != null)
            {
                aslSettings.AddBasicSetting("start");
            }
            if (_game.Splits.Count > 0)
            {
                aslSettings.AddBasicSetting("split");
            }

            _splits.Clear();
            foreach (Split split in _game.Splits)
            {
                aslSettings.AddSetting(split.Name, split.Active || split.IsCategory(), split.Description, null);
                if (!split.IsCategory())
                {
                    _splits.AddRange(Enumerable.Repeat(split, split.Repeat + 1).ToList());
                }
                else
                {
                    foreach (Split s in split.Splits)
                    {
                        _splits.AddRange(Enumerable.Repeat(s, s.Repeat + 1).ToList());
                        aslSettings.AddSetting(s.Name, s.Active, s.Description, split.Name);
                    }
                }
            }

            _aslSettings = aslSettings;
            _settings.SetASLSettings(aslSettings);
        }
Esempio n. 2
0
        private void InitASLSettings(ASLSettings settings, bool script_loaded)
        {
            if (string.IsNullOrWhiteSpace(ScriptPath))
            {
                _basic_settings_state.Clear();
                _custom_settings_state.Clear();
            }

            this.treeCustomSettings.BeginUpdate();
            this.treeCustomSettings.Nodes.Clear();

            var values = new Dictionary <string, bool>();

            // Store temporary for easier lookup of parent nodes
            var flat = new Dictionary <string, TreeNode>();

            foreach (ASLSetting setting in settings.OrderedSettings)
            {
                var value = setting.Value;
                if (_custom_settings_state.ContainsKey(setting.Id))
                {
                    value = _custom_settings_state[setting.Id];
                }

                var node = new TreeNode(setting.Label)
                {
                    Tag              = setting,
                    Checked          = value,
                    ContextMenuStrip = this.treeContextMenu2,
                    ToolTipText      = setting.ToolTip
                };
                setting.Value = value;

                if (setting.Parent == null)
                {
                    this.treeCustomSettings.Nodes.Add(node);
                }
                else if (flat.ContainsKey(setting.Parent))
                {
                    flat[setting.Parent].Nodes.Add(node);
                    flat[setting.Parent].ContextMenuStrip = this.treeContextMenu;
                }

                flat.Add(setting.Id, node);
                values.Add(setting.Id, value);
            }

            // Gray out deactivated nodes after all have been added
            foreach (var item in flat)
            {
                if (!item.Value.Checked)
                {
                    UpdateGrayedOut(item.Value);
                }
            }

            // Only if a script was actually loaded, update current state with current ASL settings
            // (which may be empty if the successfully loaded script has no settings, but shouldn't
            // be empty because the script failed to load, which can happen frequently when working
            // on ASL scripts)
            if (script_loaded)
            {
                _custom_settings_state = values;
            }

            treeCustomSettings.ExpandAll();
            treeCustomSettings.EndUpdate();

            // Scroll up to the top
            if (this.treeCustomSettings.Nodes.Count > 0)
            {
                this.treeCustomSettings.Nodes[0].EnsureVisible();
            }

            UpdateCustomSettingsVisibility();
            InitBasicSettings(settings);
        }
Esempio n. 3
0
 /// <summary>
 /// Populates the component with the settings defined in the ASL script.
 /// </summary>
 public void SetASLSettings(ASLSettings settings)
 {
     InitASLSettings(settings, true);
 }
Esempio n. 4
0
        public FzzyComponent(LiveSplitState state)
        {
            Settings    = new FzzySettings();
            this.state  = state;
            s           = state;
            aslSettings = new ASLSettings();
            aslSettings.AddSetting("flagSplit", false,
                                   "Start timer on flag pickup, split on flag capture, and pause when not holding flag", null);
            aslSettings.AddSetting("frontierWaveSplit", false, "Split on wave change in frontier defense", null);
            aslSettings.AddSetting("levelChangeSplit", true, "Split on level change", null);

            aslSettings.AddSetting("endSplit", true, "Split at the end of escape (end of run)", null);
            aslSettings.AddSetting("removeLoads", true, "Remove Loads", null);

            aslSettings.AddSetting("subSplits", false, "Subsplits", null);

            aslSettings.AddSetting("btSplits", true, "BT-7274", "subSplits");
            aslSettings.AddSetting("btBattery1", true, "Split on first battery", "btSplits");
            aslSettings.AddSetting("btBattery2", true, "Split on second battery", "btSplits");

            aslSettings.AddSetting("bnrSplits", true, "Blood & Rust", "subSplits");
            aslSettings.AddSetting("bnrButton1", true, "Split on first button", "bnrSplits");
            aslSettings.AddSetting("bnrDoor", true, "Split at door", "bnrSplits");
            aslSettings.AddSetting("bnrButton2", true, "Split on second button", "bnrSplits");
            aslSettings.AddSetting("bnrEmbark", true, "Split on embark BT", "bnrSplits");

            aslSettings.AddSetting("ita3Splits", true, "Into the Abyss 3 Embark", "subSplits");

            aslSettings.AddSetting("enc1Splits", true, "Effect & Cause 1 Cutscene", "subSplits");

            aslSettings.AddSetting("enc2Splits", true, "Effect & Cause 2", "subSplits");
            aslSettings.AddSetting("enc2Button1", true, "Split on button 1", "enc2Splits");
            aslSettings.AddSetting("enc2Button2", true, "Split on button 2", "enc2Splits");
            aslSettings.AddSetting("enc2Dialogue", true, "Split during second dialogue", "enc2Splits");
            aslSettings.AddSetting("enc2Hellroom", true, "Split at hellroom entrance", "enc2Splits");
            aslSettings.AddSetting("enc2Vent", true, "Split at the bottom of the end vents", "enc2Splits");

            aslSettings.AddSetting("b2Splits", true, "The Beacon 2", "subSplits");
            aslSettings.AddSetting("b2Warp", true, "Split on death warp", "b2Splits");
            aslSettings.AddSetting("b2Button1", true, "Split on first button", "b2Splits");
            aslSettings.AddSetting("b2Trigger", true, "Split when you touch heatsink trigger", "b2Splits");

            aslSettings.AddSetting("b3Splits", true, "The Beacon 3", "subSplits");
            aslSettings.AddSetting("b3Module1", true, "Split on retrieve module", "b3Splits");
            aslSettings.AddSetting("b3Module2", true, "Split on insert module", "b3Splits");
            aslSettings.AddSetting("b3SecureBeacon", true, "Split on secure beacon objective", "b3Splits");

            aslSettings.AddSetting("tbfSplits", true, "Trial by Fire", "subSplits");
            aslSettings.AddSetting("tbfPilotWithMe", false, "Split on \"Pilot you're with me\" dialog", "tbfSplits");
            aslSettings.AddSetting("tbfElevator", true, "Split on Elevator", "tbfSplits");

            aslSettings.AddSetting("arkSplits", true, "The Ark", "subSplits");
            aslSettings.AddSetting("arkElevator", true, "Split when the elevator starts going up", "arkSplits");
            aslSettings.AddSetting("arkKnife", true, "Split when you start data knife cutscene", "arkSplits");

            aslSettings.AddSetting("foldSplits", true, "The Fold Weapon", "subSplits");
            aslSettings.AddSetting("foldDataCore", true, "Split when you insert the data core", "foldSplits");
            aslSettings.AddSetting("foldEscape", true, "Split when escape starts", "foldSplits");

            aslSettings.AddSetting("miscSettings", false, "Misc. Settings", null);
            aslSettings.AddSetting("speedmod", false, "Speedmod", "miscSettings");
            aslSettings.AddSetting("BnRpause", false, "Blood and Rust IL pause", "miscSettings");
            aslSettings.AddSetting("enc3pause", false, "Effect & Cause 3 IL pause", "miscSettings");
            aslSettings.AddSetting("loadReset", false, "Reset after load screens", "miscSettings");
            aslSettings.AddSetting("cheatsTimerLink", false, "Tie sv_cheats with if the timer is started or not",
                                   "miscSettings");
            aslSettings.AddSetting("tickTimer", false, "Tick-based Timer", "miscSettings");
            aslSettings.AddSetting("levelTimer", false, "Level-based Timer", "tickTimer");

            aslSettings.AddSetting("helmetSplit", false, "Helmet splits", null);

            // the ordering of these is a bit wack because the sp_unlocks_level_x convar order of bits storing helmets is a bit arbitrary
            // "levelHelmetX" is the order of how they're stored in the bits, the setting name "Helmet X" is ordered after when you collect each helmet in the run
            aslSettings.AddSetting("gauntletHelmetSplit", true, "Gauntlet", "helmetSplit");
            aslSettings.AddSetting("btHelmetSplit", true, "BT-7274", "helmetSplit");
            aslSettings.AddSetting("btHelmet1", true, "Helmet 1", "btHelmetSplit");
            aslSettings.AddSetting("btHelmet2", true, "Helmet 2", "btHelmetSplit");

            aslSettings.AddSetting("bnrHelmetSplit", true, "Blood & Rust", "helmetSplit");
            aslSettings.AddSetting("bnrHelmet2", true, "Helmet 1", "bnrHelmetSplit");
            aslSettings.AddSetting("bnrHelmet1", true, "Helmet 2", "bnrHelmetSplit");
            aslSettings.AddSetting("bnrHelmet6", true, "Helmet 3", "bnrHelmetSplit");
            aslSettings.AddSetting("bnrHelmet5", true, "Helmet 4", "bnrHelmetSplit");
            aslSettings.AddSetting("bnrHelmet4", true, "Helmet 5", "bnrHelmetSplit");
            aslSettings.AddSetting("bnrHelmet3", true, "Helmet 6", "bnrHelmetSplit");

            aslSettings.AddSetting("ita1HelmetSplit", true, "Into the Abyss 1", "helmetSplit");
            aslSettings.AddSetting("ita1Helmet2", true, "Helmet 1", "ita1HelmetSplit");
            aslSettings.AddSetting("ita1Helmet1", true, "Helmet 2", "ita1HelmetSplit");
            aslSettings.AddSetting("ita1Helmet3", true, "Helmet 3", "ita1HelmetSplit");
            aslSettings.AddSetting("ita1Helmet4", true, "Helmet 4", "ita1HelmetSplit");

            aslSettings.AddSetting("ita2HelmetSplit", false, "Into the Abyss 2", "helmetSplit");
            aslSettings.AddSetting("ita2Helmet1", false, "Helmet 1", "ita2HelmetSplit");
            aslSettings.AddSetting("ita2Helmet2", false, "Helmet 2", "ita2HelmetSplit");
            aslSettings.AddSetting("ita2Helmet3", false, "Helmet 3", "ita2HelmetSplit");

            aslSettings.AddSetting("ita3HelmetSplit", true, "Into the Abyss 3", "helmetSplit");
            aslSettings.AddSetting("ita3Helmet1", true, "Helmet 1", "ita3HelmetSplit");
            aslSettings.AddSetting("ita3Helmet2", true, "Helmet 2", "ita3HelmetSplit");

            aslSettings.AddSetting("enc1HelmetSplit", false, "Effect & Cause 1/3", "helmetSplit");
            aslSettings.AddSetting("enc1Helmet2", false, "Helmet 1", "enc1HelmetSplit");
            aslSettings.AddSetting("enc1Helmet1", false, "Helmet 2", "enc1HelmetSplit");

            aslSettings.AddSetting("enc2HelmetSplit", true, "Effect & Cause 2", "helmetSplit");
            aslSettings.AddSetting("enc2Helmet2", true, "Helmet 1", "enc2HelmetSplit");
            aslSettings.AddSetting("enc2Helmet5", true, "Helmet 2", "enc2HelmetSplit");
            aslSettings.AddSetting("enc2Helmet1", true, "Helmet 3", "enc2HelmetSplit");
            aslSettings.AddSetting("enc2Helmet4", true, "Helmet 4", "enc2HelmetSplit");
            aslSettings.AddSetting("enc2Helmet3", true, "Helmet 5", "enc2HelmetSplit");
            aslSettings.AddSetting("enc2Helmet6", true, "Helmet 6", "enc2HelmetSplit");

            aslSettings.AddSetting("b1HelmetSplit", true, "The Beacon 1/3", "helmetSplit");
            aslSettings.AddSetting("b1Helmet8", true, "Helmet 1", "b1HelmetSplit");
            aslSettings.AddSetting("b1Helmet7", true, "Helmet 2", "b1HelmetSplit");
            aslSettings.AddSetting("b1Helmet4", true, "Helmet 3", "b1HelmetSplit");
            aslSettings.AddSetting("b1Helmet2", true, "Helmet 4", "b1HelmetSplit");
            aslSettings.AddSetting("b1Helmet3", true, "Helmet 5", "b1HelmetSplit");
            aslSettings.AddSetting("b1Helmet1", true, "Helmet 6", "b1HelmetSplit");
            aslSettings.AddSetting("b1Helmet9", true, "Helmet 7", "b1HelmetSplit");
            aslSettings.AddSetting("b1Helmet6", true, "Helmet 8", "b1HelmetSplit");
            aslSettings.AddSetting("b1Helmet5", true, "Helmet 9", "b1HelmetSplit");

            aslSettings.AddSetting("b2HelmetSplit", true, "The Beacon 2", "helmetSplit");
            aslSettings.AddSetting("b2Helmet2", true, "Helmet 1", "b2HelmetSplit");
            aslSettings.AddSetting("b2Helmet1", true, "Helmet 2", "b2HelmetSplit");

            aslSettings.AddSetting("tbfHelmetSplit", true, "Trial by Fire", "helmetSplit");
            aslSettings.AddSetting("tbfHelmet3", true, "Helmet 1", "tbfHelmetSplit");
            aslSettings.AddSetting("tbfHelmet2", true, "Helmet 2", "tbfHelmetSplit");
            aslSettings.AddSetting("tbfHelmet1", true, "Helmet 3", "tbfHelmetSplit");

            aslSettings.AddSetting("arkHelmetSplit", true, "The Ark", "helmetSplit");
            aslSettings.AddSetting("arkHelmet3", true, "Helmet 1", "arkHelmetSplit");
            aslSettings.AddSetting("arkHelmet1", true, "Helmet 2", "arkHelmetSplit");
            aslSettings.AddSetting("arkHelmet2", true, "Helmet 3", "arkHelmetSplit");

            aslSettings.AddSetting("foldHelmetSplit", true, "The Fold Weapon", "helmetSplit");
            aslSettings.AddSetting("foldHelmet3", true, "Helmet 1", "foldHelmetSplit");
            aslSettings.AddSetting("foldHelmet2", true, "Helmet 2", "foldHelmetSplit");
            aslSettings.AddSetting("foldHelmet1", true, "Helmet 3", "foldHelmetSplit");

            Settings.InitASLSettings(aslSettings);

            values["radioSpeaking"] = new MemoryValue("int", new DeepPointer("client.dll", 0x2A98128));
            values["dialogue"]      = new MemoryValue("int", new DeepPointer("client.dll", 0x2A9612C));
            values["dialogOption"]  = new MemoryValue("int", new DeepPointer("client.dll", 0x27B7210));
            values["inCutscene"]    = new MemoryValue("int", new DeepPointer("engine.dll", 0x111E1B58));
            values["flag"]          = new MemoryValue("int", new DeepPointer("engine.dll", 0x111E1B60));

            values["menuText"]         = new MemoryValue("string20", new DeepPointer("client.dll", 0x22BC680));
            values["thing"]            = new MemoryValue("int", new DeepPointer("server.dll", 0xC26B04));
            values["angle"]            = new MemoryValue("float", new DeepPointer("engine.dll", 0x7B666C));
            values["velocity"]         = new MemoryValue("float", new DeepPointer("client.dll", 0x2A9EEB8, 0x884));
            values["bnrbutton1"]       = new MemoryValue("int", new DeepPointer("engine.dll", 0x13B1E914));
            values["bnrbutton2"]       = new MemoryValue("int", new DeepPointer("engine.dll", 0x7B9D48));
            values["enc2button1"]      = new MemoryValue("int", new DeepPointer("engine.dll", 0x7B9C98));
            values["enc2button2"]      = new MemoryValue("int", new DeepPointer("engine.dll", 0x7B9E08));
            values["b2button"]         = new MemoryValue("int", new DeepPointer("server.dll", 0x1506C00));
            values["arkElevator"]      = new MemoryValue("int", new DeepPointer("engine.dll", 0x1398B458));
            values["viper"]            = new MemoryValue("int", new DeepPointer("client.dll", 0xC0916C));
            values["embarkCount"]      = new MemoryValue("int", new DeepPointer("engine.dll", 0x111E18D8));
            values["pilotYoureWithMe"] = new MemoryValue("int", new DeepPointer("engine.dll", 0x130D0D78));

            values["lurchMax"] = new MemoryValue("float", new DeepPointer("client.dll", 0x11B0308));
            values["slideStepVelocityReduction"] =
                new MemoryValue("int", new DeepPointer("client.dll", 0x11B0D28));
            values["repelEnable"]        = new MemoryValue("bool", new DeepPointer("client.dll", 0x11B287C));
            values["slideBoostCooldown"] =
                new MemoryValue("float", new DeepPointer("client.dll", 0x11B3AD8));
            values["editableVelocityX"] = new MemoryValue("float",
                                                          new DeepPointer("server.dll", 0x00B0EB50, 0xD8, 0x6B8, 0x428));
            values["editableVelocityY"] = new MemoryValue("float",
                                                          new DeepPointer("server.dll", 0x00B0EB50, 0xD8, 0x6B8, 0x42C));
            values["editableVelocityZ"] = new MemoryValue("float",
                                                          new DeepPointer("server.dll", 0x00B0EB50, 0xD8, 0x6B8, 0x430));

            values["currentLevel"] =
                new MemoryValue("string20", new DeepPointer("engine.dll", 0x12A53D55));
            values["inLoadingScreen"] = new MemoryValue("bool", new DeepPointer("client.dll", 0xB38C5C));

            // helmet unlocks for each level
            values["sp_unlocks_level_0"]  = new MemoryValue("int", new DeepPointer("server.dll", 0xC0A1BC)); // gauntlet
            values["sp_unlocks_level_1"]  = new MemoryValue("int", new DeepPointer("server.dll", 0xC0A3FC)); // bt
            values["sp_unlocks_level_2"]  = new MemoryValue("int", new DeepPointer("server.dll", 0xC0C49C)); // bnr
            values["sp_unlocks_level_3"]  = new MemoryValue("int", new DeepPointer("server.dll", 0xC0C88C)); // ita1
            values["sp_unlocks_level_4"]  = new MemoryValue("int", new DeepPointer("server.dll", 0xC09A2C)); // ita2
            values["sp_unlocks_level_5"]  = new MemoryValue("int", new DeepPointer("server.dll", 0xC08FFC)); // ita3
            values["sp_unlocks_level_6"]  = new MemoryValue("int", new DeepPointer("server.dll", 0xC0923C)); // enc1/3
            values["sp_unlocks_level_7"]  = new MemoryValue("int", new DeepPointer("server.dll", 0xC0A48C)); // enc2
            values["sp_unlocks_level_8"]  = new MemoryValue("int", new DeepPointer("server.dll", 0xC0911C)); // b1/3
            values["sp_unlocks_level_9"]  = new MemoryValue("int", new DeepPointer("server.dll", 0xC09DDC)); // b2
            values["sp_unlocks_level_10"] = new MemoryValue("int", new DeepPointer("server.dll", 0xC0A36C)); // tbf
            values["sp_unlocks_level_11"] = new MemoryValue("int", new DeepPointer("server.dll", 0xC0C7FC)); // ark
            values["sp_unlocks_level_12"] = new MemoryValue("int", new DeepPointer("server.dll", 0xC0987C)); // fold

            values["x"]                = new MemoryValue("float", new DeepPointer("client.dll", 0x2172FF8, 0xDEC));
            values["y"]                = new MemoryValue("float", new DeepPointer("client.dll", 0x2173B48, 0x2A0));
            values["z"]                = new MemoryValue("float", new DeepPointer("client.dll", 0x216F9C0, 0xF4));
            values["lastLevel"]        = new MemoryValue("string20", new DeepPointer("server.dll", 0x1053370));
            values["b3Door"]           = new MemoryValue("int", new DeepPointer("engine.dll", 0x7B9D18));
            values["tbfElevator"]      = new MemoryValue("int", new DeepPointer("engine.dll", 0x7B9B28));
            values["gauntletDialogue"] = new MemoryValue("int",
                                                         new DeepPointer("client.dll", 0x02A9F500, 0x10, 0x50, 0xCF48, 0x20, 0x4C0, 0x568, 0x7E8, 0x900, 0x10,
                                                                         0x4B90));
            values["arkDialogue"] = new MemoryValue("int", new DeepPointer("client.dll", 0x23E7C18));
            values["isB1"]        = new MemoryValue("int", new DeepPointer("engine.dll", 0xF8DCC1C));
            values["rodeo"]       = new MemoryValue("int", new DeepPointer("engine.dll", 0x111E0FE4));
            values["btSpeak1"]    = new MemoryValue("int",
                                                    new DeepPointer("client.dll", 0x02A9F080, 0xC0, 0x4C0, 0x568, 0x2A8, 0xC0, 0x10, 0x48));
            values["btSpeak2"] = new MemoryValue("int",
                                                 new DeepPointer("client.dll", 0x02A9F080, 0xC0, 0x3B8, 0x180, 0x520, 0xB8, 0x648, 0x10, 0xD8, 0x10,
                                                                 0x4C));
            values["inCutscene"] = new MemoryValue("int", new DeepPointer("engine.dll", 0x111E1B58));
            values["clFrames"]   = new MemoryValue("int",
                                                   new DeepPointer("materialsystem_dx11.dll", 0x1A9F4A8, 0x58C));
            values["b3SecureBeaconObjective"] =
                new MemoryValue("int", new DeepPointer("engine.dll", 0x130D0888));
            values["airAcceleration"] =
                new MemoryValue("float", new DeepPointer("engine.dll", 0x13084248, 0x2564));
            values["airSpeed"] = new MemoryValue("float",
                                                 new DeepPointer("engine.dll", 0x13084248, 0xEA8, 0x1008, 0x1038, 0x390, 0x48, 0x18, 0xA30, 0x10,
                                                                 0x2218));
            values["currentHealth"] = new MemoryValue("int",
                                                      new DeepPointer("engine.dll", 0x13084248, 0xA90, 0x18, 0xED8, 0x48, 0xA40, 0x10, 0xCB0, 0x4D4));
            values["yaw"]               = new MemoryValue("float", new DeepPointer("client.dll", 0x00E69EA0, 0x1E94));
            values["pitch"]             = new MemoryValue("float", new DeepPointer("client.dll", 0x00E69EA0, 0x1E90));
            values["velX"]              = new MemoryValue("float", new DeepPointer("client.dll", 0xB34C2C));
            values["velY"]              = new MemoryValue("float", new DeepPointer("client.dll", 0xB34C30));
            values["velZ"]              = new MemoryValue("float", new DeepPointer("client.dll", 0xB34C34));
            values["viewThunkVertical"] = new MemoryValue("float",
                                                          new DeepPointer("client.dll", 0x00B188C0, 0xD8, 0x1A24));
            values["viewThunkHorizontal"] = new MemoryValue("float",
                                                            new DeepPointer("client.dll", 0x00B188C0, 0xD8, 0x1A28));
            values["recoilVertical"] = new MemoryValue("float",
                                                       new DeepPointer("client.dll", 0x00B188C0, 0xD8, 0x1A3C));
            values["recoilHorizontal"] = new MemoryValue("float",
                                                         new DeepPointer("client.dll", 0x00B188C0, 0xD8, 0x1A40));
            values["holdingM3"] = new MemoryValue("bool", new DeepPointer("engine.dll", 0x1396CC98));

            values["timescale"]                 = new MemoryValue("float", new DeepPointer("engine.dll", 0x1315A2C8));
            values["sv_cheats"]                 = new MemoryValue("int", new DeepPointer("engine.dll", 0x12A50EEC));
            values["sp_startpoint"]             = new MemoryValue("int", new DeepPointer("server .dll", 0xC0C6DC));
            values["currentTime"]               = new MemoryValue("float", new DeepPointer("client.dll", 0xC3DB28));
            values["paused"]                    = new MemoryValue("int", new DeepPointer("engine.dll", 0x7A6620));
            values["tickCount"]                 = new MemoryValue("int", new DeepPointer("engine.dll", 0x765A24));
            values["onGround"]                  = new MemoryValue("bool", new DeepPointer("client.dll", 0x11EED78));
            values["frontierDefenseWaveNumber"] = new MemoryValue("int", new DeepPointer("engine.dll", 0x7A7D28));

            values["rightClickTimestamp"]     = new MemoryValue("int", new DeepPointer("client.dll", 0x22BC5C0));
            values["leftClickTimestamp"]      = new MemoryValue("int", new DeepPointer("client.dll", 0x22BC5BC));
            values["lastSurfaceTouchNormalX"] = new MemoryValue("float", new DeepPointer("client.dll", 0xB18910));
            values["lastSurfaceTouchNormalY"] = new MemoryValue("float", new DeepPointer("client.dll", 0xB18914));
            values["lastSurfaceTouchNormalZ"] = new MemoryValue("float", new DeepPointer("client.dll", 0xB18918));

            state.CurrentTimingMethod = TimingMethod.GameTime;

            if (!File.Exists(Directory.GetCurrentDirectory() + "\\Components\\TitanfallInjection.dll"))
            {
                using (var webClient = new WebClient())
                {
                    webClient.DownloadFileAsync(new Uri(INJECTION_DLL_LINK),
                                                Directory.GetCurrentDirectory() + "\\Components\\TitanfallInjection.dll");
                }
            }

            ncsAutoLoader = new NCSAutoLoader(this);
            speedmod      = new Speedmod(this);

            tasTools = new TASTools(this);
            aimbot   = new Aimbot(this);
            splitter = new FzzySplitter(this);

            updateTimer = new Timer {
                Interval = 15
            };
            updateTimer.Tick += (sender, args) =>
            {
                try
                {
                    UpdateScript();
                }
                catch (Exception e)
                {
                    Log.Error(e);
                }
            };
            updateTimer.Enabled = true;
        }