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

Update to 1.20.5 (#1793)

- Switch most network code to use StreamCodec
 - Turtle/pocket computer upgrades now use DataComponentPatch instead of
   raw NBT.
This commit is contained in:
Jonathan Coates
2024-04-25 21:32:48 +01:00
committed by GitHub
parent bd2fd9d4c8
commit 01407544c9
393 changed files with 3276 additions and 3915 deletions

View File

@@ -126,25 +126,11 @@ dependencies {
clientApi(clientClasses(project(":forge-api"))) { cct.exclude(this) }
implementation(project(":core")) { cct.exclude(this) }
"minecraftLibrary"(libs.cobalt) {
val version = libs.versions.cobalt.get()
jarJar.ranged(this, "[$version,${getNextVersion(version)})")
}
"minecraftLibrary"(libs.jzlib) {
jarJar.ranged(this, "[${libs.versions.jzlib.get()},)")
}
"minecraftLibrary"(libs.netty.http) {
jarJar.ranged(this, "[${libs.versions.netty.get()},)")
isTransitive = false
}
"minecraftLibrary"(libs.netty.socks) {
jarJar.ranged(this, "[${libs.versions.netty.get()},)")
isTransitive = false
}
"minecraftLibrary"(libs.netty.proxy) {
jarJar.ranged(this, "[${libs.versions.netty.get()},)")
isTransitive = false
}
"minecraftLibrary"(libs.cobalt)
"minecraftLibrary"(libs.jzlib)
"minecraftLibrary"(libs.netty.http)
"minecraftLibrary"(libs.netty.socks)
"minecraftLibrary"(libs.netty.proxy)
testFixturesApi(libs.bundles.test)
testFixturesApi(libs.bundles.kotlin)
@@ -186,6 +172,8 @@ tasks.sourcesJar {
for (source in cct.sourceDirectories.get()) from(source.sourceSet.allSource)
}
jarJar.enable()
tasks.jarJar {
archiveClassifier.set("")
configuration(project.configurations["minecraftLibrary"])
@@ -203,11 +191,6 @@ tasks.test {
systemProperty("cct.test-files", layout.buildDirectory.dir("tmp/testFiles").getAbsolutePath())
}
tasks.checkDependencyConsistency {
// Forge pulls in slf4j 2.0.9 instead of 2.0.7, so we need to override that.
override(libs.slf4j.asProvider(), "2.0.9")
}
val runGametest by tasks.registering(JavaExec::class) {
group = LifecycleBasePlugin.VERIFICATION_GROUP
description = "Runs tests on a temporary Minecraft instance."
@@ -250,8 +233,6 @@ tasks.withType(GenerateModuleMetadata::class).configureEach { isEnabled = false
publishing {
publications {
named("maven", MavenPublication::class) {
jarJar.component(this)
mavenDependencies {
cct.configureExcludes(this)
}

View File

@@ -9,7 +9,7 @@ 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.Mod;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.*;
import net.neoforged.neoforge.client.event.sound.PlayStreamingSourceEvent;
import net.neoforged.neoforge.event.TickEvent;
@@ -18,7 +18,7 @@ import net.neoforged.neoforge.event.level.LevelEvent;
/**
* Forge-specific dispatch for {@link ClientHooks}.
*/
@Mod.EventBusSubscriber(modid = ComputerCraftAPI.MOD_ID, value = Dist.CLIENT)
@EventBusSubscriber(modid = ComputerCraftAPI.MOD_ID, value = Dist.CLIENT)
public final class ForgeClientHooks {
private ForgeClientHooks() {
}

View File

@@ -14,7 +14,7 @@ import net.minecraft.resources.ResourceLocation;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.ModLoader;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
import net.neoforged.neoforge.client.event.*;
@@ -23,7 +23,7 @@ import java.io.IOException;
/**
* Registers textures and models for items.
*/
@Mod.EventBusSubscriber(modid = ComputerCraftAPI.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD)
@EventBusSubscriber(modid = ComputerCraftAPI.MOD_ID, value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD)
public final class ForgeClientRegistry {
private static final Object lock = new Object();
private static boolean gatheredModellers = false;
@@ -49,7 +49,7 @@ public final class ForgeClientRegistry {
if (gatheredModellers) return;
gatheredModellers = true;
ModLoader.get().postEvent(new RegisterTurtleModellersEvent(TurtleUpgradeModellers::register));
ModLoader.postEvent(new RegisterTurtleModellersEvent(TurtleUpgradeModellers::register));
}
}

View File

@@ -8,18 +8,12 @@ import com.google.auto.service.AutoService;
import com.mojang.blaze3d.vertex.PoseStack;
import dan200.computercraft.client.model.FoiledModel;
import dan200.computercraft.client.render.ModelRenderer;
import dan200.computercraft.shared.network.NetworkMessage;
import dan200.computercraft.shared.network.server.ServerNetworkContext;
import dan200.computercraft.shared.platform.ForgeMessageType;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.ModelManager;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.common.ServerCommonPacketListener;
import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.RandomSource;
@@ -44,11 +38,6 @@ public class ClientPlatformHelperImpl implements ClientPlatformHelper {
return new FoiledModel(model);
}
@Override
public Packet<ServerCommonPacketListener> createPacket(NetworkMessage<ServerNetworkContext> message) {
return new ServerboundCustomPayloadPacket(ForgeMessageType.createPayload(message));
}
@Override
public void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, @Nullable int[] tints) {
for (var renderType : model.getRenderTypes(ItemStack.EMPTY, true)) {

View File

@@ -18,8 +18,10 @@ import dan200.computercraft.shared.ModRegistry;
import dan200.computercraft.shared.config.Config;
import dan200.computercraft.shared.config.ConfigSpec;
import dan200.computercraft.shared.details.FluidData;
import dan200.computercraft.shared.network.NetworkMessage;
import dan200.computercraft.shared.network.NetworkMessages;
import dan200.computercraft.shared.network.client.ClientNetworkContext;
import dan200.computercraft.shared.network.server.ServerNetworkContext;
import dan200.computercraft.shared.peripheral.commandblock.CommandBlockPeripheral;
import dan200.computercraft.shared.peripheral.generic.methods.EnergyMethods;
import dan200.computercraft.shared.peripheral.generic.methods.FluidMethods;
@@ -28,12 +30,14 @@ import dan200.computercraft.shared.peripheral.modem.wired.CableBlockEntity;
import dan200.computercraft.shared.peripheral.modem.wired.WiredModemFullBlockEntity;
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemBlockEntity;
import dan200.computercraft.shared.platform.ForgeConfigFile;
import dan200.computercraft.shared.platform.ForgeMessageType;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.ModLoadingContext;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.config.ModConfig;
import net.neoforged.fml.event.config.ModConfigEvent;
@@ -41,22 +45,24 @@ import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.neoforge.capabilities.Capabilities;
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
import net.neoforged.neoforge.network.registration.PayloadRegistrar;
import net.neoforged.neoforge.registries.NewRegistryEvent;
import net.neoforged.neoforge.registries.RegistryBuilder;
import javax.annotation.Nullable;
@Mod(ComputerCraftAPI.MOD_ID)
@Mod.EventBusSubscriber(modid = ComputerCraftAPI.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
@EventBusSubscriber(modid = ComputerCraftAPI.MOD_ID, bus = EventBusSubscriber.Bus.MOD)
public final class ComputerCraft {
private static @Nullable IEventBus eventBus;
public ComputerCraft(IEventBus eventBus) {
withEventBus(eventBus, ModRegistry::register);
ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, ((ForgeConfigFile) ConfigSpec.serverSpec).spec());
ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, ((ForgeConfigFile) ConfigSpec.clientSpec).spec());
var container = ModLoadingContext.get().getActiveContainer();
container.registerConfig(ModConfig.Type.SERVER, ((ForgeConfigFile) ConfigSpec.serverSpec).spec());
container.registerConfig(ModConfig.Type.CLIENT, ((ForgeConfigFile) ConfigSpec.clientSpec).spec());
}
private static void withEventBus(IEventBus eventBus, Runnable task) {
@@ -93,22 +99,19 @@ public final class ComputerCraft {
}
@SubscribeEvent
public static void registerNetwork(RegisterPayloadHandlerEvent event) {
public static void registerNetwork(RegisterPayloadHandlersEvent event) {
var registrar = event.registrar(ComputerCraftAPI.MOD_ID).versioned(ComputerCraftAPI.getInstalledVersion());
for (var type : NetworkMessages.getServerbound()) {
var forgeType = ForgeMessageType.cast(type);
registrar.play(forgeType.id(), forgeType.reader(), builder -> builder.server(
(t, context) -> context.workHandler().execute(() -> t.payload().handle(() -> (ServerPlayer) context.player().orElseThrow()))
));
}
for (var type : NetworkMessages.getServerbound()) registerServerbound(registrar, type);
for (var type : NetworkMessages.getClientbound()) registerClientbound(registrar, type);
}
for (var type : NetworkMessages.getClientbound()) {
var forgeType = ForgeMessageType.cast(type);
registrar.play(forgeType.id(), forgeType.reader(), builder -> builder.client(
(t, context) -> context.workHandler().execute(() -> t.payload().handle(ClientHolderHolder.get()))
));
}
private static <T extends NetworkMessage<ServerNetworkContext>> void registerServerbound(PayloadRegistrar registrar, CustomPacketPayload.TypeAndCodec<RegistryFriendlyByteBuf, T> type) {
registrar.playToServer(type.type(), type.codec(), (t, context) -> context.enqueueWork(() -> t.handle(() -> (ServerPlayer) context.player())));
}
private static <T extends NetworkMessage<ClientNetworkContext>> void registerClientbound(PayloadRegistrar registrar, CustomPacketPayload.TypeAndCodec<RegistryFriendlyByteBuf, T> type) {
registrar.playToClient(type.type(), type.codec(), (t, context) -> context.enqueueWork(() -> t.handle(ClientHolderHolder.get())));
}
/**

View File

@@ -22,7 +22,7 @@ import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.common.data.BlockTagsProvider;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import net.neoforged.neoforge.common.data.JsonCodecProvider;
@@ -32,9 +32,10 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD)
public class Generators {
@SubscribeEvent
public static void gather(GatherDataEvent event) {
@@ -52,6 +53,11 @@ public class Generators {
return generator.addProvider(p -> new PrettyDataProvider<>(factory.create(p))).provider();
}
@Override
public <T extends DataProvider> T add(BiFunction<PackOutput, CompletableFuture<HolderLookup.Provider>, T> factory) {
return generator.addProvider(p -> factory.apply(p, registries));
}
@Override
public <T> void addFromCodec(String name, PackType type, String directory, Codec<T> codec, Consumer<BiConsumer<ResourceLocation, T>> output) {
add(out -> {
@@ -70,7 +76,7 @@ public class Generators {
@Override
public void lootTable(List<LootTableProvider.SubProviderEntry> tables) {
add(out -> new LootTableProvider(out, Set.of(), tables));
add((out, registries) -> new LootTableProvider(out, Set.of(), tables, registries));
}
@Override

View File

@@ -8,11 +8,13 @@ import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.shared.command.CommandComputerCraft;
import dan200.computercraft.shared.network.client.UpgradesLoadedMessage;
import dan200.computercraft.shared.network.server.ServerNetworking;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.chunk.LevelChunk;
import net.neoforged.bus.api.EventPriority;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.event.*;
import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent;
import net.neoforged.neoforge.event.entity.living.LivingDropsEvent;
@@ -26,7 +28,7 @@ import net.neoforged.neoforge.event.server.ServerStoppedEvent;
/**
* Forge-specific dispatch for {@link CommonHooks}.
*/
@Mod.EventBusSubscriber(modid = ComputerCraftAPI.MOD_ID)
@EventBusSubscriber(modid = ComputerCraftAPI.MOD_ID)
public class ForgeCommonHooks {
@SubscribeEvent
public static void onServerTick(TickEvent.ServerTickEvent event) {
@@ -90,7 +92,7 @@ public class ForgeCommonHooks {
@SubscribeEvent
public static void lootLoad(LootTableLoadEvent event) {
var pool = CommonHooks.getExtraLootPool(event.getName());
var pool = CommonHooks.getExtraLootPool(ResourceKey.create(Registries.LOOT_TABLE, event.getName()));
if (pool != null) event.getTable().addPool(pool.build());
}

View File

@@ -17,9 +17,9 @@ import net.neoforged.neoforge.common.util.FakePlayer;
import javax.annotation.Nullable;
import java.util.OptionalInt;
import static dan200.computercraft.shared.platform.FakePlayerConstants.MAX_REACH;
class FakePlayerExt extends FakePlayer {
private static final EntityDimensions DIMENSIONS = EntityDimensions.fixed(0, 0);
FakePlayerExt(ServerLevel serverLevel, GameProfile profile) {
super(serverLevel, profile);
}
@@ -45,18 +45,8 @@ class FakePlayerExt extends FakePlayer {
}
@Override
public float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) {
return 0;
}
@Override
public double getBlockReach() {
return MAX_REACH;
}
@Override
public double getEntityReach() {
return MAX_REACH;
public EntityDimensions getDefaultDimensions(Pose pose) {
return DIMENSIONS;
}
@Override

View File

@@ -63,7 +63,7 @@ public class ForgeContainerTransfer implements ContainerTransfer.Slotted {
if (movedStack.isEmpty()) {
movedStack = stack.copy();
if (stack.getMaxStackSize() < maxAmount) maxAmount = stack.getMaxStackSize();
} else if (!ItemStack.isSameItemSameTags(stack, movedStack)) {
} else if (!ItemStack.isSameItemSameComponents(stack, movedStack)) {
continue;
}

View File

@@ -1,45 +0,0 @@
// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
package dan200.computercraft.shared.platform;
import dan200.computercraft.shared.network.MessageType;
import dan200.computercraft.shared.network.NetworkMessage;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
/**
* A {@link MessageType} implementation for Forge.
* <p>
* This wraps {@link NetworkMessage}s into a {@link CustomPacketPayload}, allowing us to easily use Minecraft's existing
* custom packets.
*
* @param id The id of this message.
* @param reader Read this message from a network buffer.
* @param <T> The type of our {@link NetworkMessage}.
*/
public record ForgeMessageType<T extends NetworkMessage<?>>(
ResourceLocation id, FriendlyByteBuf.Reader<Payload<T>> reader
) implements MessageType<T> {
public static <T extends NetworkMessage<?>> ForgeMessageType<T> cast(MessageType<T> type) {
return (ForgeMessageType<T>) type;
}
public static CustomPacketPayload createPayload(NetworkMessage<?> message) {
return new Payload<>(message);
}
public record Payload<T extends NetworkMessage<?>>(T payload) implements CustomPacketPayload {
@Override
public void write(FriendlyByteBuf buf) {
payload().write(buf);
}
@Override
public ResourceLocation id() {
return payload().type().id();
}
}
}

View File

@@ -18,9 +18,6 @@ import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.PeripheralCapability;
import dan200.computercraft.impl.Peripherals;
import dan200.computercraft.shared.config.ConfigFile;
import dan200.computercraft.shared.network.MessageType;
import dan200.computercraft.shared.network.NetworkMessage;
import dan200.computercraft.shared.network.client.ClientNetworkContext;
import dan200.computercraft.shared.network.container.ContainerData;
import dan200.computercraft.shared.util.InventoryUtil;
import net.minecraft.commands.synchronization.ArgumentTypeInfo;
@@ -28,10 +25,8 @@ import net.minecraft.commands.synchronization.ArgumentTypeInfos;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Registry;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.common.ClientCommonPacketListener;
import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
@@ -54,9 +49,7 @@ import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
@@ -81,8 +74,9 @@ import javax.annotation.Nullable;
import java.util.EnumSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.*;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;
@AutoService(dan200.computercraft.impl.PlatformHelper.class)
public class PlatformHelperImpl implements PlatformHelper {
@@ -115,13 +109,7 @@ public class PlatformHelperImpl implements PlatformHelper {
object.add(ConditionalOps.DEFAULT_CONDITIONS_KEY, conditions);
}
conditions.add(ICondition.CODEC.encodeStart(JsonOps.INSTANCE, new ModLoadedCondition(modId)).getOrThrow(false, x -> {
}));
}
@Override
public <T extends BlockEntity> BlockEntityType<T> createBlockEntityType(BiFunction<BlockPos, BlockState, T> factory, Block block) {
return new BlockEntityType<>(factory::apply, Set.of(block), null);
conditions.add(ICondition.CODEC.encodeStart(JsonOps.INSTANCE, new ModLoadedCondition(modId)).getOrThrow());
}
@Override
@@ -130,23 +118,13 @@ public class PlatformHelperImpl implements PlatformHelper {
}
@Override
public <C extends AbstractContainerMenu, T extends ContainerData> MenuType<C> createMenuType(Function<FriendlyByteBuf, T> reader, ContainerData.Factory<C, T> factory) {
return IMenuTypeExtension.create((id, player, data) -> factory.create(id, player, reader.apply(data)));
public <C extends AbstractContainerMenu, T extends ContainerData> MenuType<C> createMenuType(StreamCodec<RegistryFriendlyByteBuf, T> codec, ContainerData.Factory<C, T> factory) {
return IMenuTypeExtension.create((id, player, data) -> factory.create(id, player, codec.decode(data)));
}
@Override
public void openMenu(Player player, MenuProvider owner, ContainerData menu) {
((ServerPlayer) player).openMenu(owner, menu::toBytes);
}
@Override
public <T extends NetworkMessage<?>> MessageType<T> createMessageType(ResourceLocation id, FriendlyByteBuf.Reader<T> reader) {
return new ForgeMessageType<>(id, b -> new ForgeMessageType.Payload<>(reader.apply(b)));
}
@Override
public Packet<ClientCommonPacketListener> createPacket(NetworkMessage<ClientNetworkContext> message) {
return new ClientboundCustomPayloadPacket(ForgeMessageType.createPayload(message));
player.openMenu(owner, menu::toBytes);
}
@Override
@@ -189,14 +167,13 @@ public class PlatformHelperImpl implements PlatformHelper {
public RecipeIngredients getRecipeIngredients() {
return new RecipeIngredients(
Ingredient.of(Tags.Items.DUSTS_REDSTONE),
Ingredient.of(Tags.Items.STRING),
Ingredient.of(Tags.Items.LEATHER),
Ingredient.of(Tags.Items.STONE),
Ingredient.of(Tags.Items.STRINGS),
Ingredient.of(Tags.Items.LEATHERS),
Ingredient.of(Tags.Items.STONES),
Ingredient.of(Tags.Items.GLASS_PANES),
Ingredient.of(Tags.Items.INGOTS_GOLD),
Ingredient.of(Tags.Items.STORAGE_BLOCKS_GOLD),
Ingredient.of(Tags.Items.INGOTS_IRON),
Ingredient.of(Tags.Items.HEADS),
Ingredient.of(Tags.Items.DYES),
Ingredient.of(Tags.Items.ENDER_PEARLS),
Ingredient.of(Tags.Items.CHESTS_WOODEN)
@@ -227,7 +204,7 @@ public class PlatformHelperImpl implements PlatformHelper {
@Override
public int getBurnTime(ItemStack stack) {
return CommonHooks.getBurnTime(stack, null);
return stack.getBurnTime(null);
}
@Override
@@ -263,11 +240,6 @@ public class PlatformHelperImpl implements PlatformHelper {
return new FakePlayerExt(world, profile);
}
@Override
public double getReachDistance(Player player) {
return player.getBlockReach();
}
@Override
public boolean hasToolUsage(ItemStack stack) {
return stack.canPerformAction(ToolActions.SHOVEL_FLATTEN) || stack.canPerformAction(ToolActions.HOE_TILL);
@@ -305,8 +277,8 @@ public class PlatformHelperImpl implements PlatformHelper {
var block = level.getBlockState(hit.getBlockPos());
if (event.getUseBlock() != Event.Result.DENY && !block.isAir() && canUseBlock.test(block)) {
var useResult = block.use(level, player, InteractionHand.MAIN_HAND, hit);
if (useResult.consumesAction()) return useResult;
var useResult = block.useItemOn(stack, level, player, InteractionHand.MAIN_HAND, hit);
if (useResult.consumesAction()) return useResult.result();
}
return event.getUseItem() == Event.Result.DENY ? InteractionResult.PASS : stack.useOn(context);

View File

@@ -12,7 +12,6 @@ protected com.mojang.blaze3d.vertex.VertexBuffer format
# ClientTableFormatter
public net.minecraft.client.gui.components.ChatComponent allMessages
public net.minecraft.client.gui.components.ChatComponent refreshTrimmedMessage()V
# ItemPocketRenderer/ItemPrintoutRenderer
public net.minecraft.client.renderer.ItemInHandRenderer calculateMapTilt(F)F
@@ -33,3 +32,5 @@ public net.minecraft.data.models.ItemModelGenerators output
public net.minecraft.data.models.ItemModelGenerators generateFlatItem(Lnet/minecraft/world/item/Item;Lnet/minecraft/data/models/model/ModelTemplate;)V
public net.minecraft.data.models.ItemModelGenerators generateFlatItem(Lnet/minecraft/world/item/Item;Ljava/lang/String;Lnet/minecraft/data/models/model/ModelTemplate;)V
public net.minecraft.data.models.model.TextureSlot create(Ljava/lang/String;)Lnet/minecraft/data/models/model/TextureSlot;
public net.minecraft.util.datafix.fixes.ItemStackComponentizationFix$ItemStackData

View File

@@ -26,7 +26,7 @@ CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles a
[[dependencies.computercraft]]
modId="neoforge"
type="required"
versionRange="[${neoVersion},20.5)"
versionRange="[${neoVersion},20.6)"
ordering="NONE"
side="BOTH"