Пример #1
0
        public Preferences(string fileName)
        {
            m_fileName = fileName;

            if (File.Exists(m_fileName))
            {
                // Если файл с настройками существует - прочитаем его в m_data

                XmlSerializer serializer = new XmlSerializer(typeof(SerializableData));

                using (Stream fileStream = new FileStream(m_fileName, FileMode.Open))
                {
                    m_data = serializer.Deserialize(fileStream) as SerializableData;
                }

                // Убираем с прочитанных данных косяки, которые мог внести туда пользователь вручную
                // В случае если были косяки, пересохраняем исправленные данные обратно в файл
                if (m_data.Validate())
                {
                    Save(false);
                }
            }
            else
            {
                // Если файла с настройками не существует, создадим его и запишем в него найстройки по умолчанию (которые задаются в конструкторе SerializableData)
                m_data = SerializableData.CreateDefault();
                Save(false);
            }
        }
Пример #2
0
 public static void SendSaveEvent(SerializableData data)
 {
     if (OnSave != null)
     {
         OnSave(data);
     }
 }
Пример #3
0
        static SerializableData Deserialize()
        {
            SerializableData data;
            string           json;

            if (!File.Exists(Path))
            {
                // not exists - write new
                data = SerializableData.Empty();
                json = JsonUtility.ToJson(data);
                File.WriteAllText(Path, json);
            }
            else
            {
                // exists
                json = File.ReadAllText(Path);

                if (string.IsNullOrEmpty(json))
                {
                    // but corrupted - overwrite with new
                    data = SerializableData.Empty();
                    json = JsonUtility.ToJson(data);
                    File.WriteAllText(Path, json);
                }

                data = JsonUtility.FromJson <SerializableData>(json);
                // todo assert valid
            }

            return(data);
        }
Пример #4
0
        public void Serialize()
        {
            var data = SerializableData.OnSerialize(_dict);
            var json = JsonUtility.ToJson(data);

            File.WriteAllText(Path, json);
        }
Пример #5
0
        public void WriteXML(SerializableData data, string xmlNodeName)
        {
            Debug.Assert(!String.IsNullOrEmpty(data.Type));
            this.ObjectBegin(xmlNodeName);

            this.ObjectDescription(ValueKey, data.Value);
            // 写入TK
            TypeInfo info = new TypeInfo(data.Type, data.AssemblyQualifiedName);

            this.ObjectDescription(TypeDictionaryKey, typeDict.GetTypeKey(info));
            this.ObjectDescription(NameKey, data.FieldName);

            int count = data.SerializableDataCollection.Count;

            this.ArrayBegin(SerializableDataCollectionKey, out count);
            for (int index = 0; index < count; ++index)
            {
                this.WriteXML(data.SerializableDataCollection[index], ArrayItemKey);

                this.ArrayNext();
            }
            this.ArrayEnd();

            this.ObjectEnd();
        }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var oldTypeNameHandling = serializer.TypeNameHandling;
        var oldAssemblyFormat   = serializer.TypeNameAssemblyFormat;

        try
        {
            var serializable = (ISerializable)value;
            var context      = serializer.Context;
            var info         = new SerializationInfo(value.GetType(), new FormatterConverter());
            serializable.GetObjectData(info, context);
            var data = SerializableData.CreateData(info, value.GetType());
            if (serializer.TypeNameHandling == TypeNameHandling.None)
            {
                serializer.TypeNameHandling = TypeNameHandling.Auto;
            }
            else if (serializer.TypeNameHandling == TypeNameHandling.Arrays)
            {
                serializer.TypeNameHandling = TypeNameHandling.All;
            }
            // The following seems to be required by https://github.com/JamesNK/Newtonsoft.Json/issues/787
            serializer.TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full;
            serializer.Serialize(writer, data, typeof(SerializableData));
        }
        finally
        {
            serializer.TypeNameHandling       = oldTypeNameHandling;
            serializer.TypeNameAssemblyFormat = oldAssemblyFormat;
        }
    }
Пример #7
0
        private void ReadXML(ref SerializableData data, string xmlNodeName)
        {
            this.ObjectBegin(xmlNodeName);

            data.Value = this.ObjectDescription(ValueKey);

            string TK = this.ObjectDescription(TypeDictionaryKey);

            Debug.Assert(typeDict.ContainsKey(TK));
            TypeInfo info = typeDict.KeyToType[TK];

            data.Type = info.TypeName;
            data.AssemblyQualifiedName = info.AssemblyQualifiedName;
            //data.Type = this.ObjectDescription("type");
            //data.AssemblyQualifiedName = this.ObjectDescription("assembly");
            data.FieldName = this.ObjectDescription(NameKey);

            int count = 0;

            this.ArrayBegin(SerializableDataCollectionKey, out count);
            for (int index = 0; index < count; ++index)
            {
                SerializableData new_data = new SerializableData();
                this.ReadXML(ref new_data, ArrayItemKey);
                data.SerializableDataCollection.Add(new_data);

                this.ArrayNext();
            }
            this.ArrayEnd();

            this.ObjectEnd();
        }
Пример #8
0
        public void CheckSubProperty(Type mainType)
        {
            for (int index = SubPropertyMeta.Count - 1; index >= 0; index--)
            {
                SearchMetaSubProperty sub = SubPropertyMeta[index];
                bool keep = false;

                //PropertyInfo pi = mainType.GetProperty(sub.PropertyName);
                PropertyInfo pi = SerializableData.GetObjPro(sub.PropertyName, mainType);
                if (pi != null && pi.PropertyType.IsGenericType)
                {
                    sub.SubProperty  = pi;
                    sub.PropertyType = pi.PropertyType;

                    foreach (Type tParam in pi.PropertyType.GetGenericArguments())
                    {
                        if (tParam.IsSubclassOf(typeof(SerializableData)))
                        {
                            sub.PropertyGenericType = tParam;
                            keep = true;
                            break;
                        }
                    }
                }

                if (!keep)
                {
                    SubPropertyMeta.RemoveAt(index);
                }
            }
        }
