Пример #1
0
        public void OnKeyEvent(Event e)
        {
            if (_keyboardHandlerActive || (int)e.keyCode >= _keyPressed.Length)
            {
                return;
            }

            try {
                _keyboardHandlerActive = true;
                var keyModified = false;
                if (e.type == EventType.KeyUp)
                {
                    keyModified = _keyPressed[(int)e.keyCode] != 0;
                    _keyPressed[(int)e.keyCode] = 0;

                    bool numlock = (e.modifiers & EventModifiers.Numeric) != 0;
                    if (numlock != _numlock)
                    {
                        ClearPressedKeys();
                        _numlock = numlock;
                    }
                }

                if (_captureKeyboard && _mapping != null && !(e.alt && e.control))
                {
                    if (e.type == EventType.KeyDown)
                    {
                        var  type    = _keyPressed[(int)e.keyCode] != 0 ? InputEvent.KeyRepeat : InputEvent.KeyDown;
                        bool handled = _mapping.OnKeyInput(type, e.character, e.keyCode, e.modifiers);
                        if (!handled)
                        {
                            onKeyDownEvent.InvokeWhile(e, _keyPressed[(int)e.keyCode] != 0, () => e.type != EventType.Used);
                        }
                        else
                        {
                            e.Use();
                        }
                    }
                    else if (e.type == EventType.KeyUp)
                    {
                        bool handled = _mapping.OnKeyInput(InputEvent.KeyUp, e.character, e.keyCode, e.modifiers);
                        if (!handled)
                        {
                            onKeyUpEvent.InvokeWhile(e, false, () => e.type != EventType.Used);
                        }
                        else
                        {
                            e.Use();
                        }
                    }
                }

                if (e.type == EventType.KeyDown)
                {
                    _keyCode    = e.keyCode;
                    keyModified = _keyPressed[(int)e.keyCode] != 0;
                    _keyPressed[(int)e.keyCode] = OpenTibiaUnity.TicksMillis;
                }

                if (keyModified)
                {
                    onModifierKeyEvent.Invoke(e.character, e.keyCode, e.modifiers);
                }
            } catch (System.Exception) {
            } finally {
                _keyboardHandlerActive = false;
            }
        }