1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-05-09 10:54:12 +00:00

Ignore some components when sending item to client

We send the item-form of the current computer in the computer menu data.
However, this leaks the current LockCode, as we include all components.
We now only gather a safe subset of components when constructing the
item.
This commit is contained in:
Jonathan Coates 2025-03-05 18:20:05 +00:00
parent 598fc4aefd
commit 70a7478529
No known key found for this signature in database
GPG Key ID: B9E431FF07C98D06
3 changed files with 24 additions and 16 deletions

View File

@ -10,8 +10,10 @@ import dan200.computercraft.shared.network.container.ComputerContainerData;
import dan200.computercraft.shared.platform.PlatformHelper;
import dan200.computercraft.shared.platform.RegistryEntry;
import dan200.computercraft.shared.util.BlockEntityHelpers;
import net.minecraft.Util;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.component.DataComponentMap;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
@ -64,12 +66,6 @@ public abstract class AbstractComputerBlock<T extends AbstractComputerBlockEntit
return computer.getRedstoneOutput(localSide);
}
private ItemStack getItem(AbstractComputerBlockEntity tile) {
var stack = new ItemStack(this);
stack.applyComponents(tile.collectComponents());
return stack;
}
@Override
protected int getSignal(BlockState state, BlockGetter world, BlockPos pos, Direction incomingSide) {
return getDirectSignal(state, world, pos, incomingSide);
@ -89,13 +85,11 @@ public abstract class AbstractComputerBlock<T extends AbstractComputerBlockEntit
@Override
public ItemStack getCloneItemStack(LevelReader world, BlockPos pos, BlockState state) {
var tile = world.getBlockEntity(pos);
if (tile instanceof AbstractComputerBlockEntity computer) {
var result = getItem(computer);
if (!result.isEmpty()) return result;
var stack = super.getCloneItemStack(world, pos, state);
if (world.getBlockEntity(pos) instanceof AbstractComputerBlockEntity computer) {
stack.applyComponents(computer.collectComponents());
}
return super.getCloneItemStack(world, pos, state);
return stack;
}
@Override
@ -121,7 +115,10 @@ public abstract class AbstractComputerBlock<T extends AbstractComputerBlockEntit
var serverComputer = computer.createServerComputer();
serverComputer.turnOn();
PlatformHelper.get().openMenu(player, computer.getName(), computer, new ComputerContainerData(serverComputer, getItem(computer)));
var stack = new ItemStack(this);
stack.applyComponents(Util.make(DataComponentMap.builder(), computer::collectSafeComponents).build());
PlatformHelper.get().openMenu(player, computer.getName(), computer, new ComputerContainerData(serverComputer, stack));
}
return InteractionResult.sidedSuccess(level.isClientSide);
}

View File

@ -5,6 +5,7 @@
package dan200.computercraft.shared.computer.blocks;
import com.google.common.base.Strings;
import com.google.errorprone.annotations.OverridingMethodsMustInvokeSuper;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.core.computer.ComputerSide;
@ -187,10 +188,20 @@ public abstract class AbstractComputerBlockEntity extends BlockEntity implements
@Override
protected void collectImplicitComponents(DataComponentMap.Builder builder) {
super.collectImplicitComponents(builder);
collectSafeComponents(builder);
if (lockCode != LockCode.NO_LOCK) builder.set(DataComponents.LOCK, lockCode);
}
/**
* Collect components that are safe to share with the client.
*
* @param builder The component builder.
*/
@OverridingMethodsMustInvokeSuper
protected void collectSafeComponents(DataComponentMap.Builder builder) {
builder.set(ModRegistry.DataComponents.COMPUTER_ID.get(), NonNegativeId.of(computerID));
builder.set(DataComponents.CUSTOM_NAME, label == null ? null : Component.literal(label));
builder.set(ModRegistry.DataComponents.STORAGE_CAPACITY.get(), storageCapacity > 0 ? new StorageCapacity(storageCapacity) : null);
if (lockCode != LockCode.NO_LOCK) builder.set(DataComponents.LOCK, lockCode);
}
@Override

View File

@ -169,8 +169,8 @@ public class TurtleBlockEntity extends AbstractComputerBlockEntity implements Ba
}
@Override
protected void collectImplicitComponents(DataComponentMap.Builder builder) {
super.collectImplicitComponents(builder);
protected void collectSafeComponents(DataComponentMap.Builder builder) {
super.collectSafeComponents(builder);
builder.set(DataComponents.DYED_COLOR, brain.getColour() == -1 ? null : new DyedItemColor(brain.getColour(), false));
builder.set(ModRegistry.DataComponents.OVERLAY.get(), brain.getOverlay());