Пример #9
0
    public void ResetData()
    {
        PlayerPrefs.DeleteAll();

        cachedData = new SerializableData();
        Save();
    }
    public static void QueueItemToSave(GameObject saveObject, string serializedGuid)
    {
        SerializableData serializableData = new SerializableData();

        #region Serilaize Object
        #region Serialize Unity classes and types
        serializableData.ID = DataSerialization.Serialize(serializedGuid);
        serializableData.activeInHierarchy = DataSerialization.Serialize(saveObject.activeInHierarchy);
        serializableData.unitySerializableData.sTransform = DataSerialization.Serialize(saveObject.transform.Serialize());
        serializableData.unitySerializableData.sCamera    = (saveObject.GetComponent <Camera>() is var cam && cam != null) ?                                                     DataSerialization.Serialize(cam.Serialize()) : null;

        #region Audio
        serializableData.unitySerializableData.sAudioChorusFilter     = (saveObject.GetComponent <AudioChorusFilter>() is var audioChorusFilter && audioChorusFilter != null) ?              DataSerialization.Serialize(audioChorusFilter.Serialize()) : null;
        serializableData.unitySerializableData.sAudioDistortionFilter = (saveObject.GetComponent <AudioDistortionFilter>() is var audioDistortionFilter && audioDistortionFilter != null) ?  DataSerialization.Serialize(audioDistortionFilter.Serialize()) : null;
        serializableData.unitySerializableData.sAudioEchoFilter       = (saveObject.GetComponent <AudioEchoFilter>() is var audioEchoFilter && audioEchoFilter != null) ?                    DataSerialization.Serialize(audioEchoFilter.Serialize()) : null;
        serializableData.unitySerializableData.sAudioHighPassFilter   = (saveObject.GetComponent <AudioHighPassFilter>() is var audioHighPassFilter && audioHighPassFilter != null) ?        DataSerialization.Serialize(audioHighPassFilter.Serialize()) : null;
        serializableData.unitySerializableData.sAudioListener         = (saveObject.GetComponent <AudioListener>() is var audioListener && audioListener != null) ?                          DataSerialization.Serialize(audioListener.Serialize()) : null;
        serializableData.unitySerializableData.sAudioLowPassFilter    = (saveObject.GetComponent <AudioLowPassFilter>() is var audioLowPassFilter && audioLowPassFilter != null) ?           DataSerialization.Serialize(audioLowPassFilter.Serialize()) : null;
        serializableData.unitySerializableData.sAudioReverbFilter     = (saveObject.GetComponent <AudioReverbFilter>() is var audioReverbFilter && audioReverbFilter != null) ?              DataSerialization.Serialize(audioReverbFilter.Serialize()) : null;
        serializableData.unitySerializableData.sAudioReverbZone       = (saveObject.GetComponent <AudioReverbZone>() is var audioReverbZone && audioReverbZone != null) ?                    DataSerialization.Serialize(audioReverbZone.Serialize()) : null;
        serializableData.unitySerializableData.sAudioSource           = (saveObject.GetComponent <AudioSource>() is var audioSource && audioSource != null) ?                                DataSerialization.Serialize(audioSource.Serialize()) : null;
        #endregion

        #region Effects
        serializableData.unitySerializableData.sLensFlare      = (saveObject.GetComponent <LensFlare>() is var lensFlare && lensFlare != null) ?                                      DataSerialization.Serialize(lensFlare.Serialize()) : null;
        serializableData.unitySerializableData.sLineRenderer   = (saveObject.GetComponent <LineRenderer>() is var lineRenderer && lineRenderer != null) ?                             DataSerialization.Serialize(lineRenderer.Serialize()) : null;
        serializableData.unitySerializableData.sParticleSystem = (saveObject.GetComponent <ParticleSystem>() is var particleSystem && particleSystem != null) ?                       DataSerialization.Serialize(particleSystem.Serialize()) : null;
        serializableData.unitySerializableData.sProjector      = (saveObject.GetComponent <Projector>() is var projector && projector != null) ?                                      DataSerialization.Serialize(projector.Serialize()) : null;
        serializableData.unitySerializableData.sTrailRenderer  = (saveObject.GetComponent <TrailRenderer>() is var trailRenderer && trailRenderer != null) ?                          DataSerialization.Serialize(trailRenderer.Serialize()) : null;
        #endregion
        #endregion

        #region Serialize User Defined Classes
        MonoBehaviour[] saveableScripts = saveObject.GetComponents <MonoBehaviour>();

        foreach (var monoItem in saveableScripts)
        {
            if (monoItem is IUniversalSerializedPersistenceSystem == false)
            {
                continue;
            }

            System.Type thisType   = monoItem.GetType();
            MethodInfo  theMethod  = thisType.GetMethod("Serialize");
            object[]    parameters = new object[1] {
                saveObject
            };
            serializableData.serializedScripts = (List <UserDefinedData>)theMethod.Invoke(monoItem, parameters);
            break;
        }
        #endregion
        #endregion

        #region Serilaize Objects Children
        QueueAllChildren(serializedGuid, saveObject.transform, saveObject.transform, ref serializableData);
        #endregion

        UniversalSerializedPersistenceSystem.serializableDataSet.data.Add(serializableData);
        saveObject.BroadcastMessage("SaveMessage", SendMessageOptions.DontRequireReceiver);
    }
Пример #11
0
 public SerializableData Load()
 {
     if (HasSaveFile())
     {
         try
         {
             BinaryFormatter  binaryFormatter = new BinaryFormatter();
             FileStream       file            = File.Open(filePath, FileMode.Open);
             SerializableData data            = (SerializableData)binaryFormatter.Deserialize(file);
             file.Close();
             this.saveBuffer = data;
             return(data);
         }
         catch
         {
             this.saveBuffer = getDefaultFile();
             return(this.saveBuffer);
         }
     }
     else
     {
         this.saveBuffer = getDefaultFile();
         return(this.saveBuffer);
     }
 }
        public void BuildFor(SerializableData.SerializableObject obj)
        {
            Clear();

            #region SpawnAfter
            {
                var item = new MenuListItem("Spawn After Objective", StaticData.StaticLists.NumberMenu, obj.SpawnAfter);

                item.OnListChanged += (sender, index) =>
                {
                    obj.SpawnAfter = index;
                };

                AddItem(item);
            }
            #endregion 

            #region RemoveAfter
            {
                var item = new MenuListItem("Remove After Objective", StaticData.StaticLists.RemoveAfterList, obj.RemoveAfter);

                item.OnListChanged += (sender, index) =>
                {
                    obj.RemoveAfter = index;
                };

                AddItem(item);
            }
            #endregion
            // TODO: Change NumberMenu to max num of objectives in mission
            RefreshIndex();
        }
Пример #13
0
 public void LoadData()
 {
     if (PlayerPrefs.HasKey("SaveKey"))
     {
         string json = PlayerPrefs.GetString("SaveKey");
         data = JsonUtility.FromJson <SerializableData>(json);
     }
 }
Пример #14
0
 public int DoInsert(SerializableData data, string tableName, bool needKey)
 {
     if (_tranDal != null)
     {
         return(_tranDal.DoInsert(data, tableName, needKey, null));
     }
     return(0);
 }
Пример #15
0
 public int DoDelete(SerializableData data, string tableName, string keyField)
 {
     if (_tranDal != null)
     {
         return(_tranDal.DoDelete(data, tableName, keyField));
     }
     return(0);
 }
Пример #16
0
 public int DoUpdate(SerializableData data, string tableName, string keyField, List <string> ExcludeFields)
 {
     if (_tranDal != null)
     {
         return(_tranDal.DoUpdate(data, tableName, keyField, ExcludeFields));
     }
     return(0);
 }
Пример #17
0
 // Восстанавливает бэкап настроек, заблаговременно сделанный через MakeBackup()
 public void RestoreBackup()
 {
     if (m_dataBackup != null)
     {
         m_data       = m_dataBackup;
         m_dataBackup = null;
     }
 }
Пример #18
0
 public int DoInsert(SerializableData data, string tableName, bool needKey, List <string> ExcludeFields)
 {
     if (_tranDal != null)
     {
         return(_tranDal.DoInsert(data, tableName, needKey, ExcludeFields));
     }
     return(0);
 }
    /// <summary>
    /// Loads JSON files from a given path
    /// </summary>
    /// <param name="path"></param>
    /// <returns></returns>
    private static SerializableData LoadByJSON(string path)
    {
        string           json     = File.ReadAllText(path);
        SerializableData toReturn = JsonUtility.FromJson <SerializableData>(json);

        Debug.Log(toReturn);

        return(toReturn);
    }
Пример #20
0
        public void /*ISerializationManager.*/ Serialize(IData target)
        {
            var serializable = new SerializableData(target);

            using (Stream fileStream = this.GetFileStream(FileMode.Create))
            {
                this._serializer.Serialize(fileStream, serializable);
            }
        }
