mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-09-02 02:27:56 +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:
@@ -10,8 +10,10 @@ import dan200.computercraft.shared.network.container.ComputerContainerData;
|
|||||||
import dan200.computercraft.shared.platform.PlatformHelper;
|
import dan200.computercraft.shared.platform.PlatformHelper;
|
||||||
import dan200.computercraft.shared.platform.RegistryEntry;
|
import dan200.computercraft.shared.platform.RegistryEntry;
|
||||||
import dan200.computercraft.shared.util.BlockEntityHelpers;
|
import dan200.computercraft.shared.util.BlockEntityHelpers;
|
||||||
|
import net.minecraft.Util;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Direction;
|
import net.minecraft.core.Direction;
|
||||||
|
import net.minecraft.core.component.DataComponentMap;
|
||||||
import net.minecraft.world.InteractionResult;
|
import net.minecraft.world.InteractionResult;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
@@ -64,12 +66,6 @@ public abstract class AbstractComputerBlock<T extends AbstractComputerBlockEntit
|
|||||||
return computer.getRedstoneOutput(localSide);
|
return computer.getRedstoneOutput(localSide);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemStack getItem(AbstractComputerBlockEntity tile) {
|
|
||||||
var stack = new ItemStack(this);
|
|
||||||
stack.applyComponents(tile.collectComponents());
|
|
||||||
return stack;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getSignal(BlockState state, BlockGetter world, BlockPos pos, Direction incomingSide) {
|
protected int getSignal(BlockState state, BlockGetter world, BlockPos pos, Direction incomingSide) {
|
||||||
return getDirectSignal(state, world, pos, incomingSide);
|
return getDirectSignal(state, world, pos, incomingSide);
|
||||||
@@ -89,13 +85,11 @@ public abstract class AbstractComputerBlock<T extends AbstractComputerBlockEntit
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getCloneItemStack(LevelReader world, BlockPos pos, BlockState state) {
|
public ItemStack getCloneItemStack(LevelReader world, BlockPos pos, BlockState state) {
|
||||||
var tile = world.getBlockEntity(pos);
|
var stack = super.getCloneItemStack(world, pos, state);
|
||||||
if (tile instanceof AbstractComputerBlockEntity computer) {
|
if (world.getBlockEntity(pos) instanceof AbstractComputerBlockEntity computer) {
|
||||||
var result = getItem(computer);
|
stack.applyComponents(computer.collectComponents());
|
||||||
if (!result.isEmpty()) return result;
|
|
||||||
}
|
}
|
||||||
|
return stack;
|
||||||
return super.getCloneItemStack(world, pos, state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -121,7 +115,10 @@ public abstract class AbstractComputerBlock<T extends AbstractComputerBlockEntit
|
|||||||
var serverComputer = computer.createServerComputer();
|
var serverComputer = computer.createServerComputer();
|
||||||
serverComputer.turnOn();
|
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);
|
return InteractionResult.sidedSuccess(level.isClientSide);
|
||||||
}
|
}
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
package dan200.computercraft.shared.computer.blocks;
|
package dan200.computercraft.shared.computer.blocks;
|
||||||
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
|
import com.google.errorprone.annotations.OverridingMethodsMustInvokeSuper;
|
||||||
import dan200.computercraft.api.ComputerCraftAPI;
|
import dan200.computercraft.api.ComputerCraftAPI;
|
||||||
import dan200.computercraft.api.peripheral.IPeripheral;
|
import dan200.computercraft.api.peripheral.IPeripheral;
|
||||||
import dan200.computercraft.core.computer.ComputerSide;
|
import dan200.computercraft.core.computer.ComputerSide;
|
||||||
@@ -187,10 +188,20 @@ public abstract class AbstractComputerBlockEntity extends BlockEntity implements
|
|||||||
@Override
|
@Override
|
||||||
protected void collectImplicitComponents(DataComponentMap.Builder builder) {
|
protected void collectImplicitComponents(DataComponentMap.Builder builder) {
|
||||||
super.collectImplicitComponents(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(ModRegistry.DataComponents.COMPUTER_ID.get(), NonNegativeId.of(computerID));
|
||||||
builder.set(DataComponents.CUSTOM_NAME, label == null ? null : Component.literal(label));
|
builder.set(DataComponents.CUSTOM_NAME, label == null ? null : Component.literal(label));
|
||||||
builder.set(ModRegistry.DataComponents.STORAGE_CAPACITY.get(), storageCapacity > 0 ? new StorageCapacity(storageCapacity) : null);
|
builder.set(ModRegistry.DataComponents.STORAGE_CAPACITY.get(), storageCapacity > 0 ? new StorageCapacity(storageCapacity) : null);
|
||||||
if (lockCode != LockCode.NO_LOCK) builder.set(DataComponents.LOCK, lockCode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -169,8 +169,8 @@ public class TurtleBlockEntity extends AbstractComputerBlockEntity implements Ba
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void collectImplicitComponents(DataComponentMap.Builder builder) {
|
protected void collectSafeComponents(DataComponentMap.Builder builder) {
|
||||||
super.collectImplicitComponents(builder);
|
super.collectSafeComponents(builder);
|
||||||
|
|
||||||
builder.set(DataComponents.DYED_COLOR, brain.getColour() == -1 ? null : new DyedItemColor(brain.getColour(), false));
|
builder.set(DataComponents.DYED_COLOR, brain.getColour() == -1 ? null : new DyedItemColor(brain.getColour(), false));
|
||||||
builder.set(ModRegistry.DataComponents.OVERLAY.get(), brain.getOverlay());
|
builder.set(ModRegistry.DataComponents.OVERLAY.get(), brain.getOverlay());
|
||||||
|
Reference in New Issue
Block a user