/// <summary> /// Registers a PAction with the action manager. There is no corresponding Unregister /// call, so avoid spamming PActions. /// /// This call should occur after PUtil.InitLibrary() during the mod OnLoad(). If called /// earlier, it may fail with InvalidOperationException, and if called later, the /// user's custom key bind (if applicable) will be discarded. /// </summary> /// <param name="identifier">The identifier for this action.</param> /// <param name="title">The action's title.</param> /// <param name="binding">The default key binding for this action.</param> /// <returns>The action thus registered.</returns> /// <exception cref="InvalidOperationException">If PLib is not yet initialized.</exception> public static PAction Register(string identifier, LocString title, PKeyBinding binding = null) { // In case this call is used before the library was initialized if (!PUtil.PLibInit) { PUtil.InitLibrary(false); PUtil.LogWarning("PUtil.InitLibrary was not called before using " + "PAction.Register!"); } int actionID; PAction action; lock (PSharedData.GetLock(PRegistry.KEY_ACTION_LOCK)) { actionID = PSharedData.GetData <int>(PRegistry.KEY_ACTION_ID); if (actionID <= 0) { throw new InvalidOperationException("PAction action ID is not set!"); } PSharedData.PutData(PRegistry.KEY_ACTION_ID, actionID + 1); } action = new PAction(actionID, identifier, title); PActionManager.ConfigureTitle(action); action.AddKeyBinding(binding ?? new PKeyBinding()); return(action); }
/// <summary> /// Registers a PAction with the action manager. There is no corresponding Unregister /// call, so avoid spamming PActions. /// /// This call should occur after PUtil.LogModInit() during the mod OnLoad(). If called /// earlier, it may fail with InvalidOperationException, and if called later, the /// user's custom key bind (if applicable) will be discarded. /// </summary> /// <param name="identifier">The identifier for this action.</param> /// <param name="title">The action's title.</param> /// <param name="binding">The default key binding for this action.</param> /// <returns>The action thus registered.</returns> /// <exception cref="InvalidOperationException">If PLib is not yet initialized.</exception> public static PAction Register(string identifier, LocString title, PKeyBinding binding = null) { object locker = PSharedData.GetData <object>(PRegistry.KEY_ACTION_LOCK); int actionID; if (locker == null) { throw new InvalidOperationException("PAction.Register called before PLib loaded!"); } PAction action; lock (locker) { actionID = PSharedData.GetData <int>(PRegistry.KEY_ACTION_ID); if (actionID <= 0) { throw new InvalidOperationException("PAction action ID is not set!"); } PSharedData.PutData(PRegistry.KEY_ACTION_ID, actionID + 1); } action = new PAction(actionID, identifier, title); PActionManager.ConfigureTitle(action); action.AddKeyBinding(binding ?? new PKeyBinding()); return(action); }
/// <summary> /// Adds a key bind command to the pending queue. /// </summary> /// <param name="action">The action to bind.</param> /// <param name="binding">The key to bind it to.</param> internal void QueueKeyBind(PAction action, PKeyBinding binding) { if (!Added) { AddActionManager(); Added = true; } queueBindKeys[action] = binding; }
/// <summary> /// Adds a key binding to the game for this custom Action. It must be done after mods /// are loaded. /// </summary> /// <param name="binding">The default key binding for this action.</param> internal void AddKeyBinding(PKeyBinding binding) { var currentBindings = GameInputMapping.DefaultBindings; if (binding == null) { throw new ArgumentNullException("binding"); } if (currentBindings != null) { // Only if GameInputMapping is initialized Action action = GetKAction(); bool inBindings = false; int n = currentBindings.Length; for (int i = 0; i < n && !inBindings; i++) { var cb = currentBindings[i]; if (cb.mAction == action) { // Already exists, but it really should not PActionManager.LogKeyBindWarning(("Action {0} already exists; " + "assigned to KeyCode {1}").F(action, cb.mKeyCode)); inBindings = true; break; } } if (!inBindings) { var newBindings = new BindingEntry[n + 1]; Array.Copy(currentBindings, newBindings, n); newBindings[n] = new BindingEntry(PActionManager.CATEGORY, binding. GamePadButton, binding.Key, binding.Modifiers, action, true, false); GameInputMapping.SetDefaultKeyBindings(newBindings); } } else { // Queue into PActionManager PActionManager.Instance.QueueKeyBind(this, binding); } }
/// <summary> /// Adds a key binding to the game for this custom Action. It must be done after mods /// are loaded. /// </summary> /// <param name="binding">The default key binding for this action.</param> internal void AddKeyBinding(PKeyBinding binding) { var currentBindings = GameInputMapping.DefaultBindings; if (binding == null) { throw new ArgumentNullException("binding"); } if (currentBindings != null) { Action action = GetKAction(); bool inBindings = false; // Only if GameInputMapping is initialized int n = currentBindings.Length; for (int i = 0; i < n && !inBindings; i++) { if (currentBindings[i].mAction == action) { inBindings = true; break; } } if (!inBindings) { var newBindings = new BindingEntry[n + 1]; Array.Copy(currentBindings, newBindings, n); newBindings[n] = new BindingEntry(PActionManager.CATEGORY, binding. GamePadButton, binding.Key, binding.Modifiers, action, true, false); GameInputMapping.SetDefaultKeyBindings(newBindings); } } else { // Queue into PActionManager PActionManager.Instance.QueueKeyBind(this, binding); } }
/// <summary> /// Adds a key bind command to the pending queue. /// </summary> /// <param name="action">The action to bind.</param> /// <param name="binding">The key to bind it to.</param> internal void QueueKeyBind(PAction action, PKeyBinding binding) { queueBindKeys[action] = binding; }