public Type Get(AuroraType name) { lock (TypeCache) { if (TypeCache.ContainsKey(name)) { return(TypeCache[name]); } } Signature signature = null; lock (Signatures) { if (Signatures.ContainsKey(name)) { signature = Signatures[name]; } } if (signature == null) { return(null); } try { if (!signature.IsUniqueByChecksum.ContainsKey(Lib.AuroraChecksum)) { var types = GetTypes(signature); if (types.Count == 1) { signature.IsUniqueByChecksum.Add(Lib.AuroraChecksum, true); } else { signature.IsUniqueByChecksum.Add(Lib.AuroraChecksum, false); } Save(); } if (signature.IsUniqueByChecksum[Lib.AuroraChecksum]) { var type = GetTypes(signature).First(); lock (TypeCache) { TypeCache[name] = type; } return(type); } } catch (Exception e) { Lib.LogError($"SignatureManager failed to get Type for {name}. {e}"); } return(null); }
public void RunOnForm(AuroraType type, Action <Form> action) { if (!OpenFormInstance(type)) { Lib.LogError($"UIManager could not open form {type}"); return; } try { var formtype = Lib.SignatureManager.Get(type); var form = Lib.GetOpenForms().FirstOrDefault(f => f.GetType().Name == formtype.Name); var t = new Task(() => { try { var end = DateTime.UtcNow + TimeSpan.FromSeconds(30); while (form == null) { Lib.LogDebug($"Waiting for form"); Thread.Sleep(100); form = Lib.GetOpenForms().FirstOrDefault(f => f.GetType().Name == formtype.Name); if (DateTime.UtcNow > end) { break; } } if (form == null) { Lib.LogError($"Could not find open form {type}"); return; } Lib.InvokeOnUIThread(new Action(() => { form.Activate(); action(form); })); } catch (Exception e) { Lib.LogError($"Failed to wait for form {type}. {e}"); } }); t.Start(); } catch (Exception e) { Lib.LogError($"Failed to run on form {type}. {e}"); } }
private void GenerateSignatureFromType(AuroraType name, Type type) { var fieldtypes = new Dictionary <Type, int>(); foreach (var field in type.GetFields(AccessTools.all)) { if (field.FieldType.Assembly.FullName != Lib.AuroraAssembly.FullName && field.FieldType.IsGenericType == false && field.FieldType.IsInterface == false) { if (!fieldtypes.ContainsKey(field.FieldType)) { fieldtypes.Add(field.FieldType, 0); } fieldtypes[field.FieldType]++; } } var signature = new Signature() { Name = name, }; signature.IsUniqueByChecksum.Add(Lib.AuroraChecksum, false); var deltas = new[] { 10, 5, 3, 2, 1, 0 }; foreach (var delta in deltas) { foreach (var kvp in fieldtypes) { signature.MinFieldTypes[kvp.Key.Name] = kvp.Value - delta; signature.MaxFieldTypes[kvp.Key.Name] = kvp.Value + delta; } var types = GetTypes(signature); if (types.Count == 1) { signature.IsUniqueByChecksum[Lib.AuroraChecksum] = true; break; } } lock (Signatures) { Signatures[name] = signature; } }
public bool OpenFormInstance(AuroraType type) { try { var formtype = Lib.SignatureManager.Get(type); if (formtype == null) { return(false); } foreach (var open in Lib.GetOpenForms()) { if (open.GetType().Name == formtype.Name) { return(true); } } if (Lib.TacticalMap == null) { return(false); } var name = Lib.KnowledgeBase.GetFormOpenButtonName(type); if (name == null) { return(false); } var action = new Action(() => { var button = GetControlByName <Button>(Lib.TacticalMap, name); Lib.TacticalMap.Activate(); button.PerformClick(); }); Lib.InvokeOnUIThread(action); return(true); } catch (Exception e) { Lib.LogError($"UIManager failed to open form {type}. {e}"); return(false); } }
public string GetFormOpenButtonName(AuroraType type) { switch (type) { case AuroraType.EconomicsForm: return(GetButtonName(AuroraButton.ToolbarColony)); case AuroraType.ClassDesignForm: return(GetButtonName(AuroraButton.ToolbarClass)); case AuroraType.CreateProjectForm: return(GetButtonName(AuroraButton.ToolbarProject)); case AuroraType.FleetWindowForm: return(GetButtonName(AuroraButton.ToolbarFleet)); case AuroraType.MissileDesignForm: return(GetButtonName(AuroraButton.ToolbarMissileDesign)); case AuroraType.TurretDesignForm: return(GetButtonName(AuroraButton.ToolbarTurrent)); case AuroraType.GroundUnitDesignForm: return(GetButtonName(AuroraButton.ToolbarGroundForces)); case AuroraType.CommandersWindowForm: return(GetButtonName(AuroraButton.ToolbarCommanders)); case AuroraType.MedalsForm: return(GetButtonName(AuroraButton.ToolbarMedals)); case AuroraType.RaceWindowForm: return(GetButtonName(AuroraButton.ToolbarRace)); case AuroraType.SystemViewForm: return(GetButtonName(AuroraButton.ToolbarSystem)); case AuroraType.GalacticMapForm: return(GetButtonName(AuroraButton.ToolbarGalactic)); case AuroraType.RaceComparisonForm: return(GetButtonName(AuroraButton.ToolbarComparison)); case AuroraType.DiplomacyForm: return(GetButtonName(AuroraButton.ToolbarIntelligence)); case AuroraType.TechnologyViewForm: return(GetButtonName(AuroraButton.ToolbarTechnology)); case AuroraType.MineralsForm: return(GetButtonName(AuroraButton.ToolbarSurvey)); case AuroraType.SectorsForm: return(GetButtonName(AuroraButton.ToolbarSector)); case AuroraType.EventsForm: return(GetButtonName(AuroraButton.ToolbarEvents)); case AuroraType.GameDetailsForm: return(GetButtonName(AuroraButton.ToolbarGame)); default: return(null); } }
public void RegisterEventHandler(AuroraType form, string event_name, MethodInfo handler, Func <Control, bool> predicate = null) { if (!handler.IsStatic) { LogError($"Event handler {handler.DeclaringType.Name}.{handler.Name} is not static."); return; } lock (EventHandlers) { var type = SignatureManager.Get(form); if (!EventHandlers.ContainsKey(type)) { EventHandlers.Add(type, new List <Tuple <string, MethodInfo, Func <Control, bool> > >()); } EventHandlers[type].Add(new Tuple <string, MethodInfo, Func <Control, bool> >(event_name, handler, predicate)); } }