Esempio n. 1
0
        private void ServerRebuildReactorStats(
            ObjectGeneratorPragmiumReactorPrivateState reactorPrivateState,
            ObjectGeneratorPragmiumReactorPublicState reactorPublicState)
        {
            reactorPrivateState.Stats = this.SharedGetReactorStats(reactorPrivateState);
            reactorPrivateState.ServerItemsContainerLastStateHash = reactorPrivateState.ItemsContainer.StateHash;

            // verify that the reactor has at least a single fuel item, otherwise deactivate it
            var hasAnyFuel = false;

            foreach (var item in reactorPrivateState.ItemsContainer.Items)
            {
                if (item.ProtoItem is ItemReactorFuelRod)
                {
                    hasAnyFuel = true;
                    break;
                }
            }

            if (!hasAnyFuel &&
                (reactorPrivateState.IsEnabled ||
                 reactorPrivateState.ActivationProgressPercents > 0))
            {
                reactorPrivateState.IsEnabled = false;
                reactorPrivateState.ActivationProgressPercents = 0;
                reactorPublicState.ActivationProgressPercents  = 0;
                //Logger.Info("Fuel depleted: " + reactorPrivateState.GameObject);
            }
        }
Esempio n. 2
0
        private void ServerRemote_BuildReactor(IStaticWorldObject worldObjectGenerator, byte reactorIndex)
        {
            this.VerifyGameObject(worldObjectGenerator);
            var character = ServerRemoteContext.Character;

            if (!this.SharedCanInteract(character, worldObjectGenerator, writeToLog: true))
            {
                return;
            }

            if (reactorIndex >= this.ReactorsCountMax)
            {
                throw new ArgumentOutOfRangeException(nameof(reactorIndex));
            }

            var privateState = GetPrivateState(worldObjectGenerator);
            var publicState  = GetPublicState(worldObjectGenerator);

            var reactorPrivateStates = privateState.ReactorStates;
            var reactorPrivateState  = reactorPrivateStates[reactorIndex];

            if (reactorPrivateState is not null)
            {
                throw new Exception($"The reactor is already built: #{reactorIndex} in {worldObjectGenerator}");
            }

            if (!InputItemsHelper.SharedPlayerHasRequiredItems(character,
                                                               this.BuildAdditionalReactorRequiredItems,
                                                               noCheckInCreativeMode: true))
            {
                throw new Exception($"Not enough items to build a reactor: #{reactorIndex} in {worldObjectGenerator}");
            }

            if (!CreativeModeSystem.SharedIsInCreativeMode(character))
            {
                InputItemsHelper.ServerDestroyItems(character, this.BuildAdditionalReactorRequiredItems);
            }

            reactorPrivateState = new ObjectGeneratorPragmiumReactorPrivateState();
            reactorPrivateStates[reactorIndex] = reactorPrivateState;

            this.ServerSetupReactorPrivateState(worldObjectGenerator, reactorPrivateState);

            var reactorPublicStates = publicState.ReactorStates;

            reactorPublicStates[reactorIndex] = new ObjectGeneratorPragmiumReactorPublicState();

            // force refresh over the network and properly binding the state owner object
            privateState.ReactorStates = reactorPrivateStates.ToArray();
            publicState.ReactorStates  = reactorPublicStates.ToArray();
        }
Esempio n. 3
0
        protected override void ServerInitialize(ServerInitializeData data)
        {
            base.ServerInitialize(data);

            var worldObjectGenerator = data.GameObject;
            var publicState          = data.PublicState;
            var privateState         = data.PrivateState;

            var reactorPrivateStates = privateState.ReactorStates;

            if (reactorPrivateStates?.Length != this.ReactorsCountMax)
            {
                privateState.ReactorStates = null;
                publicState.ReactorStates  = null;
                reactorPrivateStates       = new ObjectGeneratorPragmiumReactorPrivateState[this.ReactorsCountMax];
            }

            var reactorPublicStates = publicState.ReactorStates
                                      ?? new ObjectGeneratorPragmiumReactorPublicState[this.ReactorsCountMax];

            for (var index = 0; index < reactorPrivateStates.Length; index++)
            {
                var reactorPrivateState = reactorPrivateStates[index];
                if (reactorPrivateState is null &&
                    index < this.ReactorsCountInitial)
                {
                    reactorPrivateState         = new ObjectGeneratorPragmiumReactorPrivateState();
                    reactorPrivateStates[index] = reactorPrivateState;
                }

                if (reactorPrivateState is not null)
                {
                    this.ServerSetupReactorPrivateState(worldObjectGenerator, reactorPrivateState);
                    reactorPublicStates[index] = new ObjectGeneratorPragmiumReactorPublicState();
                }
            }

            // force refresh over the network and properly binding the state owner object
            privateState.ReactorStates = reactorPrivateStates.ToArray();
            publicState.ReactorStates  = reactorPublicStates.ToArray();
        }
Esempio n. 4
0
 protected abstract void ClientSetupReactorSpriteRenderer(
     IStaticWorldObject worldObject,
     IComponentSpriteRenderer reactorSpriteRenderer,
     ObjectGeneratorPragmiumReactorPublicState reactorState,
     int index);