/// <summary> /// Pushes the control handler. /// </summary> /// <param name="controlHandler">The control handler.</param> public void PushControlHandler(BaseProjectileControlHandler controlHandler) { Logger.Info("Pushing handler: " + controlHandler.ToString()); _controlHandlers.Push(controlHandler); TryActivateCurrentControlHandler(_currentBaseProjectileControlHandler); }
public void InsertControlHandler(int index, BaseProjectileControlHandler controlHandler) { Logger.Info("Pushing handler: " + controlHandler.ToString()); if (index >= _controlHandlers.Count) { PushControlHandler(controlHandler); } else { _controlHandlers.Insert(index, controlHandler); } }
/// <summary> /// Resets the control handlers. /// </summary> /// <param name="controlHandler">The control handler.</param> public void ResetControlHandlers(BaseProjectileControlHandler controlHandler) { Logger.Info("Resetting character control handlers."); for (int i = _controlHandlers.Count - 1; i >= 0; i--) { Logger.Info("Removing handler: " + _controlHandlers[i].ToString()); _controlHandlers[i].Dispose(); _controlHandlers.RemoveAt(i); } _currentBaseProjectileControlHandler = null; PushControlHandler(controlHandler); }
private void TryActivateCurrentControlHandler(BaseProjectileControlHandler previousControlHandler) { _currentBaseProjectileControlHandler = _controlHandlers.Peek(); while (_currentBaseProjectileControlHandler != null && !_currentBaseProjectileControlHandler.TryActivate(previousControlHandler)) { previousControlHandler = _controlHandlers.Pop(); Logger.Info("Popped handler: " + previousControlHandler.ToString()); previousControlHandler.Dispose(); _currentBaseProjectileControlHandler = _controlHandlers.Peek(); } }
/// <summary> /// Exchanges the control handler. /// </summary> /// <param name="index">The index.</param> /// <param name="controlHandler">The control handler.</param> public void ExchangeControlHandler(int index, BaseProjectileControlHandler controlHandler) { Logger.Info("Exchanging handler " + _controlHandlers[index].ToString() + " (index: " + index + ") with " + controlHandler.ToString()); if (_controlHandlers[index] == _currentBaseProjectileControlHandler) { BaseProjectileControlHandler poppedHandler = _controlHandlers.Exchange(index, controlHandler); poppedHandler.Dispose(); TryActivateCurrentControlHandler(poppedHandler); } else { _controlHandlers.Exchange(index, controlHandler); } }
/// <summary> /// Removes the control handler. /// </summary> /// <param name="controlHandler">The control handler.</param> public void RemoveControlHandler(BaseProjectileControlHandler controlHandler) { Logger.Info("Removing handler: " + controlHandler.ToString()); if (controlHandler == _currentBaseProjectileControlHandler) { BaseProjectileControlHandler poppedHandler = _controlHandlers.Pop(); poppedHandler.Dispose(); TryActivateCurrentControlHandler(poppedHandler); } else { _controlHandlers.Remove(controlHandler); controlHandler.Dispose(); } }
void Update() { try { while (!_currentBaseProjectileControlHandler.Update()) { BaseProjectileControlHandler poppedHandler = _controlHandlers.Pop(); poppedHandler.Dispose(); Logger.Info("Popped handler: " + poppedHandler.ToString()); TryActivateCurrentControlHandler(poppedHandler); } } catch (Exception err) { Logger.Error("Game object " + this.name + " misses default control handler.", err); throw; } }
/// <summary> /// This method is called from the BaseCharacterController control handler stack in order to evaluate whether the /// top stack element can be activated or not. By default this method always returns true but can be overridden /// for special purposes or chained control handlers. /// </summary> public virtual bool TryActivate(BaseProjectileControlHandler previousControlHandler) { Logger.Trace("Activated control handler: " + ToString()); return(true); }