Пример #21
0
        public EntityStatus GetChildrenStatus()
        {
            var result = EntityStatus.Original;

            foreach (IEntity s in this)
            {
                result = SerializableData.MergerStatus(result, s.GetChildrenStatus());
            }
            return(result);
        }
    // Saves the text data as a serializable object to a binary file
    // All data being saved must either be a basic type (int, string, float, enum...)
    // or a built in type from Unity such as Vector2/3/4 Quaternion or Matrix4x4
    // or a class inheriting from Object or another class marked with "[System.Serializable]"
    // whose internal members meet these requirements.
    public void SaveBinary()
    {
        SerializableData serData = new SerializableData();

        serData.Data = text.text;
        BinaryFormatter formatter = new BinaryFormatter();
        FileStream      file      = File.Create(Application.persistentDataPath + localPath);

        formatter.Serialize(file, serData);
        file.Close();
    }
Пример #23
0
            // Создает экземпляр с значениями по умолчанию. Такие значения будут при первом запуске приложения
            public static SerializableData CreateDefault()
            {
                SerializableData data = new SerializableData();

                // Ставим в null, для того, чтобы при валидации произошло авто-определение на основе текущей культуры
                data.uiLanguage = null;

                data.Validate();

                return(data);
            }
Пример #24
0
        public SerializableData LoadSerializableData(string strSQL, params SqlParameter[] paramters)
        {
            var result = new SerializableData();
            var table  = LoadTable(strSQL, paramters);

            if (table.Rows.Count > 0)
            {
                result = LoadSerializableData(table.Rows[0]);
            }
            return(result);
        }
Пример #25
0
            // Создает экземпляр с значениями по умолчанию. Такие значения будут при первом запуске приложения
            public static SerializableData CreateDefault()
            {
                SerializableData data = new SerializableData();

                // Ставим в null, для того, чтобы при валидации произошло авто-определение на основе текущей культуры
                data.uiLanguage = null;

                data.Validate();

                return data;
            }
Пример #26
0
        private void BuildTypeDictionary(SerializableData data)
        {
            TypeInfo type = new TypeInfo(data.Type, data.AssemblyQualifiedName);
            string   key  = typeDict.GetTypeKey(type);

            typeDict.Add(key, type);

            foreach (var item in data.SerializableDataCollection)
            {
                BuildTypeDictionary(item);
            }
        }
        private Stream CreateLoadStream(string storageKey)
        {
            byte[] bytes  = SerializableData.LoadData(storageKey);
            Stream stream = null;

            if (bytes != null)
            {
                stream = new MemoryStream(bytes);
            }

            return(stream);
        }
        public void SerializeArray <T>(string storageKey, T[] array) where T : IDataContainer
        {
            LogHelper.LogFormat("arraysize {0}", array.Length);
            LogHelper.LogFormat("SerializeArray");
            MemoryStream memoryStream = new MemoryStream();

            LogHelper.LogFormat("memoryStream");
            DataSerializer.SerializeArray <T>(memoryStream, DataSerializer.Mode.Memory, SaveDataVersion, array);
            LogHelper.LogFormat("SerializeArray");
            SerializableData.SaveData(storageKey, memoryStream.ToArray());
            LogHelper.LogFormat("SerializableData.SaveData");
        }
Пример #29
0
    public static void Load()
    {
        allowSave = true;

        if (File.Exists(dataPath))
        {
            FileStream   stream = new FileStream(dataPath, FileMode.Open);
            StreamReader reader = new StreamReader(stream);
            string       json   = reader.ReadToEnd();
            LoadedData = JsonUtility.FromJson <SerializableData>(json);
            reader.Close();
        }
    }
Пример #30
0
        /// <summary>
        /// This will call the normal Render method by passing the converted XmlTree to an XmlDocument.
        /// TODO: need to update this render method to do everything that the obsolete render method does and remove the obsolete method
        /// </summary>
        /// <param name="tree"></param>
        public override void Render(ref XmlTree tree)
        {
            XmlDocument xDoc = new XmlDocument();

            xDoc.LoadXml(tree.ToString(SerializedTreeType.XmlTree));
            Render(ref xDoc);
            tree = SerializableData.Deserialize(xDoc.OuterXml, typeof(XmlTree)) as XmlTree;
            //ensure that the tree type is set! this wouldn't need to be done if BaseTree was implemented properly
            foreach (XmlTreeNode node in tree)
            {
                node.TreeType = this.TreeAlias;
            }
        }
    public void LoadBinary()
    {
        if (File.Exists(Application.persistentDataPath + localPath))
        {
            SerializableData serData   = new SerializableData();
            BinaryFormatter  formatter = new BinaryFormatter();
            FileStream       file      = File.Open(Application.persistentDataPath + localPath, FileMode.Open);
            serData = (SerializableData)formatter.Deserialize(file);
            file.Close();

            text.text = serData.Data;
        }
    }
