/// <summary>Processes a client clicking this door.</summary> /// <param name="clicker">The toon that clicked the door.</param> /// <returns>null if the player was unable to open door, else a MoveDoor structure for the clicked door.</returns> internal MoveDoor? Click(ZonePlayer clicker) { MoveDoor md = new MoveDoor(); md.DoorId = (byte)this.Ordinal; if ((this.KeyItemID == null && this.LockPick == 0) || (IsOpen() && this.OpenType == 58)) // TODO: add checks for guild doors { // not locked if (!IsOpen() || this.OpenType == 58) // wtf is type 58? Is that a teleporter? { md.Action = OPEN_DOOR; this.OpenedAt = DateTime.Now; } else { md.Action = CLOSE_DOOR; this.OpenedAt = DateTime.MinValue; } } else { // TODO: add checks for lockpicking, keys, flags, etc. on locked doors } // TODO: add support for teleport doors return md; }
public async Task <bool> Initialize() { _zones = await FindZoneDevices(); if (_zones.Count == 0) { return(false); } // use first found zoneplayer which supports zonetopology to get topology var tmpZonePlayer = new ZonePlayer(_zones.First()); Topology = await GetTopology(tmpZonePlayer); var coordinator = (from member in Topology.Members from zone in _zones where member.IsCoordinator && member.Uuid == zone.Uuid select zone) .FirstOrDefault(); CurrentCoordinator = new ZonePlayer(coordinator); // poll sonos for state changes. _pollTask = Poll(); return(true); }
void WindowKeyDown(object sender, KeyEventArgs args) { ListView lv = (ListView)args.Source; ZoneGroup zg = (ZoneGroup)lv.DataContext; ZonePlayer zp = zg.Coordinator; switch (args.Key) { case Key.Delete: // have to make a copy since there will be a callback // each time the queue is modified QueueItem[] delete = new QueueItem[lv.SelectedItems.Count]; lv.SelectedItems.CopyTo(delete, 0); // reverse numeric sort on queue ID Array.Sort(delete, delegate(QueueItem a, QueueItem b) { return(Comparer <int> .Default.Compare(a.NumericId, b.NumericId) * -1); }); // deletes must be synchronous & in order to work properly ThreadPool.QueueUserWorkItem(delegate { foreach (QueueItem qi in delete) { zp.AVTransport.RemoveTrackFromQueue(qi.ItemId); } }); args.Handled = true; break; } }
void MediaCommands_CanTogglePlayPause(object sender, CanExecuteRoutedEventArgs e) { FrameworkElement fe = (FrameworkElement)e.OriginalSource; if (fe.DataContext == null) { return; } ZonePlayer zp = (ZonePlayer)fe.DataContext; if (zp.AVTransport == null) { return; } if (zp.AVTransport.AVTransportUri == zp.QueueUri) { e.CanExecute = zp.AVTransport.NumberOfTracks > 0; } else if (zp.AVTransport.AVTransportUri != null) { e.CanExecute = zp.AVTransport.TransportState != TransportState.TRANSITIONING; } else { e.CanExecute = false; } e.Handled = true; }
public void ChangeCoordinator(string uuid) { var newCurrent = _zones.FirstOrDefault(x => x.Uuid == uuid); if (newCurrent != null) { CurrentCoordinator = new ZonePlayer(newCurrent); } }
void MediaCommands_CanPreviousTrack(object sender, CanExecuteRoutedEventArgs e) { SonosControl tc = (SonosControl)sender; ZoneGroup zg = (ZoneGroup)tc.DataContext; ZonePlayer zp = zg.Coordinator; e.CanExecute = zp.AVTransport.CurrentTrack > 0; e.Handled = true; }
void MediaCommands_NextTrack(object sender, ExecutedRoutedEventArgs e) { SonosControl tc = (SonosControl)sender; ZoneGroup zg = (ZoneGroup)tc.DataContext; ZonePlayer zp = zg.Coordinator; zp.AVTransport.Next(); e.Handled = true; }
void MediaCommands_Select(object sender, ExecutedRoutedEventArgs e) { SonosControl tc = (SonosControl)sender; ZoneGroup zg = (ZoneGroup)tc.DataContext; ZonePlayer zp = zg.Coordinator; zp.RenderingControl.SetMute(Channel.Master, !zp.RenderingControl.Mute[Channel.Master]); e.Handled = true; }
private void SetVolume(object sender, RoutedPropertyChangedEventArgs <double> e) { ushort volume = (ushort)Math.Round(e.NewValue); FrameworkElement fe = (FrameworkElement)e.OriginalSource; ZonePlayer zp = (ZonePlayer)fe.DataContext; _volumes[zp.UniqueDeviceName] = volume; _setVolumeTimer.Change(50, 0); e.Handled = true; }
void ListDoubleClick(object sender, MouseButtonEventArgs args) { ListView lv = (ListView)args.Source; ZoneGroup zg = (ZoneGroup)lv.DataContext; ZonePlayer zp = zg.Coordinator; // make sure it's playing off the queue before we select a queue track. might be a callback that can be // used instead of this explicit call, but this works for now. sort of hacky but it looks like the Sonos client // does the same thing... what can you do? :-( zp.AVTransport.SetAVTransportUri(zp.QueueUri, ""); // Sonos queues are 1 based, ListView index is 0 based zp.AVTransport.Seek(SeekMode.TRACK_NR, (lv.SelectedIndex + 1).ToString()); zp.AVTransport.Play(); }
private void SetVolumeCallback(object state) { Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart) delegate { foreach (KeyValuePair <string, ushort> volume in _volumes) { ZonePlayer zp = _disc.Intern(volume.Key); if (volume.Value != zp.RenderingControl.Volume[Channel.Master]) { ThreadPool.QueueUserWorkItem(delegate { zp.RenderingControl.SetVolume(Channel.Master, volume.Value); }); } } _volumes.Clear(); }); }
internal PlayerCorpse(ZonePlayer zp, int xpLoss, bool zoneHasGraveyard) : base(zp, null) { _charId = zp.CharId; _hairColor = zp.HairColor; _beardColor = zp.BeardColor; _eyeColor1 = zp.EyeColor1; _hairStyle = zp.HairStyle; _luclinFace = zp.Face; _beard = zp.Beard; _xpLoss = xpLoss; // TODO: don't move items if PC had "become" an NPC? _lootItems = zp.InvMgr.AllPersonalItems().ToList<InventoryItem>(); _lootItems.AddRange(zp.InvMgr.CursorItems()); _lootItems.RemoveAll(ii => ii.Item.IsNoRent); if (IsEmpty()) _decayTimer.Start(DECAYMS_EMPTY_PC_CORPSE); else { if (zp.Level <= PC_CORPSE_LEVEL_LOW) _decayTimer = new SimpleTimer(DECAYMS_PC_CORPSE_LOW); else if (zp.Level <= PC_CORPSE_LEVEL_MID) _decayTimer = new SimpleTimer(DECAYMS_PC_CORPSE_MID); else _decayTimer = new SimpleTimer(DECAYMS_PC_CORPSE_HIGH); } if (zoneHasGraveyard) _graveyardTimer = new SimpleTimer(GRAVEYARD_TIMEOUT_MS); // TODO: get item tints and set for their corpse // TODO: soulbound items not switched to corpse, but put in normal slots on PC, not in a bag or what have you _allowedLooters.Add(zp.CharId); Save(); }
private void OnTopologyChange(object sender, XElement topologychangedXElement) { if (Topology != null) { var newTopology = topologychangedXElement.ToZoneGroups(); var noUpdateNeeded = newTopology.Any(nz => Topology.Any(oz => oz.Id == nz.Id)); if (noUpdateNeeded) { return; } } _topology = topologychangedXElement; _storage.Save(Tokens.ZoneGroupTopology, _topology); _messageBus.Send(new EventArgs(), Message.TopologyChanged); var query = topologychangedXElement.GetTopologyCoordinators(); // if we have no coordinator or the coordinator isnt present in the new topology update the coordinator if (CurrentCoordinator == null || query.SingleOrDefault(x => x.Uuid == CurrentCoordinator.Uuid) == null) { if (query.Any()) { var activeZoneMember = query.First(); // for now just take the first found. var z = Zones.FirstOrDefault(x => x.ZoneName == activeZoneMember.Title); CurrentCoordinator = new ZonePlayer(z); } } if (_pollTask == null) { _pollTask = Poll(); } }
static void ThreadFunc() { string masterBedroom = "uuid:RINCON_000E5810848C01400"; ZonePlayer zonePlayer = new ZonePlayer(masterBedroom); Console.WriteLine(zonePlayer.DeviceProperties.Icon); //UPnPDevice mediaServer = zonePlayer.MediaServer; //UPnPDevice mediaRenderer = zonePlayer.MediaRenderer; //AudioIn audioIn = zonePlayer.AudioIn; DeviceProperties deviceProperties = zonePlayer.DeviceProperties; RenderingControl renderingControl = zonePlayer.RenderingControl; AVTransport avTransport = zonePlayer.AVTransport; ContentDirectory contentDirectory = zonePlayer.ContentDirectory; GroupManagement groupManagement = zonePlayer.GroupManagement; //ZoneGroupTopology zoneGroupTopology = zonePlayer.ZoneGroupTopology; //ConnectionManager connectionManager = zonePlayer.ConnectionManager; foreach (XPathNavigator node in contentDirectory.Browse("0", BrowseFlags.BrowseDirectChildren, "*", "")) { Console.WriteLine(node.OuterXml); #if FOO string path = HttpUtility.UrlDecode(node.SelectSingleNode("@id", Sonority.XPath.Globals.Manager).Value); path = path.Replace(@"S://", @"\\"); path = path.Replace('/', '\\'); string destination = Path.Combine(@"c:\temp\nuevo", Path.GetFileName(path)); Console.WriteLine("{0}", path); File.Copy(path, destination); #endif } foreach (QueueItem node in zonePlayer.Queue) { Console.WriteLine(node); } zonePlayer.Queue.ToString(); avTransport.PropertyChanged += new PropertyChangedEventHandler(OnPropertyChanged); contentDirectory.PropertyChanged += new PropertyChangedEventHandler(OnPropertyChanged); renderingControl.PropertyChanged += new PropertyChangedEventHandler(OnPropertyChanged); #if FOO using (foo bar = new foo()) { // check updateIDs first Queue<string> queue = new Queue<string>(); queue.Enqueue("S:"); queue.Enqueue("0"); while (queue.Count > 0) { string currentObject = queue.Dequeue(); // box is down, ignore for now. if (currentObject.StartsWith("S://13CFB6DD7F03432", StringComparison.OrdinalIgnoreCase)) continue; foreach (XPathNavigator node in contentDirectory.Browse(currentObject, BrowseFlags.BrowseDirectChildren, "*", "")) { if (node.LocalName == "container") { // recurse into container queue.Enqueue(node.SelectSingleNode("@id").Value); } bar.AddRecord( node.SelectSingleNode("@id", XPath.Globals.Manager).Value, node.SelectSingleNode("@parentID", XPath.Globals.Manager).Value, 0, node); } } } Thread.Sleep(Timeout.Infinite); Console.WriteLine(contentDirectory.ToString()); Console.WriteLine(avTransport.ToString()); // avTransport.Play("1"); #endif while (true) { Thread.Sleep(30000); foreach (ZoneGroup zp in disc.Topology) { Console.WriteLine("{0} -> {1}", zp.Coordinator.UniqueDeviceName, zp.Coordinator.DeviceProperties.ZoneName); } } }
static void ThreadFunc() { string masterBedroom = "uuid:RINCON_000E5810848C01400"; ZonePlayer zonePlayer = new ZonePlayer(masterBedroom); Console.WriteLine(zonePlayer.DeviceProperties.Icon); //UPnPDevice mediaServer = zonePlayer.MediaServer; //UPnPDevice mediaRenderer = zonePlayer.MediaRenderer; //AudioIn audioIn = zonePlayer.AudioIn; DeviceProperties deviceProperties = zonePlayer.DeviceProperties; RenderingControl renderingControl = zonePlayer.RenderingControl; AVTransport avTransport = zonePlayer.AVTransport; ContentDirectory contentDirectory = zonePlayer.ContentDirectory; GroupManagement groupManagement = zonePlayer.GroupManagement; //ZoneGroupTopology zoneGroupTopology = zonePlayer.ZoneGroupTopology; //ConnectionManager connectionManager = zonePlayer.ConnectionManager; foreach (XPathNavigator node in contentDirectory.Browse("0", BrowseFlags.BrowseDirectChildren, "*", "")) { Console.WriteLine(node.OuterXml); #if FOO string path = HttpUtility.UrlDecode(node.SelectSingleNode("@id", Sonority.XPath.Globals.Manager).Value); path = path.Replace(@"S://", @"\\"); path = path.Replace('/', '\\'); string destination = Path.Combine(@"c:\temp\nuevo", Path.GetFileName(path)); Console.WriteLine("{0}", path); File.Copy(path, destination); #endif } foreach (QueueItem node in zonePlayer.Queue) { Console.WriteLine(node); } zonePlayer.Queue.ToString(); avTransport.PropertyChanged += new PropertyChangedEventHandler(OnPropertyChanged); contentDirectory.PropertyChanged += new PropertyChangedEventHandler(OnPropertyChanged); renderingControl.PropertyChanged += new PropertyChangedEventHandler(OnPropertyChanged); #if FOO using (foo bar = new foo()) { // check updateIDs first Queue <string> queue = new Queue <string>(); queue.Enqueue("S:"); queue.Enqueue("0"); while (queue.Count > 0) { string currentObject = queue.Dequeue(); // box is down, ignore for now. if (currentObject.StartsWith("S://13CFB6DD7F03432", StringComparison.OrdinalIgnoreCase)) { continue; } foreach (XPathNavigator node in contentDirectory.Browse(currentObject, BrowseFlags.BrowseDirectChildren, "*", "")) { if (node.LocalName == "container") { // recurse into container queue.Enqueue(node.SelectSingleNode("@id").Value); } bar.AddRecord( node.SelectSingleNode("@id", XPath.Globals.Manager).Value, node.SelectSingleNode("@parentID", XPath.Globals.Manager).Value, 0, node); } } } Thread.Sleep(Timeout.Infinite); Console.WriteLine(contentDirectory.ToString()); Console.WriteLine(avTransport.ToString()); // avTransport.Play("1"); #endif while (true) { Thread.Sleep(30000); foreach (ZoneGroup zp in disc.Topology) { Console.WriteLine("{0} -> {1}", zp.Coordinator.UniqueDeviceName, zp.Coordinator.DeviceProperties.ZoneName); } } }
internal InventoryManager(IList<InventoryItem> items, ZonePlayer zp) { _zp = zp; //_log.DebugFormat("InvMgr initializing wtih {0} items.", items.Count); _invItems = new Dictionary<int, InventoryItem>(items.Count + 10); foreach (InventoryItem invItem in items) { // Shouldn't need to worry about the cursor queue here - should only be loading slots //_log.DebugFormat("InvMgr loading {0} in slot {1}", invItem.Item.Name, invItem.SlotID); _invItems[invItem.SlotID] = invItem; } CalculateSubItems(); }
/// <summary>Doesn't remove the item. Call removeItem() to remove the item.</summary> internal InventoryItem LootItem(ZonePlayer zp, int itemIdx) { // Already in looting mode, so shouldn't need to run further access checks for this corpse... right? int actualItemIdx = itemIdx - 22; // decrement by 22 because we incremented by 22 when sending corpse's item list if (actualItemIdx >= _lootItems.Count) { _log.ErrorFormat("Tried to loot item with idx {0} but corpse only has {1} lootable items.", actualItemIdx, _lootItems.Count); return null; } InventoryItem invItem = _lootItems[actualItemIdx]; // Get the item if (invItem == null) { _log.ErrorFormat("Attempt to loot item with idx {0} produces a null value (already looted?). Corpse has {1} lootable items.", actualItemIdx, _lootItems.Count); return null; } if (zp.InvMgr.CheckLoreConflict(invItem.Item)) { zp.MsgMgr.SendMessageID(0, MessageStrings.LOOT_LORE_ERROR); _looterId = 0; return null; } _lootItems[actualItemIdx] = null; // Remove the item from the corpse's lootable items // Send a wear change if the looted item was equipped if (invItem.SlotID != 0) { // It was equipped by the npc (non-zero slotID is an equipped item) EquipableType et = InventoryManager.GetEquipableType((InventorySlot)invItem.SlotID); _log.DebugFormat("{0} is looting equipped item {1} from {2} at slot {3} (equipable type {4})", zp.Name, invItem, this.Name, invItem.SlotID, et); if (et != EquipableType.Unequipable) TriggerWearChange(et); } return invItem; }
/// <summary>Loots this corpse of money and, optionally, items.</summary> /// <param name="looterId">CharID of the looting character.</param> /// <returns>1 if the looting is successful, 0 if someone else is looting, 2 if not at this time.</returns> /// <remarks>"Not at this time" is given when it isn't your corpse to loot, not the looter in a raid, etc.</remarks> internal byte Loot(ZonePlayer looter, out uint plat, out uint gold, out uint silver, out uint copper, out List<InventoryItem> items) { plat = gold = silver = copper = 0u; items = _lootItems; if (this.IsDePopped) return 0; // Is it an allowed looter? if (_allowedLooters.Contains(looter.ID) || looter.IsGM) { lock (_looterIdSyncLock) { if (_looterId == 0) _looterId = looter.ID; else return 0; // Someone else is looting it right now } plat = this.Platinum; gold = this.Gold; silver = this.Silver; copper = this.Copper; ClearCash(); return 1; } else return 2; }
public void Add(ZonePlayer player) => Players.Add(player);
internal void AllowLooter(ZonePlayer zp) { if (zp == null) throw new ArgumentNullException("zp"); if (_allowedLooters.Count > MAX_LOOTERS) return; _allowedLooters.Add(zp.CharId); }