コード例 #1
0
        protected override void ServerUpdate(ServerUpdateData data)
        {
            var privateState = data.PrivateState;
            var publicState  = data.PublicState;

            var liquidContainerState = privateState.LiquidStateWater;

            var isFull = liquidContainerState.Amount >= this.LiquidContainerConfig.Capacity;

            var isActive = !isFull;

            if (isActive)
            {
                // perform electricity checks (if applies)
                isActive = this.ElectricityConsumptionPerSecondWhenActive <= 0 ||
                           publicState.ElectricityConsumerState == ElectricityConsumerState.PowerOnActive;
            }

            publicState.IsActive = isActive;

            LiquidContainerSystem.UpdateWithManufacturing(
                data.GameObject,
                liquidContainerState,
                this.LiquidContainerConfig,
                privateState.ManufacturingState,
                this.ManufacturingConfig,
                data.DeltaTime * RateManufacturingSpeedMultiplier.SharedValue,
                isProduceLiquid: isActive,
                forceUpdateRecipe: !isFull);
        }
コード例 #2
0
        protected override void ServerUpdate(ServerUpdateData data)
        {
            var privateState         = data.PrivateState;
            var liquidContainerState = privateState.LiquidStateWater;

            LiquidContainerSystem.UpdateWithManufacturing(
                data.GameObject,
                liquidContainerState,
                this.LiquidContainerConfig,
                privateState.ManufacturingState,
                this.ManufacturingConfig,
                data.DeltaTime,
                // the well is always produce water
                isProduceLiquid: true,
                forceUpdateRecipe: liquidContainerState.Amount < this.LiquidContainerConfig.Capacity);
        }
コード例 #3
0
        protected override void ServerUpdate(ServerUpdateData data)
        {
            var worldObject   = data.GameObject;
            var privateState  = data.PrivateState;
            var objectDeposit = this.SharedGetDepositWorldObject(worldObject.OccupiedTile);

            if (objectDeposit == null)
            {
                // no deposit object - stop progressing
                privateState.LiquidContainerState.Amount = 0;
                privateState.FuelBurningState.FuelUseTimeRemainsSeconds = 0;
                return;
            }

            var fuelBurningState = privateState.FuelBurningState;

            // Please note: fuel is used only to produce oil.
            // Fuel is not used for "petroleum canister" crafting.
            var isFull = privateState.LiquidContainerState.Amount >= this.LiquidContainerConfig.Capacity;

            FuelBurningMechanic.Update(
                worldObject,
                fuelBurningState,
                null,
                this.ManufacturingConfig,
                data.DeltaTime,
                isNeedFuelNow: !isFull);

            var isFuelBurning = fuelBurningState.FuelUseTimeRemainsSeconds > 0;

            data.PublicState.IsManufacturingActive = isFuelBurning;

            LiquidContainerSystem.UpdateWithManufacturing(
                worldObject,
                data.PrivateState.LiquidContainerState,
                this.LiquidContainerConfig,
                data.PrivateState.ManufacturingState,
                this.ManufacturingConfig,
                data.DeltaTime,
                // the pump produce petroleum only when fuel is burning
                isProduceLiquid: isFuelBurning,
                forceUpdateRecipe: true);
        }
