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);
        }
Beispiel #2
0
        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;
            }
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
        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));
            }
        }