1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-12-05 22:08:06 +00:00

Store command computers in a separate folder

- Remove the /computercraft-computer-folder client command, and replace
   it with OPEN_FILE on NeoForge, or a /computercraft-open-folder
   command on Fabric (which now accepts a path, rather than an id).

 - Store command computer files in "computercraft/command_computer/<id>".

Fixes #1581.
This commit is contained in:
Jonathan Coates
2025-03-03 20:53:43 +00:00
parent 9277aa33e9
commit 05163a4911
15 changed files with 87 additions and 110 deletions

View File

@@ -6,7 +6,6 @@ package dan200.computercraft.client;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.client.sound.SpeakerSound;
import net.minecraft.commands.CommandSourceStack;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
@@ -67,7 +66,6 @@ public final class ForgeClientHooks {
}
@SubscribeEvent
public static void onRenderInFrame(RenderItemInFrameEvent event) {
var state = event.getItemFrameRenderState().getRenderData(ITEM_FRAME_STATE);
@@ -83,9 +81,4 @@ public final class ForgeClientHooks {
if (!(event.getSound() instanceof SpeakerSound sound) || sound.getStream() == null) return;
ClientHooks.onPlayStreaming(event.getEngine(), event.getChannel(), sound.getStream());
}
@SubscribeEvent
public static void registerClientCommands(RegisterClientCommandsEvent event) {
ClientRegistry.registerClientCommands(event.getDispatcher(), CommandSourceStack::sendFailure);
}
}

View File

@@ -11,10 +11,9 @@ import dan200.computercraft.client.model.ExtraModels;
import dan200.computercraft.client.render.ExtendedItemFrameRenderState;
import dan200.computercraft.client.turtle.TurtleUpgradeModellers;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.entity.state.ItemFrameRenderState;
import net.minecraft.client.renderer.entity.ItemFrameRenderer;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.context.ContextKey;
import net.minecraft.world.entity.decoration.ItemFrame;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.ModLoader;
@@ -98,7 +97,7 @@ public final class ForgeClientRegistry {
@SubscribeEvent
public static void registerRenderStateModifiers(RegisterRenderStateModifiersEvent event) {
event.<ItemFrame, ItemFrameRenderState>registerEntityModifier(new TypeToken<>() {
event.registerEntityModifier(new TypeToken<ItemFrameRenderer<?>>() {
}, (e, s) -> {
var data = s.getRenderData(ITEM_FRAME_STATE);
if (data == null) s.setRenderData(ITEM_FRAME_STATE, data = new ExtendedItemFrameRenderState());

View File

@@ -1,26 +0,0 @@
// SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.mixin.client;
import dan200.computercraft.shared.command.CommandComputerCraft;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.neoforged.neoforge.client.ClientCommandHandler;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
/**
* Allows triggering ComputerCraft's client commands from chat components events.
*/
@Mixin(ClientPacketListener.class)
class ClientPacketListenerMixin {
@Inject(method = "sendUnsignedCommand", at = @At("HEAD"), cancellable = true)
void commandUnsigned(String command, CallbackInfoReturnable<Boolean> ci) {
if (command.startsWith(CommandComputerCraft.CLIENT_OPEN_FOLDER) && ClientCommandHandler.runCommand(command)) {
ci.setReturnValue(true);
}
}
}

View File

@@ -7,7 +7,6 @@
"defaultRequire": 1
},
"client": [
"BlockRenderDispatcherMixin",
"ClientPacketListenerMixin"
"BlockRenderDispatcherMixin"
]
}

View File

@@ -25,6 +25,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Registry;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.ClickEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.resources.ResourceKey;
@@ -65,6 +66,7 @@ import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;
import org.jspecify.annotations.Nullable;
import java.nio.file.Path;
import java.util.EnumSet;
import java.util.List;
import java.util.Objects;
@@ -244,6 +246,11 @@ public class PlatformHelperImpl implements PlatformHelper {
return stack.getCapability(MediaCapability.get());
}
@Override
public ClickEvent createOpenFolderAction(Path path) {
return new ClickEvent(ClickEvent.Action.OPEN_FILE, path.toAbsolutePath().toString());
}
private record RegistrationHelperImpl<R>(DeferredRegister<R> registry) implements RegistrationHelper<R> {
@Override
public <T extends R> RegistryEntry<T> register(String name, Supplier<T> create) {