Exemple #1
0
        /// <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);
        }
Exemple #3
0
        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;
            }
        }
Exemple #4
0
        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);
            }
        }
Exemple #6
0
        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;
        }
Exemple #7
0
        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;
        }
Exemple #8
0
        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;
        }
Exemple #9
0
        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;
        }
Exemple #10
0
        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();
        }
Exemple #11
0
        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();
            }
        }
Exemple #14
0
        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);
                }
            }
        }
Exemple #15
0
        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();
        }
Exemple #17
0
        /// <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;
        }
Exemple #18
0
        /// <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;
        }
Exemple #19
0
 public void Add(ZonePlayer player) => Players.Add(player);
Exemple #20
0
        internal void AllowLooter(ZonePlayer zp)
        {
            if (zp == null)
                throw new ArgumentNullException("zp");

            if (_allowedLooters.Count > MAX_LOOTERS)
                return;

            _allowedLooters.Add(zp.CharId);
        }