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; } }