Пример #32
0
        public void SetValue(string key, object value)
        {
            PropertyInfo _p = SerializableData.GetObjPro(key, this.GetType());

            if (_p != null)
            {
                TypeCode tc = Type.GetTypeCode(_p.PropertyType);
                SetValue(key, value, tc);
            }
            else
            {
                SetValue(key, value, TypeCode.Empty);//默认 不处理
            }
        }
        public void BuildFor(SerializableData.SerializablePickup actor)
        {
            Clear();

            #region SpawnAfter
            {
                var item = new MenuListItem("Spawn Before Objective", StaticData.StaticLists.NumberMenu, actor.SpawnAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.SpawnAfter = index;
                };

                AddItem(item);
            }
            #endregion 
            
            #region Weapons
            {
                var listIndex = actor.Ammo == 0
                    ? StaticData.StaticLists.AmmoChoses.FindIndex(n => n == (dynamic) 9999)
                    : StaticData.StaticLists.AmmoChoses.FindIndex(n => n == (dynamic) actor.Ammo);
                var item = new MenuListItem("Ammo Count", StaticData.StaticLists.AmmoChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((MenuListItem) sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.Ammo = newAmmo;
                };

                AddItem(item);
            }
            #endregion

            #region Respawn
            {
                var item = new MenuCheckboxItem("Respawn", actor.Respawn);
                item.CheckboxEvent += (sender, @checked) =>
                {
                    actor.Respawn = @checked;
                };
                AddItem(item);
            }
            #endregion

            RefreshIndex();
        }
        public void BuildFor(SerializableData.SerializablePed actor)
        {
            Clear();

            #region SpawnAfter
            {
                var item = new MenuListItem("Spawn After Objective", StaticData.StaticLists.NumberMenu, actor.SpawnAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.SpawnAfter = index;
                };

                AddItem(item);
            }
            #endregion 

            #region RemoveAfter
            {
                var item = new MenuListItem("Remove After Objective", StaticData.StaticLists.RemoveAfterList, actor.RemoveAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.RemoveAfter = index;
                };

                AddItem(item);
            }
            #endregion 
            // TODO: Change NumberMenu to max num of objectives in mission

            // Note: if adding items before weapons, change item order in VehiclePropertiesMenu

            #region Weapons
            {
                
                var item = new NativeMenuItem("Weapon");
                var dict = StaticData.WeaponsData.Database.ToDictionary(k => k.Key, k => k.Value.Select(x => x.Item1).ToArray());
                var menu = new CategorySelectionMenu(dict, "Weapon", true, "SELECT WEAPON");
                menu.Build("Melee");
                Children.Add(menu);
                AddItem(item);
                BindMenuToItem(menu, item);
                
                menu.SelectionChanged += (sender, eventargs) =>
                {
                    GameFiber.StartNew(delegate
                    {
                        var hash = StaticData.WeaponsData.Database[menu.CurrentSelectedCategory].First(
                                tuple => tuple.Item1 == menu.CurrentSelectedItem).Item2;
                        NativeFunction.CallByName<uint>("REMOVE_ALL_PED_WEAPONS", actor.GetEntity().Handle.Value, true);
                        ((Ped) actor.GetEntity()).GiveNewWeapon(hash, actor.WeaponAmmo == 0 ? 9999 : actor.WeaponAmmo, true);
                        actor.WeaponHash = hash;
                    });
                };
            }

            {
                var listIndex = actor.WeaponAmmo == 0
                    ? StaticData.StaticLists.AmmoChoses.FindIndex(n => n == (dynamic) 9999)
                    : StaticData.StaticLists.AmmoChoses.FindIndex(n => n == (dynamic) actor.WeaponAmmo);
                var item = new MenuListItem("Ammo Count", StaticData.StaticLists.AmmoChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((MenuListItem) sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.WeaponAmmo = newAmmo;
                    if(actor.WeaponHash == 0) return;
                    NativeFunction.CallByName<uint>("REMOVE_ALL_PED_WEAPONS", actor.GetEntity().Handle.Value, true);
                    ((Ped)actor.GetEntity()).GiveNewWeapon(actor.WeaponHash, newAmmo, true);
                };

                AddItem(item);
            }
            #endregion

            #region Health
            {
                var listIndex = actor.Health == 0
                    ? StaticData.StaticLists.HealthArmorChoses.FindIndex(n => n == (dynamic)200)
                    : StaticData.StaticLists.HealthArmorChoses.FindIndex(n => n == (dynamic)actor.Health);
                var item = new MenuListItem("Health", StaticData.StaticLists.HealthArmorChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((MenuListItem)sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.Health = newAmmo;
                };

                AddItem(item);
            }
            #endregion

            #region Armor
            {
                var listIndex = StaticData.StaticLists.HealthArmorChoses.FindIndex(n => n == (dynamic)actor.Armor);
                var item = new MenuListItem("Armor", StaticData.StaticLists.HealthArmorChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((MenuListItem)sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.Armor = newAmmo;
                };

                AddItem(item);
            }
            #endregion

            #region Accuracy
            {
                var listIndex = StaticData.StaticLists.AccuracyList.FindIndex(n => n == (dynamic)actor.Accuracy);
                var item = new MenuListItem("Accuracy", StaticData.StaticLists.AccuracyList, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((MenuListItem)sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.Accuracy = newAmmo;
                };

                AddItem(item);
            }
            #endregion

            #region Relationship
            {
                var item = new MenuListItem("Relationship", StaticData.StaticLists.RelationshipGroups, actor.RelationshipGroup);

                item.OnListChanged += (sender, index) =>
                {
                    actor.RelationshipGroup = index;
                };

                AddItem(item);
            }
            #endregion

            #region Behaviour
            {
                var wpyItem = new NativeMenuItem("Waypoints");

                {
                    var waypMenu = new WaypointEditor(actor);
                    BindMenuToItem(waypMenu.CreateWaypointMenu, wpyItem);

                    Vector3 camPos = new Vector3();
                    Rotator camRot = new Rotator();

                    wpyItem.Activated += (sender, selectedItem) =>
                    {
                        camPos = Editor.MainCamera.Position;
                        camRot = Editor.MainCamera.Rotation;

                        waypMenu.Enter();
                        Editor.WaypointEditor = waypMenu;
                    };

                    waypMenu.OnEditorExit += (sender, args) =>
                    {
                        Editor.WaypointEditor = null;
                        Editor.DisableControlEnabling = true;
                        if (camPos != new Vector3())
                        {
                            Editor.MainCamera.Position = camPos;
                            Editor.MainCamera.Rotation = camRot;
                        }
                    };
                }

                if (actor.Behaviour != 4) // Follow Waypoints
                    wpyItem.Enabled = false;

                var item = new MenuListItem("Behaviour", StaticData.StaticLists.Behaviour, actor.Behaviour);

                item.OnListChanged += (sender, index) =>
                {
                    actor.Behaviour = index;
                    wpyItem.Enabled = index == 4;
                };

                AddItem(item);
                AddItem(wpyItem);
            }
            #endregion

            #region FailOnDeath
            {
                var item = new MenuCheckboxItem("Mission Fail On Death", actor.FailMissionOnDeath);
                item.CheckboxEvent += (sender, @checked) =>
                {
                    actor.FailMissionOnDeath = @checked;
                };
                AddItem(item);
            }
            #endregion

            RefreshIndex();
        }
Пример #35
0
 // Делает бэкап настроек
 // После этого действия можно менять настройки и в случае необходимости восстановить их через RestoreBackup()
 public void MakeBackup()
 {
     m_dataBackup = m_data.Clone() as SerializableData;
 }
Пример #36
0
 // Восстанавливает бэкап настроек, заблаговременно сделанный через MakeBackup()
 public void RestoreBackup()
 {
     if (m_dataBackup != null)
     {
         m_data = m_dataBackup;
         m_dataBackup = null;
     }
 }
        public void BuildFor(SerializableData.Objectives.SerializableVehicleObjective actor)
        {
            Clear();

            #region SpawnAfter
            {
                var item = new MenuListItem("Spawn After Objective", StaticData.StaticLists.NumberMenu, actor.SpawnAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.SpawnAfter = index;
                };

                AddItem(item);
            }
            #endregion

            #region ObjectiveIndex
            {
                var item = new MenuListItem("Objective Index", StaticData.StaticLists.ObjectiveIndexList, actor.ActivateAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.ActivateAfter = index;


                    if (string.IsNullOrEmpty(Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter]))
                    {
                        MenuItems[2].SetRightBadge(NativeMenuItem.BadgeStyle.Alert);
                        MenuItems[2].SetRightLabel("");
                    }
                    else
                    {
                        var title = Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter];
                        MenuItems[2].SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                        MenuItems[2].SetRightBadge(NativeMenuItem.BadgeStyle.None);
                    }
                };

                AddItem(item);
            }
            #endregion 
            // TODO: Change NumberMenu to max num of objectives in mission

            // Note: if adding items before weapons, change item order in VehiclePropertiesMenu
            
            #region Objective Name
            {
                var item = new NativeMenuItem("Objective Name");
                if (string.IsNullOrEmpty(Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter]))
                    item.SetRightBadge(NativeMenuItem.BadgeStyle.Alert);
                else
                {
                    var title = Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter];
                    item.SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                }

                item.Activated += (sender, selectedItem) =>
                {
                    GameFiber.StartNew(delegate
                    {
                        ResetKey(Common.MenuControls.Back);
                        Editor.DisableControlEnabling = true;
                        string title = Util.GetUserInput();
                        if (string.IsNullOrEmpty(title))
                        {
                            item.SetRightBadge(NativeMenuItem.BadgeStyle.Alert);
                            Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter] = "";
                            SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                            Editor.DisableControlEnabling = false;
                            return;
                        }
                        item.SetRightBadge(NativeMenuItem.BadgeStyle.None);
                        title = Regex.Replace(title, "-=", "~");
                        Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter] = title;
                        selectedItem.SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                        SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                    });
                };
                AddItem(item);
            }
            #endregion

            #region Health
            {
                var listIndex = actor.Health == 0
                    ? StaticData.StaticLists.VehicleHealthChoses.FindIndex(n => n == (dynamic)1000)
                    : StaticData.StaticLists.VehicleHealthChoses.FindIndex(n => n == (dynamic)actor.Health);

                var item = new MenuListItem("Health", StaticData.StaticLists.VehicleHealthChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((MenuListItem)sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.Health = newAmmo;
                };

                AddItem(item);
            }
            #endregion
            
            #region Passengers
            {
                var item = new NativeMenuItem("Occupants");
                AddItem(item);
                if (((Vehicle)actor.GetVehicle()).HasOccupants)
                {
                    var newMenu = new UIMenu("", "OCCUPANTS", new Point(0, -107));
                    newMenu.MouseControlsEnabled = false;
                    newMenu.SetBannerType(new ResRectangle());
                    var occupants = ((Vehicle)actor.GetVehicle()).Occupants;
                    for (int i = 0; i < occupants.Length; i++)
                    {
                        var ped = occupants[i];
                        var type = Editor.GetEntityType(ped);
                        if (type == Editor.EntityType.NormalActor)
                        {
                            var act = Editor.CurrentMission.Actors.FirstOrDefault(a => a.GetEntity().Handle.Value == ped.Handle.Value);
                            if (act == null) continue;
                            var routedItem = new NativeMenuItem(i == 0 ? "Driver" : "Passenger #" + i);
                            routedItem.Activated += (sender, selectedItem) =>
                            {
                                Editor.DisableControlEnabling = true;
                                Editor.EnableBasicMenuControls = true;
                                var propMenu = new ActorPropertiesMenu();
                                propMenu.BuildFor(act);
                                propMenu.MenuItems[2].Enabled = false;
                                propMenu.OnMenuClose += _ =>
                                {
                                    newMenu.Visible = true;
                                };

                                newMenu.Visible = false;
                                propMenu.Visible = true;
                                GameFiber.StartNew(delegate
                                {
                                    while (propMenu.Visible)
                                    {
                                        propMenu.ProcessControl();
                                        propMenu.Draw();
                                        propMenu.Process();
                                        GameFiber.Yield();
                                    }
                                });

                            };
                            newMenu.AddItem(routedItem);
                        }
                        else if (type == Editor.EntityType.ObjectiveActor)
                        {
                            var act = Editor.CurrentMission.Objectives
                                .OfType<SerializableActorObjective>()
                                .FirstOrDefault(a => a.GetPed().Handle.Value == ped.Handle.Value);
                            if (act == null) continue;
                            var routedItem = new NativeMenuItem(i == 0 ? "Objective Driver" : "Objective Passenger #" + i);
                            routedItem.Activated += (sender, selectedItem) =>
                            {
                                Editor.DisableControlEnabling = true;
                                Editor.EnableBasicMenuControls = true;
                                var propMenu = new ActorObjectivePropertiesMenu();
                                propMenu.BuildFor(act);
                                propMenu.MenuItems[2].Enabled = false;
                                propMenu.OnMenuClose += _ =>
                                {
                                    newMenu.Visible = true;
                                };

                                newMenu.Visible = false;
                                propMenu.Visible = true;
                                GameFiber.StartNew(delegate
                                {
                                    while (propMenu.Visible)
                                    {
                                        propMenu.ProcessControl();
                                        propMenu.Draw();
                                        propMenu.Process();
                                        GameFiber.Yield();
                                    }
                                });

                            };
                            newMenu.AddItem(routedItem);
                        }
                        
                    }
                    BindMenuToItem(newMenu, item);
                    newMenu.RefreshIndex();
                    Children.Add(newMenu);
                }
                else
                {
                    item.Enabled = false;
                }

            }
            #endregion

            #region Show Health Bar
            {
                var item = new MenuCheckboxItem("Show Healthbar", actor.ShowHealthBar);
                AddItem(item);

                item.CheckboxEvent += (sender, @checked) =>
                {
                    actor.ShowHealthBar = @checked;
                    MenuItems[6].Enabled = @checked;
                };
            }
            #endregion

            #region Bar Name
            {
                var item = new NativeMenuItem("Healthbar Label");
                AddItem(item);

                if (!actor.ShowHealthBar)
                    item.Enabled = false;

                if (string.IsNullOrEmpty(actor.Name) && actor.ShowHealthBar)
                    actor.Name = "HEALTH";
                if (actor.ShowHealthBar)
                    item.SetRightLabel(actor.Name.Length > 20 ? actor.Name.Substring(0, 20) : actor.Name);


                item.Activated += (sender, selectedItem) =>
                {
                    GameFiber.StartNew(delegate
                    {
                        ResetKey(Common.MenuControls.Back);
                        Editor.DisableControlEnabling = true;
                        string title = Util.GetUserInput();
                        if (string.IsNullOrEmpty(title))
                        {
                            actor.Name = "HEALTH";
                            item.SetRightLabel(actor.Name.Length > 20 ? actor.Name.Substring(0, 20) : actor.Name);
                            SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                            Editor.DisableControlEnabling = false;
                            return;
                        }
                        title = Regex.Replace(title, "-=", "~");
                        actor.Name = title;
                        item.SetRightLabel(actor.Name.Length > 20 ? actor.Name.Substring(0, 20) : actor.Name);
                        SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                    });
                };
            }
            #endregion

            #region Objective Type
            {
                var item = new MenuListItem("Objective Type", StaticData.StaticLists.ObjectiveTypeList, actor.ObjectiveType);

                item.OnListChanged += (sender, index) =>
                {
                    actor.ObjectiveType = index;
                };
                AddItem(item);
            }
            #endregion

            RefreshIndex();
        }
