diff --git a/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java b/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java index b12a8f0ca..7106355bf 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java @@ -28,6 +28,7 @@ import dan200.computercraft.shared.computer.blocks.CommandComputerBlock; import dan200.computercraft.shared.computer.blocks.ComputerBlock; import dan200.computercraft.shared.computer.blocks.ComputerBlockEntity; import dan200.computercraft.shared.computer.core.ComputerFamily; +import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.computer.inventory.ComputerMenuWithoutInventory; import dan200.computercraft.shared.computer.items.CommandComputerItem; import dan200.computercraft.shared.computer.items.ComputerItem; @@ -89,7 +90,6 @@ import dan200.computercraft.shared.turtle.recipes.TurtleOverlayRecipe; import dan200.computercraft.shared.turtle.recipes.TurtleRecipe; import dan200.computercraft.shared.turtle.recipes.TurtleUpgradeRecipe; import dan200.computercraft.shared.turtle.upgrades.*; -import dan200.computercraft.shared.util.ComponentMap; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.synchronization.ArgumentTypeInfo; import net.minecraft.commands.synchronization.SingletonArgumentInfo; @@ -471,7 +471,7 @@ public final class ModRegistry { ComputerCraftAPI.registerAPIFactory(computer -> { var turtle = computer.getComponent(ComputerComponents.TURTLE); - var metrics = Objects.requireNonNull(computer.getComponent(ComponentMap.METRICS)); + var metrics = Objects.requireNonNull(computer.getComponent(ServerComputer.METRICS)); return turtle == null ? null : new TurtleAPI(metrics, (TurtleAccessInternal) turtle); }); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ComputerSystem.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ComputerSystem.java index b69901513..7302fcccc 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ComputerSystem.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ComputerSystem.java @@ -11,7 +11,6 @@ import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.core.apis.ComputerAccess; import dan200.computercraft.core.apis.IAPIEnvironment; import dan200.computercraft.core.computer.ApiLifecycle; -import dan200.computercraft.shared.util.ComponentMap; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; @@ -26,11 +25,11 @@ import java.util.Map; final class ComputerSystem extends ComputerAccess implements IComputerSystem, ApiLifecycle { private final ServerComputer computer; private final IAPIEnvironment environment; - private final ComponentMap components; + private final Map, Object> components; private boolean active; - ComputerSystem(ServerComputer computer, IAPIEnvironment environment, ComponentMap components) { + ComputerSystem(ServerComputer computer, IAPIEnvironment environment, Map, Object> components) { super(environment); this.computer = computer; this.environment = environment; @@ -95,7 +94,8 @@ final class ComputerSystem extends ComputerAccess implements IComputerSystem, Ap } @Override + @SuppressWarnings("unchecked") public @Nullable T getComponent(ComputerComponent component) { - return components.get(component); + return (T) components.get(component); } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java index ad32ee031..c246f3e56 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java @@ -25,18 +25,21 @@ import dan200.computercraft.shared.network.NetworkMessage; import dan200.computercraft.shared.network.client.ClientNetworkContext; import dan200.computercraft.shared.network.client.ComputerTerminalClientMessage; import dan200.computercraft.shared.network.server.ServerNetworking; -import dan200.computercraft.shared.util.ComponentMap; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; public class ServerComputer implements ComputerEnvironment, ComputerEvents.Receiver { + public static final ComputerComponent METRICS = ComputerComponent.create("computercraft", "metrics"); + private final int instanceID; private final UUID instanceUUID = UUID.randomUUID(); @@ -52,14 +55,6 @@ public class ServerComputer implements ComputerEnvironment, ComputerEvents.Recei private int ticksSincePing; - @Deprecated - public ServerComputer( - ServerLevel level, BlockPos position, int computerID, @Nullable String label, ComputerFamily family, int terminalWidth, int terminalHeight, - ComponentMap baseComponents - ) { - this(level, position, properties(computerID, family).label(label).terminalSize(terminalWidth, terminalHeight).addComponents(baseComponents)); - } - public ServerComputer(ServerLevel level, BlockPos position, Properties properties) { this.level = level; this.position = position; @@ -70,14 +65,12 @@ public class ServerComputer implements ComputerEnvironment, ComputerEvents.Recei terminal = new NetworkedTerminal(properties.terminalWidth, properties.terminalHeight, family != ComputerFamily.NORMAL, this::markTerminalChanged); metrics = context.metrics().createMetricObserver(this); - var componentBuilder = ComponentMap.builder(); - componentBuilder.add(ComponentMap.METRICS, metrics); + properties.addComponent(METRICS, metrics); if (family == ComputerFamily.COMMAND) { - componentBuilder.add(ComputerComponents.ADMIN_COMPUTER, new AdminComputer() { + properties.addComponent(ComputerComponents.ADMIN_COMPUTER, new AdminComputer() { }); } - componentBuilder.add(properties.components.build()); - var components = componentBuilder.build(); + var components = Map.copyOf(properties.components); computer = new Computer(context.computerContext(), this, terminal, properties.computerID); computer.setLabel(properties.label); @@ -290,7 +283,7 @@ public class ServerComputer implements ComputerEnvironment, ComputerEvents.Recei private int terminalWidth = Config.DEFAULT_COMPUTER_TERM_WIDTH; private int terminalHeight = Config.DEFAULT_COMPUTER_TERM_HEIGHT; - private final ComponentMap.Builder components = ComponentMap.builder(); + private final Map, Object> components = new HashMap<>(); private Properties(int computerID, ComputerFamily family) { this.computerID = computerID; @@ -310,12 +303,8 @@ public class ServerComputer implements ComputerEnvironment, ComputerEvents.Recei } public Properties addComponent(ComputerComponent component, T value) { - components.add(component, value); - return this; - } - - private Properties addComponents(ComponentMap components) { - this.components.add(components); + if (components.containsKey(component)) throw new IllegalArgumentException(component + " is already set"); + components.put(component, value); return this; } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/util/ComponentMap.java b/projects/common/src/main/java/dan200/computercraft/shared/util/ComponentMap.java deleted file mode 100644 index cd89ba4a0..000000000 --- a/projects/common/src/main/java/dan200/computercraft/shared/util/ComponentMap.java +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers -// -// SPDX-License-Identifier: MPL-2.0 - -package dan200.computercraft.shared.util; - -import dan200.computercraft.api.component.ComputerComponent; -import dan200.computercraft.core.metrics.MetricsObserver; - -import javax.annotation.Nullable; -import java.util.HashMap; -import java.util.Map; - -/** - * An immutable map of components. - */ -public final class ComponentMap { - public static final ComputerComponent METRICS = ComputerComponent.create("computercraft", "metrics"); - - private static final ComponentMap EMPTY = new ComponentMap(Map.of()); - - private final Map, Object> components; - - private ComponentMap(Map, Object> components) { - this.components = components; - } - - @SuppressWarnings("unchecked") - public @Nullable T get(ComputerComponent component) { - return (T) components.get(component); - } - - public static ComponentMap empty() { - return EMPTY; - } - - public static Builder builder() { - return new Builder(); - } - - public static final class Builder { - private final Map, Object> components = new HashMap<>(); - - private Builder() { - } - - public Builder add(ComputerComponent component, T value) { - addImpl(component, value); - return this; - } - - public Builder add(ComponentMap components) { - for (var component : components.components.entrySet()) addImpl(component.getKey(), component.getValue()); - return this; - } - - private void addImpl(ComputerComponent component, Object value) { - if (components.containsKey(component)) throw new IllegalArgumentException(component + " is already set"); - components.put(component, value); - } - - public ComponentMap build() { - return new ComponentMap(Map.copyOf(components)); - } - } -}