Exemple #1
0
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadEncodedInt();

            if (reader.ReadInt() == 1)
            {
                PlayerMobile             pm   = reader.ReadMobile <PlayerMobile>();
                GreaterBraceletOfBinding brac = reader.ReadItem <GreaterBraceletOfBinding>();

                if (pm != null && brac != null)
                {
                    Pending = new BindEntry(pm, brac);
                }
            }

            for (int i = 0; i < Friends.Length; i++)
            {
                if (reader.ReadInt() == 0)
                {
                    continue;
                }

                PlayerMobile             pm   = reader.ReadMobile <PlayerMobile>();
                GreaterBraceletOfBinding brac = reader.ReadItem <GreaterBraceletOfBinding>();

                if (pm != null && brac != null)
                {
                    Friends[i] = new BindEntry(pm, brac);
                }
            }
        }
Exemple #2
0
        static bool AreCompatible(BindEntry first, BindEntry second)
        {
            // Если разные ключи, то совместимы точно.
            if (first.PrimaryKey != second.PrimaryKey)
            {
                return(true);
            }
            // Если одинаковые ключи и оба - метаскрипты, то несовместимы
            if (first.IsMetaScript && second.IsMetaScript)
            {
                return(false);
            }

            if (first.IsMetaScript != second.IsMetaScript)
            {
                throw new InvalidDataException($"По одинаковому ключу ({first.PrimaryKey.ToString()}) имеется мета-скрипт и просто команда");
            }

            // Если одинаковые ключи, оба не мета-скрипты и обрабатываются разные состояния, то совместимы
            // Если первый обрабатывает только нажатие, а второй только отжатие, то совместимы
            if (first.OnKeyDown != null && first.OnKeyRelease == null && second.OnKeyDown == null && second.OnKeyRelease != null)
            {
                return(true);
            }
            if (first.OnKeyDown == null && first.OnKeyRelease != null && second.OnKeyDown != null && second.OnKeyRelease == null)
            {
                return(true);
            }

            return(false);
        }
Exemple #3
0
 public GreaterBraceletOfBindingGump(PlayerMobile pm, GreaterBraceletOfBinding bracelet, BindEntry entry)
     : base(pm, 100, 100)
 {
     Bracelet = bracelet;
     Entry    = entry;
     Choose   = true;
 }
Exemple #4
0
        public void AddEntry(KeySequence keySequence, BindEntry cfgEntry)
        {
            int count = keySequence.Keys.Length;

            if (count == 0 || count > 2) // Проверим, что задано верное число клавиш
            {
                throw new InvalidOperationException($"Кол-во кнопок в последовательности не может быть {count}");
            }

            // Если элемент полустатический, то обновим его в менеджере
            if (cfgEntry.Type == EntryType.Semistatic)
            {
                this.UpdateSemistaticEntry(cfgEntry);
            }

            // Добавляем список для последовательности клавиш, если такой еще нет
            if (this.entries.ContainsKey(keySequence))
            {
                // Обновляем список элементов для последовательности клавиш, оставив только совместимые с новым элементы
                this.entries[keySequence] = this.entries[keySequence]
                                            .Where(e => AreCompatible(e, cfgEntry))
                                            .ToList();
            }
            else
            {
                this.entries.Add(keySequence, new List <BindEntry>());
            }

            // Добавляем в список наш элемент
            this.entries[keySequence].Add(cfgEntry);
        }
Exemple #5
0
        public void RemoveEntry(KeySequence keySequence, BindEntry cfgEntry)
        {
            this.entries[keySequence] = this.entries[keySequence]
                                        .Where(e => AreCompatible(e, cfgEntry)).ToList();

            if (this.entries[keySequence].Count == 0)
            {
                this.entries.Remove(keySequence);
            }
        }
Exemple #6
0
            public void Bind(PlayerResearchState rs, string key)
            {
                var entry = new BindEntry(rs, key);
                HashSet <BindEntry> set;

                if (!Binds.TryGetValue(entry.Trigger.DefinitionId, out set))
                {
                    Binds.Add(entry.Trigger.DefinitionId, set = new HashSet <BindEntry>());
                }
                set.Add(entry);
            }
Exemple #7
0
        public void Add(BindEntry entry, int index)
        {
            if (index >= 0 && index < Friends.Length && Friends[index] == null)
            {
                Friends[index] = entry;

                if (Pending == entry)
                {
                    Pending = null;
                }
            }
        }
Exemple #8
0
            public void Unbind(PlayerResearchState rs, string key)
            {
                var entry = new BindEntry(rs, key);
                var set   = Binds[entry.Trigger.DefinitionId];

                if (!set.Remove(entry))
                {
                    return;
                }
                if (set.Count == 0)
                {
                    Binds.Remove(entry.Trigger.DefinitionId);
                }
            }