Пример #38
0
        public Preferences(string fileName)
        {
            m_fileName = fileName;
            
            if (File.Exists(m_fileName))
            {
                // Если файл с настройками существует - прочитаем его в m_data

                XmlSerializer serializer = new XmlSerializer(typeof(SerializableData));

                using (Stream fileStream = new FileStream(m_fileName, FileMode.Open))
                {
                    m_data = serializer.Deserialize(fileStream) as SerializableData;
                }

                // Убираем с прочитанных данных косяки, которые мог внести туда пользователь вручную
                // В случае если были косяки, пересохраняем исправленные данные обратно в файл
                if (m_data.Validate())
                    Save(false);
            }
            else
            {
                // Если файла с настройками не существует, создадим его и запишем в него найстройки по умолчанию (которые задаются в конструкторе SerializableData)
                m_data = SerializableData.CreateDefault();
                Save(false);
            }
        }
        public void BuildFor(SerializableData.Objectives.SerializableMarker actor)
        {
            Clear();

            #region SpawnAfter
            {
                var item = new MenuListItem("Spawn After Objective", StaticData.StaticLists.NumberMenu, actor.SpawnAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.SpawnAfter = index;
                };

                AddItem(item);
            }
            #endregion

            #region ObjectiveIndex
            {
                var item = new MenuListItem("Objective Index", StaticData.StaticLists.ObjectiveIndexList, actor.ActivateAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.ActivateAfter = index;


                    if (string.IsNullOrEmpty(Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter]))
                    {
                        MenuItems[2].SetRightBadge(NativeMenuItem.BadgeStyle.Alert);
                        MenuItems[2].SetRightLabel("");
                    }
                    else
                    {
                        var title = Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter];
                        MenuItems[2].SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                        MenuItems[2].SetRightBadge(NativeMenuItem.BadgeStyle.None);
                    }
                };

                AddItem(item);
            }
            #endregion
            // TODO: Change NumberMenu to max num of objectives in mission

            // Note: if adding items before weapons, change item order in VehiclePropertiesMenu

            #region Objective Name
            {
                var item = new NativeMenuItem("Objective Name");
                if (string.IsNullOrEmpty(Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter]))
                    item.SetRightBadge(NativeMenuItem.BadgeStyle.Alert);
                else
                {
                    var title = Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter];
                    item.SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                }

                item.Activated += (sender, selectedItem) =>
                {
                    GameFiber.StartNew(delegate
                    {
                        ResetKey(Common.MenuControls.Back);
                        Editor.DisableControlEnabling = true;
                        string title = Util.GetUserInput();
                        if (string.IsNullOrEmpty(title))
                        {
                            item.SetRightBadge(NativeMenuItem.BadgeStyle.Alert);
                            Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter] = "";
                            SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                            Editor.DisableControlEnabling = false;
                            return;
                        }
                        item.SetRightBadge(NativeMenuItem.BadgeStyle.None);
                        title = Regex.Replace(title, "-=", "~");
                        Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter] = title;
                        selectedItem.SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                        SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                    });
                };
                AddItem(item);
            }
            #endregion

            #region Color

            {
                var col = Color.FromArgb(actor.Alpha, (int) actor.Color.X, (int) actor.Color.Y, (int) actor.Color.Z).ToKnownColor();
                var idx = StaticData.StaticLists.KnownColors.IndexOf(col);
                var item = new MenuListItem("Color", StaticData.StaticLists.KnownColors, idx == -1 ? 0 : idx);

                item.OnListChanged += (sender, index) =>
                {
                    var newCol = (Color)Color.FromKnownColor(StaticData.StaticLists.KnownColors[index]);
                    actor.Alpha = newCol.A;
                    actor.Color = new Vector3(newCol.R, newCol.G, newCol.B);
                };

                AddItem(item);
            }
            #endregion

            // TODO: Change NumberMenu to max num of objectives in mission
            RefreshIndex();
        }
        public void BuildFor(SerializableData.Objectives.SerializablePickupObjective actor)
        {
            Clear();

            #region SpawnAfter
            {
                var item = new UIMenuListItem("Spawn After Objective", StaticData.StaticLists.NumberMenu, actor.SpawnAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.SpawnAfter = index;
                };

                AddItem(item);
            }
            #endregion

            #region ObjectiveIndex
            {
                var item = new UIMenuListItem("Objective Index", StaticData.StaticLists.ObjectiveIndexList, actor.ActivateAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.ActivateAfter = index;

                    if (string.IsNullOrEmpty(Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter]))
                    {
                        MenuItems[2].SetRightBadge(UIMenuItem.BadgeStyle.Alert);
                        MenuItems[2].SetRightLabel("");
                    }
                    else
                    {
                        var title = Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter];
                        MenuItems[2].SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                        MenuItems[2].SetRightBadge(UIMenuItem.BadgeStyle.None);
                    }
                };

                AddItem(item);
            }
            #endregion
            // TODO: Change NumberMenu to max num of objectives in mission

            // Note: if adding items before weapons, change item order in VehiclePropertiesMenu

            #region Objective Name
            {
                var item = new UIMenuItem("Objective Name");
                if (string.IsNullOrEmpty(Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter]))
                    item.SetRightBadge(UIMenuItem.BadgeStyle.Alert);
                else
                {
                    var title = Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter];
                    item.SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                }

                item.Activated += (sender, selectedItem) =>
                {
                    GameFiber.StartNew(delegate
                    {
                        ResetKey(Common.MenuControls.Back);
                        Editor.DisableControlEnabling = true;
                        string title = Util.GetUserInput(this);
                        if (string.IsNullOrEmpty(title))
                        {
                            item.SetRightBadge(UIMenuItem.BadgeStyle.Alert);
                            Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter] = "";
                            SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                            Editor.DisableControlEnabling = false;
                            return;
                        }
                        item.SetRightBadge(UIMenuItem.BadgeStyle.None);
                        title = Regex.Replace(title, "-=", "~");
                        Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter] = title;
                        selectedItem.SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                        SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                    });
                };
                AddItem(item);
            }
            #endregion

            #region Weapons
            {
                var listIndex = actor.Ammo == 0
                    ? StaticData.StaticLists.AmmoChoses.FindIndex(n => n == (dynamic) 9999)
                    : StaticData.StaticLists.AmmoChoses.FindIndex(n => n == (dynamic) actor.Ammo);
                var item = new UIMenuListItem("Ammo Count", StaticData.StaticLists.AmmoChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((UIMenuListItem) sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.Ammo = newAmmo;
                };

                AddItem(item);
            }
            #endregion

            #region Respawn
            {
                var item = new UIMenuCheckboxItem("Respawn", actor.Respawn);
                item.CheckboxEvent += (sender, @checked) =>
                {
                    actor.Respawn = @checked;
                };
                AddItem(item);
            }
            #endregion

            RefreshIndex();
        }
