示例#1
0
 private static CallbackResult OnObjectPicker(byte[] data, CallbackResult prevResult)
 {
     lastMenu = new Menu(data);
     return CallbackResult.Normal;
 }
示例#2
0
        private static IMacroCommand OnObjectPicked(byte[] data)
        {
            try {
                if (lastMenu != null) {
                    uint dlgSerial = ByteConverter.BigEndian.ToUInt32(data, 1);

                    if (dlgSerial == lastMenu.DialogSerial) {
                        int choice = ByteConverter.BigEndian.ToUInt16(data, 7) - 1;

                        if (choice < 0) {
                            return new WaitMenuMacroCommand(new MenuSelection(lastMenu.Title, null));
                        }
                        else if (choice < lastMenu.Options.Count) {
                            return new WaitMenuMacroCommand(new MenuSelection(lastMenu.Title, lastMenu.Options[choice].Text));
                        }
                    }
                }

                UO.Print(Env.ErrorColor, "Error recording macro: Unable to resolve MenuSelect.");
                return null;
            }
            finally {
                lastMenu = null;
            }
        }
示例#3
0
        private static CallbackResult OnObjectPicker(byte[] data, CallbackResult prevResult)
        {
            lock (syncRoot) {
                if (CurrentState == State.WaitMenu) {
                    Debug.Assert(waitQueue != null && waitQueue.Count > 0, "Empty waitQueue.");
                    Debug.Assert(waitQueue.Peek().IsMenu, "Target in top of the queue instead of menu.");

                    Menu packet = new Menu(data);
                    WaitQuery query = waitQueue.Dequeue();
                    MenuSelection menu = query.Menu;

                    if (packet.Title.ToLowerInvariant().Contains(menu.Name.ToLowerInvariant())) {
                        // Cancel menu
                        if (menu.Option == null) {
                            byte[] selectedData = PacketBuilder.ObjectPicked(packet.DialogSerial, packet.MenuSerial, 0, 0, 0);
                            Core.SendToServer(selectedData);

                            FinishWork();
                            query.Finish(RequestState.Completed);
                            return CallbackResult.Eat;
                        }

                        // Select option
                        string option = menu.Option.ToLowerInvariant();
                        for (int i = 0; i < packet.Options.Count; i++) {
                            if (packet.Options[i].Text.ToLowerInvariant().Contains(option)) {
                                byte[] selectedData = PacketBuilder.ObjectPicked(packet.DialogSerial, packet.MenuSerial, (ushort)(i + 1), packet.Options[i].Artwork, packet.Options[i].Hue);
                                Core.SendToServer(selectedData);

                                FinishWork();
                                query.Finish(RequestState.Completed);
                                return CallbackResult.Eat;
                            }
                        }

                        Trace.WriteLine("Unable to find requested option. Menu passed to client.", "UIManager");
                    }
                    else {
                        Trace.WriteLine("Unexpected menu received. Menu passed to client.", "UIManager");
                    }

                    query.Finish(RequestState.Failed);
                    FinishWork();
                }

                if (CurrentState != State.Ready) {
                    Reset();
                }

                return CallbackResult.Normal;
            }
        }