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); } }
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(); }
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(); }
protected abstract void ClientSetupReactorSpriteRenderer( IStaticWorldObject worldObject, IComponentSpriteRenderer reactorSpriteRenderer, ObjectGeneratorPragmiumReactorPublicState reactorState, int index);