Пример #41
0
 private void Save(string filename, SerializableData.Level level)
 {
     var serializer = new XmlSerializer(typeof(SerializableData.Level));
     var encoding = Encoding.GetEncoding("UTF-8");
     using (var stream = new StreamWriter(filename, false, encoding))
     {
         serializer.Serialize(stream, level);
     }
 }
Пример #42
0
        public void BuildFor(SerializableData.SerializableVehicle veh)
        {
            Clear();

            #region SpawnAfter
            {
                var item = new UIMenuListItem("Spawn After Objective", StaticData.StaticLists.NumberMenu, veh.SpawnAfter);

                item.OnListChanged += (sender, index) =>
                {
                    veh.SpawnAfter = index;
                };

                AddItem(item);
            }
            #endregion

            #region RemoveAfter
            {
                var item = new UIMenuListItem("Remove After Objective", StaticData.StaticLists.RemoveAfterList, veh.RemoveAfter);

                item.OnListChanged += (sender, index) =>
                {
                    veh.RemoveAfter = index;
                };

                AddItem(item);
            }
            #endregion
            // TODO: Change NumberMenu to max num of objectives in mission

            #region Health
            {
                var listIndex = veh.Health == 0
                    ? StaticData.StaticLists.VehicleHealthChoses.FindIndex(n => n == (dynamic)1000)
                    : StaticData.StaticLists.VehicleHealthChoses.FindIndex(n => n == (dynamic)veh.Health);

                var item = new UIMenuListItem("Health", StaticData.StaticLists.VehicleHealthChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((UIMenuListItem)sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    veh.Health = newAmmo;
                };

                AddItem(item);
            }
            #endregion

            #region FailOnDeath
            {
                var item = new UIMenuCheckboxItem("Mission Fail On Death", veh.FailMissionOnDeath);
                item.CheckboxEvent += (sender, @checked) =>
                {
                    veh.FailMissionOnDeath = @checked;
                };
                AddItem(item);
            }
            #endregion

            #region Passengers
            {
                var item = new UIMenuItem("Occupants");
                AddItem(item);
                if (((Vehicle)veh.GetEntity()).HasOccupants)
                {
                    var newMenu = new UIMenu("", "OCCUPANTS", new Point(0, -107));
                    newMenu.MouseControlsEnabled = false;
                    newMenu.SetBannerType(new ResRectangle());
                    var occupants = ((Vehicle)veh.GetEntity()).Occupants;
                    for (int i = 0; i < occupants.Length; i++)
                    {
                        var ped = occupants[i];
                        var type = Editor.GetEntityType(ped);
                        if (type == Editor.EntityType.NormalActor)
                        {
                            var act = Editor.CurrentMission.Actors.FirstOrDefault(a => a.GetEntity().Handle.Value == ped.Handle.Value);
                            if (act == null) continue;
                            var routedItem = new UIMenuItem(i == 0 ? "Driver" : "Passenger #" + i);
                            routedItem.Activated += (sender, selectedItem) =>
                            {
                                Editor.DisableControlEnabling = true;
                                Editor.EnableBasicMenuControls = true;
                                var propMenu = new ActorPropertiesMenu();
                                propMenu.BuildFor(act);
                                propMenu.MenuItems[2].Enabled = false;
                                propMenu.OnMenuClose += _ =>
                                {
                                    newMenu.Visible = true;
                                };

                                newMenu.Visible = false;
                                propMenu.Visible = true;
                                GameFiber.StartNew(delegate
                                {
                                    while (propMenu.Visible)
                                    {
                                        propMenu.ProcessControl();
                                        propMenu.Draw();
                                        propMenu.Process();
                                        GameFiber.Yield();
                                    }
                                });

                            };
                            newMenu.AddItem(routedItem);
                        }
                        else if (type == Editor.EntityType.ObjectiveActor)
                        {
                            var act = Editor.CurrentMission.Objectives
                                .OfType<SerializableActorObjective>()
                                .FirstOrDefault(a => a.GetPed().Handle.Value == ped.Handle.Value);
                            if (act == null) continue;
                            var routedItem = new UIMenuItem(i == 0 ? "Objective Driver" : "Objective Passenger #" + i);
                            routedItem.Activated += (sender, selectedItem) =>
                            {
                                Editor.DisableControlEnabling = true;
                                Editor.EnableBasicMenuControls = true;
                                var propMenu = new ActorObjectivePropertiesMenu();
                                propMenu.BuildFor(act);
                                propMenu.MenuItems[2].Enabled = false;
                                propMenu.OnMenuClose += _ =>
                                {
                                    newMenu.Visible = true;
                                };

                                newMenu.Visible = false;
                                propMenu.Visible = true;
                                GameFiber.StartNew(delegate
                                {
                                    while (propMenu.Visible)
                                    {
                                        propMenu.ProcessControl();
                                        propMenu.Draw();
                                        propMenu.Process();
                                        GameFiber.Yield();
                                    }
                                });

                            };
                            newMenu.AddItem(routedItem);
                        }

                    }
                    BindMenuToItem(newMenu, item);
                    newMenu.RefreshIndex();
                    Children.Add(newMenu);
                }
                else
                {
                    item.Enabled = false;
                }

            }
            #endregion

            RefreshIndex();
        }
        public void BuildFor(SerializableData.Objectives.SerializableActorObjective actor)
        {
            Clear();

            #region SpawnAfter
            {
                var item = new MenuListItem("Spawn After Objective", StaticData.StaticLists.NumberMenu, actor.SpawnAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.SpawnAfter = index;
                };

                AddItem(item);
            }
            #endregion

            #region ObjectiveIndex
            {
                var item = new MenuListItem("Objective Index", StaticData.StaticLists.ObjectiveIndexList, actor.ActivateAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.ActivateAfter = index;


                    if (string.IsNullOrEmpty(Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter]))
                    {
                        MenuItems[4].SetRightBadge(NativeMenuItem.BadgeStyle.Alert);
                        MenuItems[4].SetRightLabel("");
                    }
                    else
                    {
                        var title = Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter];
                        MenuItems[4].SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                        MenuItems[4].SetRightBadge(NativeMenuItem.BadgeStyle.None);
                    }
                };

                AddItem(item);
            }
            #endregion 
            // TODO: Change NumberMenu to max num of objectives in mission

            // Note: if adding items before weapons, change item order in VehiclePropertiesMenu

            #region Weapons
            {
                
                var item = new NativeMenuItem("Weapon");
                var dict = StaticData.WeaponsData.Database.ToDictionary(k => k.Key, k => k.Value.Select(x => x.Item1).ToArray());
                var menu = new CategorySelectionMenu(dict, "Weapon", true, "SELECT WEAPON");
                menu.Build("Melee");
                Children.Add(menu);
                AddItem(item);
                BindMenuToItem(menu, item);
                
                menu.SelectionChanged += (sender, eventargs) =>
                {
                    GameFiber.StartNew(delegate
                    {
                        var hash = StaticData.WeaponsData.Database[menu.CurrentSelectedCategory].First(
                                tuple => tuple.Item1 == menu.CurrentSelectedItem).Item2;
                        NativeFunction.CallByName<uint>("REMOVE_ALL_PED_WEAPONS", actor.GetPed().Handle.Value, true);
                        actor.GetPed().GiveNewWeapon(hash, actor.WeaponAmmo == 0 ? 9999 : actor.WeaponAmmo, true);
                        actor.WeaponHash = hash;
                    });
                };
            }

            {
                var listIndex = actor.WeaponAmmo == 0
                    ? StaticData.StaticLists.AmmoChoses.FindIndex(n => n == (dynamic) 9999)
                    : StaticData.StaticLists.AmmoChoses.FindIndex(n => n == (dynamic) actor.WeaponAmmo);
                var item = new MenuListItem("Ammo Count", StaticData.StaticLists.AmmoChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((MenuListItem) sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.WeaponAmmo = newAmmo;
                    if(actor.WeaponHash == 0) return;
                    NativeFunction.CallByName<uint>("REMOVE_ALL_PED_WEAPONS", actor.GetPed().Handle.Value, true);
                    ((Ped)actor.GetPed()).GiveNewWeapon(actor.WeaponHash, newAmmo, true);
                };

                AddItem(item);
            }
            #endregion

            #region Objective Name
            {
                var item = new NativeMenuItem("Objective Name");
                if (string.IsNullOrEmpty(Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter]))
                    item.SetRightBadge(NativeMenuItem.BadgeStyle.Alert);
                else
                {
                    var title = Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter];
                    item.SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                }

                item.Activated += (sender, selectedItem) =>
                {
                    GameFiber.StartNew(delegate
                    {
                        ResetKey(Common.MenuControls.Back);
                        Editor.DisableControlEnabling = true;
                        string title = Util.GetUserInput();
                        if (string.IsNullOrEmpty(title))
                        {
                            item.SetRightBadge(NativeMenuItem.BadgeStyle.Alert);
                            Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter] = "";
                            SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                            Editor.DisableControlEnabling = false;
                            return;
                        }
                        item.SetRightBadge(NativeMenuItem.BadgeStyle.None);
                        title = Regex.Replace(title, "-=", "~");
                        Editor.CurrentMission.ObjectiveNames[actor.ActivateAfter] = title;
                        selectedItem.SetRightLabel(title.Length > 20 ? title.Substring(0, 20) + "..." : title);
                        SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                    });
                };
                AddItem(item);
            }
            #endregion

            #region Health
            {
                var listIndex = actor.Health == 0
                    ? StaticData.StaticLists.HealthArmorChoses.FindIndex(n => n == (dynamic)200)
                    : StaticData.StaticLists.HealthArmorChoses.FindIndex(n => n == (dynamic)actor.Health);
                var item = new MenuListItem("Health", StaticData.StaticLists.HealthArmorChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((MenuListItem)sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.Health = newAmmo;
                };

                AddItem(item);
            }
            #endregion

            #region Armor
            {
                var listIndex = StaticData.StaticLists.HealthArmorChoses.FindIndex(n => n == (dynamic)actor.Armor);
                var item = new MenuListItem("Armor", StaticData.StaticLists.HealthArmorChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((MenuListItem)sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.Armor = newAmmo;
                };

                AddItem(item);
            }
            #endregion

            #region Accuracy
            {
                var listIndex = StaticData.StaticLists.AccuracyList.FindIndex(n => n == (dynamic)actor.Accuracy);
                var item = new MenuListItem("Accuracy", StaticData.StaticLists.AccuracyList, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((MenuListItem)sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.Accuracy = newAmmo;
                };

                AddItem(item);
            }
            #endregion

            #region Relationship
            {
                var item = new MenuListItem("Relationship", StaticData.StaticLists.RelationshipGroups, actor.RelationshipGroup);

                item.OnListChanged += (sender, index) =>
                {
                    actor.RelationshipGroup = index;
                };

                AddItem(item);
            }
            #endregion

            #region Behaviour
            {
                var wpyItem = new NativeMenuItem("Waypoints");

                {
                    var waypMenu = new WaypointEditor(actor);
                    BindMenuToItem(waypMenu.CreateWaypointMenu, wpyItem);

                    Vector3 camPos = new Vector3();
                    Rotator camRot = new Rotator();

                    wpyItem.Activated += (sender, selectedItem) =>
                    {
                        camPos = Editor.MainCamera.Position;
                        camRot = Editor.MainCamera.Rotation;

                        waypMenu.Enter();
                        Editor.WaypointEditor = waypMenu;
                    };

                    waypMenu.OnEditorExit += (sender, args) =>
                    {
                        Editor.WaypointEditor = null;
                        Editor.DisableControlEnabling = true;
                        if (camPos != new Vector3())
                        {
                            Editor.MainCamera.Position = camPos;
                            Editor.MainCamera.Rotation = camRot;
                        }
                    };
                }

                if (actor.Behaviour != 4) // Follow Waypoints
                    wpyItem.Enabled = false;

                var item = new MenuListItem("Behaviour", StaticData.StaticLists.Behaviour, actor.Behaviour);

                item.OnListChanged += (sender, index) =>
                {
                    actor.Behaviour = index;
                    wpyItem.Enabled = index == 4;
                };

                AddItem(item);
                AddItem(wpyItem);
            }
            #endregion

            #region Show Health Bar
            {
                var item = new MenuCheckboxItem("Show Healthbar", actor.ShowHealthBar);
                AddItem(item);

                item.CheckboxEvent += (sender, @checked) =>
                {
                    actor.ShowHealthBar = @checked;
                    MenuItems[12].Enabled = @checked;
                };
            }
            #endregion

            #region Bar Name
            {
                var item = new NativeMenuItem("Healthbar Label");
                AddItem(item);

                if (!actor.ShowHealthBar)
                    item.Enabled = false;

                if (string.IsNullOrEmpty(actor.Name) && actor.ShowHealthBar)
                    actor.Name = "HEALTH";
                if(actor.ShowHealthBar)
                    item.SetRightLabel(actor.Name.Length > 20 ? actor.Name.Substring(0, 20) : actor.Name);

                
                item.Activated += (sender, selectedItem) => 
                {
                    GameFiber.StartNew(delegate
                    {
                        ResetKey(Common.MenuControls.Back);
                        Editor.DisableControlEnabling = true;
                        string title = Util.GetUserInput();
                        if (string.IsNullOrEmpty(title))
                        {
                            actor.Name = "HEALTH";
                            item.SetRightLabel(actor.Name.Length > 20 ? actor.Name.Substring(0, 20) : actor.Name);
                            SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                            Editor.DisableControlEnabling = false;
                            return;
                        }
                        title = Regex.Replace(title, "-=", "~");
                        actor.Name = title;
                        item.SetRightLabel(actor.Name.Length > 20 ? actor.Name.Substring(0, 20) : actor.Name);
                        SetKey(Common.MenuControls.Back, GameControl.CellphoneCancel, 0);
                    });
                };
            }
            #endregion

            RefreshIndex();
        }
        public void BuildFor(SerializableData.SerializableSpawnpoint actor)
        {
            Clear();

            #region SpawnAfter
            {
                var item = new UIMenuListItem("Spawn Before Objective", StaticData.StaticLists.NumberMenu, actor.SpawnAfter);

                item.OnListChanged += (sender, index) =>
                {
                    actor.SpawnAfter = index;
                };

                AddItem(item);
            }
            #endregion

            #region Weapons
            {

                var item = new UIMenuItem("Weapon");
                var dict = StaticData.WeaponsData.Database.ToDictionary(k => k.Key, k => k.Value.Select(x => x.Item1).ToArray());
                var menu = new CategorySelectionMenu(dict, "Weapon", true, "SELECT WEAPON");
                menu.Build("Melee");
                Children.Add(menu);
                AddItem(item);
                BindMenuToItem(menu, item);

                menu.SelectionChanged += (sender, eventargs) =>
                {
                    GameFiber.StartNew(delegate
                    {
                        var hash = StaticData.WeaponsData.Database[menu.CurrentSelectedCategory].First(
                                tuple => tuple.Item1 == menu.CurrentSelectedItem).Item2;
                        NativeFunction.CallByName<uint>("REMOVE_ALL_PED_WEAPONS", actor.GetEntity().Handle.Value, true);
                        ((Ped) actor.GetEntity()).Inventory.GiveNewWeapon(hash, (short)(actor.WeaponAmmo == 0 ? 9999 : actor.WeaponAmmo), true);
                        actor.WeaponHash = hash;
                    });
                };
            }

            {
                var listIndex = actor.WeaponAmmo == 0
                    ? StaticData.StaticLists.AmmoChoses.FindIndex(n => n == (dynamic) 9999)
                    : StaticData.StaticLists.AmmoChoses.FindIndex(n => n == (dynamic) actor.WeaponAmmo);
                var item = new UIMenuListItem("Ammo Count", StaticData.StaticLists.AmmoChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((UIMenuListItem) sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.WeaponAmmo = newAmmo;
                    if(actor.WeaponHash == 0) return;
                    NativeFunction.CallByName<uint>("REMOVE_ALL_PED_WEAPONS", actor.GetEntity().Handle.Value, true);
                    ((Ped)actor.GetEntity()).Inventory.GiveNewWeapon(actor.WeaponHash, (short)newAmmo, true);
                };

                AddItem(item);
            }
            #endregion

            #region Health
            {
                var listIndex = actor.Health == 0
                    ? StaticData.StaticLists.HealthArmorChoses.FindIndex(n => n == (dynamic)200)
                    : StaticData.StaticLists.HealthArmorChoses.FindIndex(n => n == (dynamic)actor.Health);
                var item = new UIMenuListItem("Health", StaticData.StaticLists.HealthArmorChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((UIMenuListItem)sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.Health = newAmmo;
                };

                AddItem(item);
            }
            #endregion

            #region Armor
            {
                var listIndex = StaticData.StaticLists.HealthArmorChoses.FindIndex(n => n == (dynamic)actor.Armor);
                var item = new UIMenuListItem("Armor", StaticData.StaticLists.HealthArmorChoses, listIndex);

                item.OnListChanged += (sender, index) =>
                {
                    int newAmmo = int.Parse(((UIMenuListItem)sender).IndexToItem(index).ToString(), CultureInfo.InvariantCulture);
                    actor.Armor = newAmmo;
                };

                AddItem(item);
            }
            #endregion

            RefreshIndex();
        }