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); } } }
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); }
public GreaterBraceletOfBindingGump(PlayerMobile pm, GreaterBraceletOfBinding bracelet, BindEntry entry) : base(pm, 100, 100) { Bracelet = bracelet; Entry = entry; Choose = true; }
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); }
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); } }
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); }
public void Add(BindEntry entry, int index) { if (index >= 0 && index < Friends.Length && Friends[index] == null) { Friends[index] = entry; if (Pending == entry) { Pending = null; } } }
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); } }
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); } }
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); } } }
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; } }