Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Windows.Forms;
- using GTA;
- using NativeUI;
- using System.Runtime.InteropServices;
- using System.Drawing;
- using GTA.Native;
- using GTA.Math;
- using System.Linq;
- using System.Runtime.Serialization.Formatters.Binary;
- using System.IO;
- namespace Smooth_Throttle
- {
- public class Smooth_Throttle : Script
- {
- public const string version_num = "1.2";
- public const string version = "Smooth Throttle" + " " + version_num;
- private UIMenu mainMenu;
- private UIMenu kb_key_mappings_menu;
- private MenuPool _menuPool;
- //private UIMenuItem test;
- private UIMenuItem menuItem_kb_key_mappings;
- //private UIMenuItem UIMI_kb_key_OPENMENU;
- private UIMenuItem UIMI_kb_key_ACCELERATE;
- private UIMenuItem UIMI_kb_key_INC;
- private UIMenuItem UIMI_kb_key_DEC;
- private UIMenuItem UIMI_kb_key_DIRECTION;
- private UIMenuItem UIMI_INTERVAL;
- private UIMenuCheckboxItem UIMCBI_MOUSEWHEEL;
- private UIMenuCheckboxItem UIMCBI_MOD_ENABLED;
- private UIMenuCheckboxItem UIMCBI_NOTIFICATION;
- private UIMenuItem savesettings;
- [Serializable]
- public struct ST_Settings
- {
- public bool MOD_ENABLED;
- public bool NOTIFICATION;
- public long INTERVAL;
- public float THROTTLEVALUEPERCENT;
- public bool MOUSEWHEEL;
- //public List<Keys> OPENMENU_KEYS;
- public List<Keys> ACCELERATE_KEYS;
- public List<Keys> INCREASE_KEYS;
- public List<Keys> DECREASE_KEYS;
- public List<Keys> DIRECTION_KEYS;
- }
- private ST_Settings settings = new ST_Settings();
- public int ShowNotification(string message)
- {
- Function.Call(Hash._SET_NOTIFICATION_TEXT_ENTRY, new InputArgument[] { "STRING" });
- Function.Call(Hash._ADD_TEXT_COMPONENT_STRING, new InputArgument[] { message });
- int haNotificationDeletitionLastTimee = Function.Call<int>(Hash._DRAW_NOTIFICATION, new InputArgument[] { false, false });
- return haNotificationDeletitionLastTimee;
- }
- private void saveSettings()
- {
- FileStream fs = new FileStream(@"scripts//Smooth_Throttle_settings.bin", FileMode.Create);
- BinaryFormatter formatter = new BinaryFormatter();
- formatter.Serialize(fs, settings);
- fs.Close();
- }
- private void loadSettings()
- {
- FileStream fs = new FileStream(@"scripts//Smooth_Throttle_settings.bin", FileMode.Open);
- BinaryFormatter formatter = new BinaryFormatter();
- settings = (ST_Settings)formatter.Deserialize(fs);
- fs.Close();
- }
- public Smooth_Throttle()
- {
- if (!File.Exists(@"scripts//Smooth_Throttle_settings.bin"))
- {
- //settings.OPENMENU_KEYS = new List<Keys>();
- settings.ACCELERATE_KEYS = new List<Keys>();
- settings.INCREASE_KEYS = new List<Keys>();
- settings.DECREASE_KEYS = new List<Keys>();
- settings.DIRECTION_KEYS = new List<Keys>();
- //settings.OPENMENU_KEYS.Add(Keys.Divide);
- settings.ACCELERATE_KEYS.Add(Keys.ControlKey);
- settings.INCREASE_KEYS.Add(Keys.NumPad8);
- settings.DECREASE_KEYS.Add(Keys.NumPad2);
- settings.DIRECTION_KEYS.Add(Keys.Space);
- settings.MOD_ENABLED = true;
- settings.NOTIFICATION = true;
- settings.INTERVAL = 100;
- settings.THROTTLEVALUEPERCENT = 0.5f;
- settings.MOUSEWHEEL = false;
- }
- else
- {
- loadSettings();
- }
- this.KeyDown += this.OnKeyDown;
- this.KeyUp += this.OnKeyUp;
- this.Tick += this.OnTick;
- setupUIMenu();
- }
- private void setupUIMenu()
- {
- _menuPool = new MenuPool();
- mainMenu = new UIMenu(version, "~b~By Kryo4lex");
- _menuPool.Add(mainMenu);
- //test = new UIMenuItem("How to use", "Description");
- //mainMenu.AddItem(test);
- menuItem_kb_key_mappings = new UIMenuItem("Keyboard key assignment", "Change the keyboard controls");
- mainMenu.AddItem(menuItem_kb_key_mappings);
- savesettings = new UIMenuItem("Save settings", "Save your settings, to play with the same settings on the next startup of the game.");
- kb_key_mappings_menu = new UIMenu(version, "~b~Keyboard key assignment");
- _menuPool.Add(kb_key_mappings_menu);
- //kb_key_mappings_menu.AddItem(UIMI_kb_key_OPENMENU = new UIMenuItem("Open menu: " + getStringPressedKeys(settings.OPENMENU_KEYS), "Select to change the assigned keys and then press the new keys."));
- kb_key_mappings_menu.AddItem(UIMI_kb_key_ACCELERATE = new UIMenuItem("Accelerate: " + getStringPressedKeys(settings.ACCELERATE_KEYS), "Select to change the assigned keys and then press the new keys."));
- kb_key_mappings_menu.AddItem(UIMI_kb_key_INC = new UIMenuItem("Increase throttle: " + getStringPressedKeys(settings.INCREASE_KEYS), "Select to change the assigned keys and then press the new keys."));
- kb_key_mappings_menu.AddItem(UIMI_kb_key_DEC = new UIMenuItem("Decrease throttle: " + getStringPressedKeys(settings.DECREASE_KEYS), "Select to change the assigned keys and then press the new keys."));
- kb_key_mappings_menu.AddItem(UIMI_kb_key_DIRECTION = new UIMenuItem("Change direction/gear: " + getStringPressedKeys(settings.DIRECTION_KEYS), "Select to change the assigned keys and then press the new keys."));
- mainMenu.AddItem(UIMI_INTERVAL = new UIMenuItem("Interval: " + settings.INTERVAL.ToString() + " ms", "Select to change the interval in milliseconds of the throttle change keys, and enter a number."));
- mainMenu.AddItem(UIMCBI_MOUSEWHEEL = new UIMenuCheckboxItem("Mousewheel", settings.MOUSEWHEEL, "Enable this to use the mousewheel to change the throttle value."));
- mainMenu.AddItem(UIMCBI_NOTIFICATION = new UIMenuCheckboxItem("Notfications", settings.NOTIFICATION, "Enable this to get notifications when the throttle value is changed."));
- mainMenu.AddItem(UIMCBI_MOD_ENABLED = new UIMenuCheckboxItem("Mod enabled", settings.MOD_ENABLED, "Use this to toggle Smooth Throttle."));
- mainMenu.AddItem(savesettings);
- mainMenu.BindMenuToItem(kb_key_mappings_menu, menuItem_kb_key_mappings);
- mainMenu.RefreshIndex();
- mainMenu.OnItemSelect += OnItemSelect;
- mainMenu.OnCheckboxChange += OnCheckboxChange;
- kb_key_mappings_menu.OnItemSelect += OnItemSelect;
- }
- public void OnItemSelect(UIMenu sender, UIMenuItem selectedItem, int index)
- {
- if (selectedItem == savesettings)
- {
- saveSettings();
- UI.Notify("~b~Smooth Throttle settings saved!");
- }
- else if (selectedItem == UIMI_INTERVAL)
- {
- IntervalString = "";
- ChangeIntervalActive = true;
- UI.ShowSubtitle("~b~Enter a number for the new interval in milliseconds of the throttle change keys. Confirm with SPACE, abort with ESCAPE, delete with BACKSPACE", Int32.MaxValue);
- }
- /*
- if (selectedItem == UIMI_kb_key_OPENMENU)
- {
- ChangeKeyAssignment = true;
- KeyToChangeIndex = 0;
- }
- */
- /*else*/
- if (selectedItem == UIMI_kb_key_ACCELERATE)
- {
- ChangeKeyAssignment = true;
- KeyToChangeIndex = 1;
- }
- else if (selectedItem == UIMI_kb_key_INC)
- {
- ChangeKeyAssignment = true;
- KeyToChangeIndex = 2;
- }
- else if (selectedItem == UIMI_kb_key_DEC)
- {
- ChangeKeyAssignment = true;
- KeyToChangeIndex = 3;
- }
- else if (selectedItem == UIMI_kb_key_DIRECTION)
- {
- ChangeKeyAssignment = true;
- KeyToChangeIndex = 4;
- }
- }
- public void OnCheckboxChange(UIMenu sender, UIMenuCheckboxItem checkbox, bool Checked)
- {
- if (checkbox == UIMCBI_MOD_ENABLED)
- {
- settings.MOD_ENABLED = UIMCBI_MOD_ENABLED.Checked;
- }
- else if (checkbox == UIMCBI_NOTIFICATION)
- {
- settings.NOTIFICATION = UIMCBI_NOTIFICATION.Checked;
- }
- else if (checkbox == UIMCBI_MOUSEWHEEL)
- {
- settings.MOUSEWHEEL = UIMCBI_MOUSEWHEEL.Checked;
- }
- }
- long LastTimeIncrease = 0;
- long LastTimeDecrease = 0;
- bool NotificationDeletitionNecessary = false;
- long NotificationDeletitionLastTime = 0;
- bool IsDirectionForward = true;
- bool DirectionChangeLastState = false;
- private List<Keys> newKeys = new List<Keys>();
- void OnTick(object sender, EventArgs e)
- {
- if (Game.Player.Character.IsInVehicle())
- {
- if (settings.MOD_ENABLED)
- {
- if (NotificationDeletitionNecessary)
- {
- if (NotificationDeletitionLastTime + 1000 <= Environment.TickCount)
- {
- NotificationDeletitionNecessary = false;
- Function.Call(Hash._REMOVE_NOTIFICATION, new InputArgument[] { NotificationHandle });
- }
- }
- if (ChangeKeyAssignment)
- {
- switch (KeyAssignmentStepIndex)
- {
- case 0:
- mainMenu.Visible = false;
- kb_key_mappings_menu.Visible = false;
- UI.ShowSubtitle("~b~In 3 seconds, you have 4 seconds, to hold the key(s), for " + stFunction(KeyToChangeIndex), 3000);
- if (!s1_started)
- {
- s1_started = true;
- t_s1 = Environment.TickCount + 3000;
- }
- if (Environment.TickCount >= t_s1)
- KeyAssignmentStepIndex++;
- break;
- case 1:
- newKeys.Clear();
- newKeys = new List<Keys>(pressedKeys);
- UI.ShowSubtitle("~b~Key(s):\n" + getStringPressedKeys(newKeys), 4000);
- if (!s2_started)
- {
- s2_started = true;
- t_s2 = Environment.TickCount + 4000;
- }
- if (Environment.TickCount >= t_s2)
- KeyAssignmentStepIndex++;
- break;
- case 2:
- kb_key_mappings_menu.Visible = true;
- s1_started = false;
- s2_started = false;
- ChangeKeyAssignment = false;
- KeyAssignmentStepIndex = 0;
- if (newKeys.Count != 0)
- {
- switch (KeyToChangeIndex)
- {
- /*
- case 0:
- settings.OPENMENU_KEYS.Clear();
- settings.OPENMENU_KEYS = new List<Keys>(newKeys);
- UIMI_kb_key_OPENMENU.Text = "Open menu: " + getStringPressedKeys(settings.OPENMENU_KEYS);
- break;
- */
- case 1:
- settings.ACCELERATE_KEYS.Clear();
- settings.ACCELERATE_KEYS = new List<Keys>(newKeys);
- UIMI_kb_key_ACCELERATE.Text = "Accelerate: " + getStringPressedKeys(settings.ACCELERATE_KEYS);
- break;
- case 2:
- settings.INCREASE_KEYS.Clear();
- settings.INCREASE_KEYS = new List<Keys>(newKeys);
- UIMI_kb_key_INC.Text = "Increase throttle: " + getStringPressedKeys(settings.INCREASE_KEYS);
- break;
- case 3:
- settings.DECREASE_KEYS.Clear();
- settings.DECREASE_KEYS = new List<Keys>(newKeys);
- UIMI_kb_key_DEC.Text = "Decrease throttle: " + getStringPressedKeys(settings.DECREASE_KEYS);
- break;
- case 4:
- settings.DIRECTION_KEYS.Clear();
- settings.DIRECTION_KEYS = new List<Keys>(newKeys);
- UIMI_kb_key_DIRECTION.Text = "Change direction/gear: " + getStringPressedKeys(settings.DIRECTION_KEYS);
- break;
- }
- UI.ShowSubtitle("~b~Successfully assinged " + stFunction(KeyToChangeIndex) + " to " + getStringPressedKeys(pressedKeys), 3000);
- }
- else
- {
- UI.ShowSubtitle("~b~No key(s) have been changed!", 3000);
- }
- break;
- }
- }
- else
- {
- if (!ChangeKeyAssignment)
- {
- if (LinqHelper.ContainsAll(pressedKeys, settings.ACCELERATE_KEYS))
- {
- //drawuirect(0.944f, 0.5425f, 0.007f, 0.007f, Color.Green);
- if (IsDirectionForward)
- {
- Game.SetControlNormal(0, GTA.Control.VehicleAccelerate, 0.25f + (0.75f * settings.THROTTLEVALUEPERCENT));
- Game.SetControlNormal(0, GTA.Control.VehicleFlyThrottleUp, 0.25f + (0.75f * settings.THROTTLEVALUEPERCENT));
- }
- else
- {
- Game.SetControlNormal(0, GTA.Control.VehicleBrake, 0.25f + (0.75f * settings.THROTTLEVALUEPERCENT));
- }
- }
- if (LinqHelper.ContainsAll(pressedKeys, settings.DIRECTION_KEYS))
- {
- if (!DirectionChangeLastState)//IsDirectionForward != IsDirectionForwardLast)
- {
- IsDirectionForward = !IsDirectionForward;
- if (settings.NOTIFICATION)
- {
- notifyDirectionChange(IsDirectionForward);
- }
- NotificationDeletitionNecessary = true;
- NotificationDeletitionLastTime = Environment.TickCount;
- }
- DirectionChangeLastState = true;
- }
- else
- {
- DirectionChangeLastState = false;
- }
- if (((LinqHelper.ContainsAll(pressedKeys, settings.INCREASE_KEYS) || (Game.IsControlJustPressed(0, GTA.Control.PrevWeapon) && settings.MOUSEWHEEL)) && !(settings.THROTTLEVALUEPERCENT >= 1.0f) && (LastTimeIncrease + settings.INTERVAL <= Environment.TickCount)))
- {
- settings.THROTTLEVALUEPERCENT = (float)Math.Round((double)settings.THROTTLEVALUEPERCENT, 2);
- if (settings.THROTTLEVALUEPERCENT >= 0.05f)
- settings.THROTTLEVALUEPERCENT += 0.05f;
- else
- settings.THROTTLEVALUEPERCENT += 0.01f;
- LastTimeIncrease = Environment.TickCount;
- if (settings.NOTIFICATION)
- {
- notifyThrottleChange(IsDirectionForward);
- }
- NotificationDeletitionNecessary = true;
- NotificationDeletitionLastTime = Environment.TickCount;
- }
- if (((LinqHelper.ContainsAll(pressedKeys, settings.DECREASE_KEYS) || (Game.IsControlJustPressed(0, GTA.Control.SniperZoomOutOnly) && settings.MOUSEWHEEL)) && !(settings.THROTTLEVALUEPERCENT <= 0.0f) && (LastTimeDecrease + settings.INTERVAL <= Environment.TickCount)))
- {
- settings.THROTTLEVALUEPERCENT = (float)Math.Round((double)settings.THROTTLEVALUEPERCENT, 2);
- if (settings.THROTTLEVALUEPERCENT <= 0.05f)
- settings.THROTTLEVALUEPERCENT -= 0.01f;
- else
- settings.THROTTLEVALUEPERCENT -= 0.05f;
- LastTimeDecrease = Environment.TickCount;
- if (settings.NOTIFICATION)
- {
- notifyThrottleChange(IsDirectionForward);
- }
- NotificationDeletitionNecessary = true;
- NotificationDeletitionLastTime = Environment.TickCount;
- }
- }
- }
- }
- _menuPool.ProcessMenus();
- }
- }
- int NotificationHandle;
- private void notifyThrottleChange(bool direction)
- {
- Function.Call(Hash._REMOVE_NOTIFICATION, new InputArgument[] { NotificationHandle });
- if (direction)
- {
- NotificationHandle = ShowNotification(("Throttle: " + "~b~" + (Math.Round(settings.THROTTLEVALUEPERCENT * 100f, 2)).ToString() + "%").ToString() + " (F)");
- }
- else
- {
- NotificationHandle = ShowNotification(("Throttle: " + "~r~" + (Math.Round(settings.THROTTLEVALUEPERCENT * 100f, 2)).ToString() + "%").ToString() + " (R)");
- }
- }
- private void notifyDirectionChange(bool direction)
- {
- Function.Call(Hash._REMOVE_NOTIFICATION, new InputArgument[] { NotificationHandle });
- if (direction)
- {
- NotificationHandle = ShowNotification("Direction: ~b~FORWARD");
- }
- else
- {
- NotificationHandle = ShowNotification("Direction: ~r~REVERSE");
- }
- }
- private void printPressedKeys(List<Keys> listkeys)
- {
- string str = "";
- int i = 0;
- foreach (var key in listkeys)
- {
- str += key.ToString();
- if (i != (listkeys.Count - 1))
- {
- str += " + ";
- }
- i++;
- }
- UI.ShowSubtitle(str);
- }
- private string getStringPressedKeys(List<Keys> listkeys)
- {
- string str = "";
- int i = 0;
- foreach (var key in listkeys)
- {
- str += key.ToString();
- if (i != (listkeys.Count - 1))
- {
- str += " + ";
- }
- i++;
- }
- return str;
- }
- string stFunction(int index)
- {
- switch (index)
- {
- case 0:
- return "Open menu";
- case 1:
- return "Accelerate";
- case 2:
- return "Increase throttle";
- case 3:
- return "Decrease throttle";
- }
- return "";
- }
- int KeyToChangeIndex = 0;
- bool ChangeKeyAssignment = false;
- int KeyAssignmentStepIndex = 0;
- bool s1_started = false;
- long t_s1 = 0;
- bool s2_started = false;
- long t_s2 = 0;
- private List<Keys> pressedKeys = new List<Keys>();
- int MenuToggleStep = 0;
- bool ChangeIntervalActive = false;
- string IntervalString = "";
- Dictionary<Keys, int> KeysInt = new Dictionary<Keys, int>()
- {
- {Keys.D0, 0},
- {Keys.D1, 1},
- {Keys.D2, 2},
- {Keys.D3, 3},
- {Keys.D4, 4},
- {Keys.D5, 5},
- {Keys.D6, 6},
- {Keys.D7, 7},
- {Keys.D8, 8},
- {Keys.D9, 9},
- {Keys.NumPad0, 0},
- {Keys.NumPad1, 1},
- {Keys.NumPad2, 2},
- {Keys.NumPad3, 3},
- {Keys.NumPad4, 4},
- {Keys.NumPad5, 5},
- {Keys.NumPad6, 6},
- {Keys.NumPad7, 7},
- {Keys.NumPad8, 8},
- {Keys.NumPad9, 9}
- };
- private void OnKeyDown(object sender, KeyEventArgs e)
- {
- if (!(pressedKeys.Contains(e.KeyCode)))
- pressedKeys.Add(e.KeyCode);
- //printPressedKeys(pressedKeys);
- /*
- if(!ChangeKeyAssignment && LinqHelper.ContainsAll(pressedKeys, settings.OPENMENU_KEYS) && !kb_key_mappings_menu.Visible)
- mainMenu.Visible = !mainMenu.Visible;
- */
- if (Game.Player.Character.IsInVehicle())
- {
- if (e.KeyCode == Keys.T && MenuToggleStep == 0)
- {
- MenuToggleStep++;
- }
- else if (e.KeyCode == Keys.H && MenuToggleStep == 1)
- {
- MenuToggleStep++;
- }
- else if (e.KeyCode == Keys.R && MenuToggleStep == 2)
- {
- MenuToggleStep++;
- }
- else if (e.KeyCode == Keys.T && MenuToggleStep == 3)
- {
- MenuToggleStep++;
- }
- else if (e.KeyCode == Keys.L && MenuToggleStep == 4)
- {
- mainMenu.Visible = !mainMenu.Visible;
- MenuToggleStep = 0;
- }
- else
- {
- MenuToggleStep = 0;
- }
- if (ChangeIntervalActive)
- {
- if (e.KeyCode == Keys.Escape)
- {
- ChangeIntervalActive = false;
- UI.ShowSubtitle("~b~Change of throttle value interval aborted!", 3000);
- return;
- }
- if (e.KeyCode == Keys.Back)
- {
- IntervalString = IntervalString.Remove(IntervalString.Length - 1);
- UI.ShowSubtitle("~b~" + IntervalString, Int32.MaxValue);
- return;
- }
- if (e.KeyCode == Keys.Space)
- {
- settings.INTERVAL = Convert.ToInt32(IntervalString);
- UIMI_INTERVAL.Text = "Interval: " + settings.INTERVAL.ToString() + " ms";
- UI.ShowSubtitle("~b~New throttle value interval: " + IntervalString + " ms", 5000);
- ChangeIntervalActive = false;
- return;
- }
- if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) || (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))
- {
- if (IntervalString.Length <= 4)
- {
- IntervalString += KeysInt[e.KeyCode].ToString();
- }
- UI.ShowSubtitle("~b~" + IntervalString, Int32.MaxValue);
- }
- }
- }
- /*
- if(e.KeyCode == Keys.Divide)
- {
- re = !re;
- if (!re)
- {
- // Create a campfire model
- var model = new Model("prop_riot_shield");
- model.Request(250);
- // Check the model is valid
- if (model.IsInCdImage && model.IsValid)
- {
- // Ensure the model is loaded before we try to create it in the world
- while (!model.IsLoaded) Script.Wait(50);
- // Create the prop in the world
- //for(int i =0;i<=10;i++)
- lol = World.CreateProp(model, Game.Player.Character.GetOffsetInWorldCoords(new Vector3(0, 0, 0)), true, true);
- //lol.AttachTo(Game.Player.Character, 0xeeeb, new Vector3(-0.1f, 0.5f, -0.01f), new Vector3(0, 0, 205.0f));
- GTA.Native.Function.Call(Hash.ATTACH_ENTITY_TO_ENTITY, lol, Game.Player.Character, 0x5c01, -0.1f, 0.5f, -0.2f, 0, 0, 180.0f,true,true,true,true,0,true);
- }
- // Mark the model as no longer needed to remove it from memory.
- model.MarkAsNoLongerNeeded();
- //mainMenu.Visible = !mainMenu.Visible;
- }
- else
- lol.Delete();
- }
- */
- }
- private void OnKeyUp(object sender, KeyEventArgs e)
- {
- pressedKeys.Remove(e.KeyCode);
- //printPressedKeys(pressedKeys);
- }
- }
- public static class LinqHelper
- {
- public static bool ContainsAll<T>(this IEnumerable<T> containingList, IEnumerable<T> lookupList)
- {
- return !lookupList.Except(containingList).Any();
- }
- public static IList<T> Clone<T>(this IList<T> listToClone) where T : ICloneable
- {
- return listToClone.Select(item => (T)item.Clone()).ToList();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement