public VStancerEditor() { // If the resource name is not the expected one ... if (GetCurrentResourceName() != ResourceName) { CitizenFX.Core.Debug.WriteLine($"{ScriptName}: Invalid resource name, be sure the resource name is {ResourceName}"); return; } lastTime = GetGameTimer(); currentVehicle = -1; currentPreset = null; vehicles = Enumerable.Empty <int>(); RegisterDecorators(); LoadConfig(); #region Register Commands RegisterCommand("vstancer_range", new Action <int, dynamic>((source, args) => { if (args.Count < 1) { Debug.WriteLine($"{ScriptName}: Missing float argument"); return; } if (float.TryParse(args[0], out float value)) { ScriptRange = value; Debug.WriteLine($"{ScriptName}: Received new {nameof(ScriptRange)} value {value}"); } else { Debug.WriteLine($"{ScriptName}: Error parsing {args[0]} as float"); } }), false); RegisterCommand("vstancer_debug", new Action <int, dynamic>((source, args) => { if (args.Count < 1) { Debug.WriteLine($"{ScriptName}: Missing bool argument"); return; } if (bool.TryParse(args[0], out bool value)) { debug = value; Debug.WriteLine($"{ScriptName}: Received new {nameof(debug)} value {value}"); } else { Debug.WriteLine($"{ScriptName}: Error parsing {args[0]} as bool"); } }), false); RegisterCommand("vstancer_decorators", new Action <int, dynamic>((source, args) => { if (args.Count < 1) { PrintDecoratorsInfo(currentVehicle); } else { if (int.TryParse(args[0], out int value)) { PrintDecoratorsInfo(value); } else { Debug.WriteLine($"{ScriptName}: Error parsing entity handle {args[0]} as int"); } } }), false); RegisterCommand("vstancer_preset", new Action <int, dynamic>((source, args) => { if (currentPreset != null) { Debug.WriteLine(currentPreset.ToString()); } else { Debug.WriteLine($"{ScriptName}: Current preset doesn't exist"); } }), false); RegisterCommand("vstancer_print", new Action <int, dynamic>((source, args) => { PrintVehiclesWithDecorators(vehicles); }), false); #endregion if (exposeCommand) { RegisterCommand("vstancer", new Action <int, dynamic>((source, args) => { ToggleMenuVisibility?.Invoke(this, EventArgs.Empty); }), false); } if (exposeEvent) { EventHandlers.Add("vstancer:toggleMenu", new Action(() => { ToggleMenuVisibility?.Invoke(this, EventArgs.Empty); })); } Exports.Add("SetVstancerPreset", new Action <int, float, float, float, float, float, float, object, object, object, object, object, object>(SetVstancerPreset)); Exports.Add("GetVstancerPreset", new Func <int, float[]>(GetVstancerPreset)); // Create a script for the menu ... vstancerMenu = new VStancerMenu(this); if (vstancerMenu != null) { // Actually only required to have its Tick event triggered // TODO: Workaround this and avoid to register the script RegisterScript(vstancerMenu); } vstancerMenu.MenuResetPresetButtonPressed += (sender, args) => OnMenuResetPresetButtonPressed(); vstancerMenu.MenuPresetValueChanged += OnMenuPresetValueChanged; Tick += GetCurrentVehicle; Tick += UpdateCurrentVehicle; Tick += UpdateWorldVehicles; Tick += UpdateCurrentVehicleDecorators; }