Exemple #9
0
        public void AddEntry(KeySequence keySequence, BindEntry cfgEntry)
        {
            int count = keySequence.Keys.Length;

            if (count == 0 || count > 2) // Проверим, что задано верное число клавиш
            {
                throw new InvalidOperationException($"Кол-во кнопок в последовательности не может быть {count}");
            }

            // Если элемент полустатический, то обновим его в менеджере
            if (cfgEntry.Type == EntryType.Semistatic)
            {
                this.UpdateSemistaticEntry(cfgEntry);
            }

            // Добавляем список для последовательности клавиш, если такой еще нет
            if (this.entries.ContainsKey(keySequence))
            {
                // Получим коллекцию элементов, привязанных к клавише/сочетанию клавиш
                List <BindEntry> entries = this.entries[keySequence];

                // Найдем первый несовместимый элемент на место которого будем вставлять новый
                BindEntry replacedEntry = entries.FirstOrDefault(e => !AreCompatible(cfgEntry, e));
                int       targetIndex   = replacedEntry != null?entries.IndexOf(replacedEntry) : entries.Count;

                // Обновляем список элементов для последовательности клавиш, оставив только совместимые с новым элементы
                entries = entries.Where(e => AreCompatible(e, cfgEntry)).ToList();
                entries.Insert(targetIndex, cfgEntry);

                //this.entries[keysequence] = this.entries[keysequence]
                //        .where(e => arecompatible(e, cfgentry))
                //        .tolist();

                // Вставляем по вычисленному индексу наш элемент
                this.entries[keySequence] = entries; // .Insert(targetIndex, cfgEntry);
            }
            else
            {
                this.entries.Add(keySequence, new List <BindEntry>());
                // Добавляем в список наш элемент
                this.entries[keySequence].Add(cfgEntry);
            }
        }
Exemple #10
0
        private void OnStatefulStorageAddRemove(PlayerResearchState research, string key, bool removed)
        {
            var trigger = research.Definition.Trigger.StateStorageProvider(key) as Ob_Trigger_Interact;

            if (trigger == null)
            {
                return;
            }
            var entry = new BindEntry(research, key);

            if (trigger.HandItem.Count == 0)
            {
                if (removed)
                {
                    _bindsForAllHands.Remove(entry);
                }
                else
                {
                    _bindsForAllHands.Add(entry);
                }
                return;
            }
            foreach (var hand in trigger.HandItem)
            {
                HashSet <BindEntry> set;
                if (!_bindsByHandItem.TryGetValue(hand, out set))
                {
                    set = _bindsByHandItem[hand] = new HashSet <BindEntry>();
                }
                if (removed)
                {
                    set.Remove(entry);
                }
                else
                {
                    set.Add(entry);
                }
                if (set.Count == 0)
                {
                    _bindsByHandItem.Remove(hand);
                }
            }
        }
Exemple #11
0
            public override void OnResponse(RelayInfo info)
            {
                switch (info.ButtonID)
                {
                case 1:
                    if (RemoveFromBracelet)
                    {
                        GreaterBraceletOfBinding bracelet = User.FindItemOnLayer(Layer.Bracelet) as GreaterBraceletOfBinding;

                        if (bracelet != null && bracelet.Friends[Index] != null)
                        {
                            var entry = bracelet.Friends[Index];

                            if (entry.Bracelet is GreaterBraceletOfBinding)
                            {
                                PlayerMobile             pm  = entry.Mobile;
                                GreaterBraceletOfBinding gbr = entry.Bracelet as GreaterBraceletOfBinding;

                                gbr.Remove(User);

                                if (pm != null && pm.NetState != null)
                                {
                                    var gump = pm.FindGump <GreaterBraceletOfBindingGump>();

                                    if (gump != null)
                                    {
                                        gump.Refresh();
                                    }
                                }
                            }

                            bracelet.Remove(entry.Mobile);
                            BaseGump.SendGump(new GreaterBraceletOfBindingGump(User, bracelet));
                        }
                    }
                    else
                    {
                        BraceletOfBinding brac = User.FindItemOnLayer(Layer.Bracelet) as BraceletOfBinding;

                        if (brac != null)
                        {
                            var entry = new BindEntry(User, brac);
                            Bracelet.Add(entry, Index);

                            var g = From.FindGump <GreaterBraceletOfBindingGump>();

                            if (g != null)
                            {
                                g.Refresh();
                            }

                            if (brac is GreaterBraceletOfBinding && !((GreaterBraceletOfBinding)brac).IsBound(From))
                            {
                                entry = new BindEntry(From, Bracelet);
                                ((GreaterBraceletOfBinding)brac).Pending = entry;

                                BaseGump.SendGump(new GreaterBraceletOfBindingGump(User, (GreaterBraceletOfBinding)brac, entry));
                            }
                            else
                            {
                                brac.Bound = Bracelet;
                            }
                        }
                        else
                        {
                            User.SendLocalizedMessage(1151772);     // You must be wearing this item to bind to another character.
                            From.SendLocalizedMessage(1151771);     // The target player must be wearing a Bracelet of Binding or Greater Bracelet of Binding for the device to work.
                        }
                    }
                    break;

                case 2:
                    if (!RemoveFromBracelet)
                    {
                        From.SendLocalizedMessage(1151778, User.Name);     // ~1_val~ has declined your request to bind bracelets.
                    }
                    break;
                }
            }