コード例 #4
0
        protected override void ServerUpdate(ServerUpdateData data)
        {
            var worldObject   = data.GameObject;
            var privateState  = data.PrivateState;
            var objectDeposit = this.SharedGetDepositWorldObject(worldObject.OccupiedTile);

            var isPvEserver      = PveSystem.ServerIsPvE;
            var fuelBurningState = privateState.FuelBurningState;

            if (objectDeposit == null &&
                !isPvEserver)
            {
                // no deposit object - stop progressing
                privateState.LiquidContainerState.Amount = 0;
                if (fuelBurningState != null)
                {
                    fuelBurningState.FuelUseTimeRemainsSeconds = 0;
                }

                return;
            }

            var deltaTime = data.DeltaTime;
            var deltaTimeForManufacturing = deltaTime;

            if (objectDeposit == null &&
                isPvEserver)
            {
                // On PvE servers extractors work on reduced speed
                // if there is no deposit (the extractor built by player anywhere).
                deltaTimeForManufacturing *= PveSystem.DepositExtractorWithoutDepositActionSpeedMultiplier;
            }
            else if (objectDeposit != null &&
                     !isPvEserver &&
                     objectDeposit.ProtoStaticWorldObject is IProtoObjectDeposit protoObjectDeposit &&
                     protoObjectDeposit.LifetimeTotalDurationSeconds <= 0)
            {
                // Public extractor (for infinite deposit) in PvP. Much faster extraction.
                deltaTimeForManufacturing *= PublicExtractorSpeedMultiplierInPvP;
            }

            // apply extraction rate multiplier
            deltaTimeForManufacturing *= StructureConstants.ManufacturingSpeedMultiplier;

            var isActive = false;
            var isFull   = privateState.LiquidContainerState.Amount >= this.LiquidContainerConfig.Capacity;

            if (fuelBurningState == null)
            {
                // no fuel burning state
                if (this.ElectricityConsumptionPerSecondWhenActive <= 0)
                {
                    // no fuel burning and no electricity consumption - always active
                    isActive = true;
                }
                else
                {
                    // Consuming electricity.
                    // Active only if electricity state is on and has active recipe.
                    var publicState = data.PublicState;
                    if (publicState.ElectricityConsumerState == ElectricityConsumerState.PowerOn)
                    {
                        isActive = !isFull;
                    }
                }
            }
            else
            {
                // Please note: fuel is used only to produce oil.
                // Fuel is not used for "petroleum canister" crafting.
                FuelBurningMechanic.Update(
                    worldObject,
                    fuelBurningState,
                    byproductsCraftQueue: null,
                    this.ManufacturingConfig,
                    deltaTime,
                    byproductsQueueRate: 1,
                    isNeedFuelNow: !isFull);

                var isFuelBurning = fuelBurningState.FuelUseTimeRemainsSeconds > 0;
                isActive = isFuelBurning;
            }

            data.PublicState.IsActive = isActive;

            LiquidContainerSystem.UpdateWithManufacturing(
                worldObject,
                data.PrivateState.LiquidContainerState,
                this.LiquidContainerConfig,
                data.PrivateState.ManufacturingState,
                this.ManufacturingConfig,
                deltaTimeForManufacturing,
                // the pump produce petroleum only when active
                isProduceLiquid: data.PublicState.IsActive,
                forceUpdateRecipe: true);
        }
コード例 #5
0
        protected override void ServerUpdate(ServerUpdateData data)
        {
            var worldObject           = data.GameObject;
            var privateState          = data.PrivateState;
            var objectDepletedDeposit =
                ObjectDepletedDeposit.SharedGetDepletedDepositWorldObject(worldObject.OccupiedTile);
            var objectDeposit = this.SharedGetDepositWorldObject(worldObject.OccupiedTile);

            var fuelBurningState = privateState.FuelBurningState;

            if (objectDepletedDeposit is not null)
            {
                // this is a depleted deposit - stop extraction
                data.PublicState.IsActive = false;
                privateState.LiquidContainerState.Amount = 0;
                if (fuelBurningState is not null)
                {
                    fuelBurningState.FuelUseTimeRemainsSeconds = 0;
                }

                return;
            }

            var isActive = false;
            var isFull   = privateState.LiquidContainerState.Amount >= this.LiquidContainerConfig.Capacity;

            if (fuelBurningState is null)
            {
                // no fuel burning state
                if (this.ElectricityConsumptionPerSecondWhenActive <= 0)
                {
                    // no fuel burning and no electricity consumption - always active
                    isActive = true;
                }
                else
                {
                    // Consuming electricity.
                    // Active only if electricity state is on and has active recipe.
                    var publicState = data.PublicState;
                    if (publicState.ElectricityConsumerState == ElectricityConsumerState.PowerOnActive)
                    {
                        isActive = !isFull;
                    }
                }
            }
            else
            {
                // Please note: fuel is used only to produce oil.
                // Fuel is not used for "petroleum canister" crafting.
                FuelBurningMechanic.Update(
                    worldObject,
                    fuelBurningState,
                    byproductsCraftQueue: null,
                    this.ManufacturingConfig,
                    data.DeltaTime * FuelBurningSpeedMultiplier,
                    byproductsQueueRate: 1,
                    isNeedFuelNow: !isFull);

                var isFuelBurning = fuelBurningState.FuelUseTimeRemainsSeconds > 0;
                isActive = isFuelBurning;
            }

            data.PublicState.IsActive = isActive;

            LiquidContainerSystem.UpdateWithManufacturing(
                worldObject,
                data.PrivateState.LiquidContainerState,
                this.LiquidContainerConfig,
                data.PrivateState.ManufacturingState,
                this.ManufacturingConfig,
                data.DeltaTime * SharedGetSpeedMultiplier(objectDeposit),
                // the pump produce petroleum only when active
                isProduceLiquid: data.PublicState.IsActive,
                forceUpdateRecipe: true);
        }