class RainProcurementComponentBase : Managed { protected ItemBase m_ProcuringItem; protected RainProcurementHandler m_Handler; protected bool m_IsUnderRoof; protected bool m_IsActive; protected int m_UpdateCounter; protected const int UPDATE_ROOFCHECK_COUNT = 3; //do roofcheck every n updates void RainProcurementComponentBase(ItemBase procuringItem) { m_ProcuringItem = procuringItem; Reset(); m_Handler = MissionBaseWorld.Cast(GetGame().GetMission()).GetRainProcurementHandler(); } //! Called on server to queue rain procurement (on next cycle end) void StartRainProcurement() { #ifdef SERVER Reset(); SetActive(true); m_Handler.QueueStart(this); #endif } //! Called on server to queue rain procurement removal (on next cycle end) void StopRainProcurement() { #ifdef SERVER if (IsActive()) { SetActive(false); m_Handler.QueueStop(this); } #endif } void OnUpdate(float deltaTime, float amount) { m_UpdateCounter++; if (m_UpdateCounter == 0 || m_UpdateCounter == UPDATE_ROOFCHECK_COUNT) { m_UpdateCounter = 0; UpdateIsUnderRoof(); } ProcureLiquid(amount); } protected void Reset() { m_UpdateCounter = -1; } protected void ProcureLiquid(float amountBase, int liquidType = LIQUID_CLEANWATER) { if (!m_IsUnderRoof) { float actualAmount = amountBase * GetBaseLiquidAmount(); Liquid.FillContainerEnviro(m_ProcuringItem, liquidType, actualAmount); } } protected void UpdateIsUnderRoof() { m_IsUnderRoof = MiscGameplayFunctions.IsUnderRoof(m_ProcuringItem); } //! override this to get different amount per ProcureLiquid cycle float GetBaseLiquidAmount() { return GameConstants.LIQUID_RAIN_AMOUNT_COEF_BASE; } bool IsActive() { return m_IsActive; } void SetActive(bool run) { //resets times on start if (run) Reset(); m_IsActive = run; } }; class RainProcurementComponentBarrel : RainProcurementComponentBase {};