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:
parent
598fc4aefd
commit
70a7478529
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
|
Loading…
x
Reference in New Issue
Block a user