Пример #1
0
        public static string GetText(int id)
        {
            string str = D2IFile.GetText(id);

            if (str == string.Empty || str == null)
            {
                return("[UNKNOWN_TEXT_ID_" + id + "]");
            }
            else
            {
                return(str);
            }
        }
Пример #2
0
        public static Dictionary <Type, List <ITable> > GetD2OTables(Type type, List <D2OReader> d2oFiles, D2IFile d2iFile)
        {
            Dictionary <Type, List <ITable> > tables = new Dictionary <Type, List <ITable> >();

            D2OAttribute d2oAttribute = type.GetCustomAttribute <D2OAttribute>();

            DataClass[] d2oData = GetD2OData(d2oFiles, d2oAttribute);

            if (d2oData.Length == 0)
            {
                logger.Color2("Unable to find d2o module : " + d2oAttribute.Module);
                Console.ReadKey();
                Environment.Exit(0);
            }

            logger.White("Loading D2OTable " + d2oAttribute.ToString() + "...");

            foreach (var data in d2oData)
            {
                ID2OTable table = Activator.CreateInstance(type) as ID2OTable;


                foreach (var field in GetD2OFields(table))
                {
                    var attribute = field.GetCustomAttribute <D2OFieldAttribute>();
                    if (!data.Fields.ContainsKey(attribute.FieldName))
                    {
                        logger.NewLine();
                        logger.Color2("Unable to get fieldValue for (" + attribute.FieldName + ") the field dosent exist in d2oFile (" + d2oAttribute.ToString() + ")");
                        logger.NewLine();
                        logger.Color1("D2O Fields for " + d2oAttribute.Module + ":");

                        foreach (var d2oField in d2oData[0].Fields.Keys)
                        {
                            logger.Color2("-" + d2oField, false);
                        }

                        Console.Read();
                        Environment.Exit(0);
                    }

                    object fieldValue = data.Fields[attribute.FieldName];

                    if (fieldValue == null)
                    {
                        if (field.FieldType == typeof(string))
                        {
                            field.SetValue(table, string.Empty);
                        }
                        else
                        {
                            field.SetValue(table, Activator.CreateInstance(field.FieldType));
                        }
                        continue;
                    }
                    var customMethod = type.GetMethods().FirstOrDefault(x => x.GetCustomAttribute <D2OFieldHandler>() != null);

                    if (customMethod != null)
                    {
                        var methodAttribute = customMethod.GetCustomAttribute <D2OFieldHandler>();
                        if (methodAttribute.Field == attribute.FieldName)
                        {
                            customMethod.Invoke(table, new object[] { fieldValue });
                            continue;
                        }
                    }

                    if (fieldValue is ArrayList)
                    {
                        var array = (fieldValue as ArrayList).ToArray();

                        if (array.Length > 0)
                        {
                            var obj = array[0];

                            if (obj is DataClass)
                            {
                                var d2otype = D2oTypeManager.GetType(obj as DataClass);

                                IList list = (IList)Activator.CreateInstance(typeof(List <>).MakeGenericType(new Type[] { d2otype }));

                                foreach (var value in array)
                                {
                                    list.Add(D2oTypeManager.Handle(value as DataClass));
                                }
                                try
                                {
                                    field.SetValue(table, list.XMLSerialize());
                                }
                                catch
                                {
                                    logger.Color2("Type for field " + field.Name + " in " + type.Name + " must be string");
                                    Console.Read();
                                    Environment.Exit(0);
                                }
                            }
                            else if (obj is ArrayList)
                            {
                                string str = string.Empty;

                                foreach (ArrayList subItem in array)
                                {
                                    foreach (var item in subItem)
                                    {
                                        str += item + ",";
                                    }

                                    str = str.Remove(str.Length - 1, 1);

                                    str += "|";
                                }

                                if (str != string.Empty)
                                {
                                    str = str.Remove(str.Length - 1, 1);
                                }
                                field.SetValue(table, str);
                            }
                            else
                            {
                                var list = Activator.CreateInstance(field.FieldType) as IList;

                                foreach (var value in array)
                                {
                                    var listType = field.FieldType.GenericTypeArguments[0];
                                    list.Add(Convert.ChangeType(value, listType));
                                }

                                field.SetValue(table, list);
                            }
                        }
                    }
                    else if (fieldValue is DataClass)
                    {
                        string value = D2oTypeManager.Handle(fieldValue as DataClass).XMLSerialize(); // idem
                        field.SetValue(table, value);
                    }
                    else
                    {
                        if (fieldValue != null)
                        {
                            if (fieldValue is String && fieldValue.ToString().ToLower() == "null")
                            {
                                fieldValue = string.Empty;
                            }

                            if (field.FieldType == typeof(String) && fieldValue is Int32)
                            {
                                if (field.GetCustomAttribute <i18nAttribute>() != null)
                                {
                                    fieldValue = d2iFile.GetText((int)fieldValue);
                                    fieldValue = fieldValue.ToString().Replace('\'', ' ');
                                }
                            }
                            field.SetValue(table, Convert.ChangeType(fieldValue, field.FieldType));
                        }
                    }
                }
                if (tables.ContainsKey(type))
                {
                    tables[type].Add(table);
                }
                else
                {
                    tables.Add(type, new List <ITable> {
                        table
                    });
                }
            }
            return(tables);
        }