mirror of
https://github.com/ViaVersion/ViaFabricPlus.git
synced 2025-02-08 00:22:38 +01:00
More work
This commit is contained in:
parent
396f2c80df
commit
05a62d8600
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.features.interaction;
|
||||
package com.viaversion.viafabricplus.features.interaction.replace_block_placement_logic;
|
||||
|
||||
import net.minecraft.util.ActionResult;
|
||||
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.features.interaction;
|
||||
package com.viaversion.viafabricplus.features.interaction.v1_18_2_block_ack_emulation;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viafabricplus.ViaFabricPlusImpl;
|
@ -21,7 +21,7 @@
|
||||
|
||||
package com.viaversion.viafabricplus.injection.access;
|
||||
|
||||
import com.viaversion.viafabricplus.features.interaction.ClientPlayerInteractionManager1_18_2;
|
||||
import com.viaversion.viafabricplus.features.interaction.v1_18_2_block_ack_emulation.ClientPlayerInteractionManager1_18_2;
|
||||
|
||||
public interface IClientPlayerInteractionManager {
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.inventory_clicking;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.container_clicking;
|
||||
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
||||
import net.minecraft.item.ItemStack;
|
@ -0,0 +1,132 @@
|
||||
/*
|
||||
* This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus
|
||||
* Copyright (C) 2021-2024 the original authors
|
||||
* - FlorianMichael/EnZaXD <florian.michael07@gmail.com>
|
||||
* - RK_01/RaphiMC
|
||||
* Copyright (C) 2023-2024 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.container_clicking;
|
||||
|
||||
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ServerboundPackets1_16_2;
|
||||
import com.viaversion.viaversion.protocols.v1_16_4to1_17.Protocol1_16_4To1_17;
|
||||
import com.viaversion.viafabricplus.injection.access.base.IClientConnection;
|
||||
import com.viaversion.viafabricplus.injection.access.IScreenHandler;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.translator.ItemTranslator;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.network.ClientPlayNetworkHandler;
|
||||
import net.minecraft.client.network.ClientPlayerInteractionManager;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.network.packet.Packet;
|
||||
import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket;
|
||||
import net.minecraft.screen.slot.SlotActionType;
|
||||
import net.raphimc.vialegacy.api.LegacyProtocolVersion;
|
||||
import org.spongepowered.asm.mixin.*;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@SuppressWarnings("DataFlowIssue")
|
||||
@Mixin(ClientPlayerInteractionManager.class)
|
||||
public abstract class MixinClientPlayerInteractionManager {
|
||||
|
||||
@Shadow
|
||||
@Final
|
||||
private MinecraftClient client;
|
||||
|
||||
@Shadow
|
||||
@Final
|
||||
private ClientPlayNetworkHandler networkHandler;
|
||||
|
||||
@Unique
|
||||
private ItemStack viaFabricPlus$oldCursorStack;
|
||||
|
||||
@Unique
|
||||
private List<ItemStack> viaFabricPlus$oldItems;
|
||||
|
||||
@ModifyVariable(method = "clickSlot", at = @At(value = "STORE"), ordinal = 0)
|
||||
private List<ItemStack> captureOldItems(List<ItemStack> oldItems) {
|
||||
viaFabricPlus$oldCursorStack = client.player.currentScreenHandler.getCursorStack().copy();
|
||||
return this.viaFabricPlus$oldItems = oldItems;
|
||||
}
|
||||
|
||||
@WrapWithCondition(method = "clickSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/packet/Packet;)V"))
|
||||
private boolean handleWindowClick1_16_5(ClientPlayNetworkHandler instance, Packet<?> packet) {
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_16_4) && packet instanceof ClickSlotC2SPacket clickSlot) {
|
||||
ItemStack slotItemBeforeModification;
|
||||
if (this.viaFabricPlus$shouldBeEmpty(clickSlot.getActionType(), clickSlot.getSlot())) {
|
||||
slotItemBeforeModification = ItemStack.EMPTY;
|
||||
} else if (clickSlot.getSlot() < 0 || clickSlot.getSlot() >= viaFabricPlus$oldItems.size()) {
|
||||
slotItemBeforeModification = viaFabricPlus$oldCursorStack;
|
||||
} else {
|
||||
slotItemBeforeModification = viaFabricPlus$oldItems.get(clickSlot.getSlot());
|
||||
}
|
||||
|
||||
final PacketWrapper containerClick = PacketWrapper.create(ServerboundPackets1_16_2.CONTAINER_CLICK, ((IClientConnection) networkHandler.getConnection()).viaFabricPlus$getUserConnection());
|
||||
containerClick.write(Types.UNSIGNED_BYTE, (short) clickSlot.getSyncId());
|
||||
containerClick.write(Types.SHORT, (short) clickSlot.getSlot());
|
||||
containerClick.write(Types.BYTE, (byte) clickSlot.getButton());
|
||||
containerClick.write(Types.SHORT, ((IScreenHandler) client.player.currentScreenHandler).viaFabricPlus$incrementAndGetActionId());
|
||||
containerClick.write(Types.VAR_INT, clickSlot.getActionType().ordinal());
|
||||
containerClick.write(Types.ITEM1_13_2, ItemTranslator.mcToVia(slotItemBeforeModification, ProtocolVersion.v1_16_4));
|
||||
containerClick.scheduleSendToServer(Protocol1_16_4To1_17.class);
|
||||
|
||||
viaFabricPlus$oldCursorStack = null;
|
||||
viaFabricPlus$oldItems = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Inject(method = "clickSlot", at = @At("HEAD"), cancellable = true)
|
||||
private void removeClickActions(int syncId, int slotId, int button, SlotActionType actionType, PlayerEntity player, CallbackInfo ci) {
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2) && !actionType.equals(SlotActionType.PICKUP)) {
|
||||
ci.cancel();
|
||||
} else if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_4_6tor1_4_7) && !actionType.equals(SlotActionType.PICKUP) && !actionType.equals(SlotActionType.QUICK_MOVE) && !actionType.equals(SlotActionType.SWAP) && !actionType.equals(SlotActionType.CLONE)) {
|
||||
ci.cancel();
|
||||
}
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_15_2) && actionType == SlotActionType.SWAP && button == 40) { // Pressing 'F' in inventory
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@Unique
|
||||
private boolean viaFabricPlus$shouldBeEmpty(final SlotActionType type, final int slot) {
|
||||
// quick craft always uses empty stack for verification
|
||||
if (type == SlotActionType.QUICK_CRAFT) return true;
|
||||
|
||||
// Special case: throw always uses empty stack for verification
|
||||
if (type == SlotActionType.THROW) return true;
|
||||
|
||||
// quick move always uses empty stack for verification since 1.12
|
||||
if (type == SlotActionType.QUICK_MOVE && ProtocolTranslator.getTargetVersion().newerThan(ProtocolVersion.v1_11_1))
|
||||
return true;
|
||||
|
||||
// pickup with slot -999 (outside window) to throw items always uses empty stack for verification
|
||||
return type == SlotActionType.PICKUP && slot == -999;
|
||||
}
|
||||
|
||||
}
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.inventory_clicking;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.container_clicking;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.container_clicking;
|
||||
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.container_clicking;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viafabricplus.injection.access.IScreenHandler;
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.inventory_clicking;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.remove_fuel_slot;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.inventory_clicking;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.remove_offhand_slot;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
@ -19,23 +19,13 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.replace_block_item_use_logic;
|
||||
|
||||
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
|
||||
import com.llamalad7.mixinextras.sugar.Local;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ServerboundPackets1_16_2;
|
||||
import com.viaversion.viaversion.protocols.v1_16_4to1_17.Protocol1_16_4To1_17;
|
||||
import com.viaversion.viafabricplus.features.interaction.ActionResultException1_12_2;
|
||||
import com.viaversion.viafabricplus.features.interaction.ClientPlayerInteractionManager1_18_2;
|
||||
import com.viaversion.viafabricplus.injection.access.base.IClientConnection;
|
||||
import com.viaversion.viafabricplus.injection.access.IClientPlayerInteractionManager;
|
||||
import com.viaversion.viafabricplus.injection.access.IScreenHandler;
|
||||
import com.viaversion.viafabricplus.features.interaction.replace_block_placement_logic.ActionResultException1_12_2;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.impl.provider.viaversion.ViaFabricPlusHandItemProvider;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.translator.ItemTranslator;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.SnowBlock;
|
||||
@ -51,11 +41,8 @@ import net.minecraft.item.ItemPlacementContext;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.ItemUsageContext;
|
||||
import net.minecraft.network.packet.Packet;
|
||||
import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket;
|
||||
import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket;
|
||||
import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket;
|
||||
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
|
||||
import net.minecraft.screen.slot.SlotActionType;
|
||||
import net.minecraft.util.ActionResult;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
@ -63,22 +50,18 @@ import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.world.GameMode;
|
||||
import net.minecraft.world.World;
|
||||
import net.raphimc.vialegacy.api.LegacyProtocolVersion;
|
||||
import org.apache.commons.lang3.mutable.MutableObject;
|
||||
import org.spongepowered.asm.mixin.*;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
@SuppressWarnings("DataFlowIssue")
|
||||
@Mixin(ClientPlayerInteractionManager.class)
|
||||
public abstract class MixinClientPlayerInteractionManager implements IClientPlayerInteractionManager {
|
||||
public abstract class MixinClientPlayerInteractionManager {
|
||||
|
||||
@Shadow
|
||||
@Final
|
||||
@ -103,15 +86,6 @@ public abstract class MixinClientPlayerInteractionManager implements IClientPlay
|
||||
@Shadow
|
||||
private GameMode gameMode;
|
||||
|
||||
@Unique
|
||||
private ItemStack viaFabricPlus$oldCursorStack;
|
||||
|
||||
@Unique
|
||||
private List<ItemStack> viaFabricPlus$oldItems;
|
||||
|
||||
@Unique
|
||||
private final ClientPlayerInteractionManager1_18_2 viaFabricPlus$1_18_2InteractionManager = new ClientPlayerInteractionManager1_18_2();
|
||||
|
||||
@Redirect(method = "interactBlockInternal", at = @At(value = "FIELD", target = "Lnet/minecraft/util/ActionResult;CONSUME:Lnet/minecraft/util/ActionResult$Success;"))
|
||||
private ActionResult.Success changeSpectatorAction() {
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_21)) {
|
||||
@ -135,56 +109,6 @@ public abstract class MixinClientPlayerInteractionManager implements IClientPlay
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "sendSequencedPacket", at = @At("HEAD"))
|
||||
private void trackPlayerAction(ClientWorld world, SequencedPacketCreator packetCreator, CallbackInfo ci) {
|
||||
if (ProtocolTranslator.getTargetVersion().betweenInclusive(ProtocolVersion.v1_14_4, ProtocolVersion.v1_18_2) && packetCreator instanceof PlayerActionC2SPacket playerActionC2SPacket) {
|
||||
this.viaFabricPlus$1_18_2InteractionManager.trackPlayerAction(playerActionC2SPacket.getAction(), playerActionC2SPacket.getPos());
|
||||
}
|
||||
}
|
||||
|
||||
@Redirect(method = {"attackBlock", "cancelBlockBreaking"}, at = @At(value = "NEW", target = "(Lnet/minecraft/network/packet/c2s/play/PlayerActionC2SPacket$Action;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/Direction;)Lnet/minecraft/network/packet/c2s/play/PlayerActionC2SPacket;"))
|
||||
private PlayerActionC2SPacket trackPlayerAction(PlayerActionC2SPacket.Action action, BlockPos pos, Direction direction) {
|
||||
if (ProtocolTranslator.getTargetVersion().betweenInclusive(ProtocolVersion.v1_14_4, ProtocolVersion.v1_18_2)) {
|
||||
this.viaFabricPlus$1_18_2InteractionManager.trackPlayerAction(action, pos);
|
||||
}
|
||||
return new PlayerActionC2SPacket(action, pos, direction);
|
||||
}
|
||||
|
||||
@ModifyVariable(method = "clickSlot", at = @At(value = "STORE"), ordinal = 0)
|
||||
private List<ItemStack> captureOldItems(List<ItemStack> oldItems) {
|
||||
viaFabricPlus$oldCursorStack = client.player.currentScreenHandler.getCursorStack().copy();
|
||||
return this.viaFabricPlus$oldItems = oldItems;
|
||||
}
|
||||
|
||||
@WrapWithCondition(method = "clickSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/packet/Packet;)V"))
|
||||
private boolean handleWindowClick1_16_5(ClientPlayNetworkHandler instance, Packet<?> packet) {
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_16_4) && packet instanceof ClickSlotC2SPacket clickSlot) {
|
||||
ItemStack slotItemBeforeModification;
|
||||
if (this.viaFabricPlus$shouldBeEmpty(clickSlot.getActionType(), clickSlot.getSlot())) {
|
||||
slotItemBeforeModification = ItemStack.EMPTY;
|
||||
} else if (clickSlot.getSlot() < 0 || clickSlot.getSlot() >= viaFabricPlus$oldItems.size()) {
|
||||
slotItemBeforeModification = viaFabricPlus$oldCursorStack;
|
||||
} else {
|
||||
slotItemBeforeModification = viaFabricPlus$oldItems.get(clickSlot.getSlot());
|
||||
}
|
||||
|
||||
final PacketWrapper containerClick = PacketWrapper.create(ServerboundPackets1_16_2.CONTAINER_CLICK, ((IClientConnection) networkHandler.getConnection()).viaFabricPlus$getUserConnection());
|
||||
containerClick.write(Types.UNSIGNED_BYTE, (short) clickSlot.getSyncId());
|
||||
containerClick.write(Types.SHORT, (short) clickSlot.getSlot());
|
||||
containerClick.write(Types.BYTE, (byte) clickSlot.getButton());
|
||||
containerClick.write(Types.SHORT, ((IScreenHandler) client.player.currentScreenHandler).viaFabricPlus$incrementAndGetActionId());
|
||||
containerClick.write(Types.VAR_INT, clickSlot.getActionType().ordinal());
|
||||
containerClick.write(Types.ITEM1_13_2, ItemTranslator.mcToVia(slotItemBeforeModification, ProtocolVersion.v1_16_4));
|
||||
containerClick.scheduleSendToServer(Protocol1_16_4To1_17.class);
|
||||
|
||||
viaFabricPlus$oldCursorStack = null;
|
||||
viaFabricPlus$oldItems = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Redirect(method = {"method_41936", "method_41935"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;breakBlock(Lnet/minecraft/util/math/BlockPos;)Z"))
|
||||
private boolean checkFireBlock(ClientPlayerInteractionManager instance, BlockPos pos, @Local(argsOnly = true) Direction direction) {
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_15_2)) {
|
||||
@ -240,6 +164,20 @@ public abstract class MixinClientPlayerInteractionManager implements IClientPlay
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "interactItem", at = @At("HEAD"), cancellable = true)
|
||||
private void cancelOffHandItemInteract(PlayerEntity player, Hand hand, CallbackInfoReturnable<ActionResult> cir) {
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_8) && !Hand.MAIN_HAND.equals(hand)) {
|
||||
cir.setReturnValue(ActionResult.PASS);
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "interactBlock", at = @At("HEAD"), cancellable = true)
|
||||
private void cancelOffHandBlockPlace(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable<ActionResult> cir) {
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_8) && !Hand.MAIN_HAND.equals(hand)) {
|
||||
cir.setReturnValue(ActionResult.PASS);
|
||||
}
|
||||
}
|
||||
|
||||
@Redirect(method = "method_41929", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;use(Lnet/minecraft/world/World;Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/Hand;)Lnet/minecraft/util/ActionResult;"))
|
||||
private ActionResult eitherSuccessOrPass(ItemStack instance, World world, PlayerEntity user, Hand hand, @Local ItemStack itemStack) {
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_8)) {
|
||||
@ -273,20 +211,6 @@ public abstract class MixinClientPlayerInteractionManager implements IClientPlay
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "interactItem", at = @At("HEAD"), cancellable = true)
|
||||
private void cancelOffHandItemInteract(PlayerEntity player, Hand hand, CallbackInfoReturnable<ActionResult> cir) {
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_8) && !Hand.MAIN_HAND.equals(hand)) {
|
||||
cir.setReturnValue(ActionResult.PASS);
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "interactBlock", at = @At("HEAD"), cancellable = true)
|
||||
private void cancelOffHandBlockPlace(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable<ActionResult> cir) {
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_8) && !Hand.MAIN_HAND.equals(hand)) {
|
||||
cir.setReturnValue(ActionResult.PASS);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @author RK_01
|
||||
* @reason Block place fix
|
||||
@ -313,18 +237,6 @@ public abstract class MixinClientPlayerInteractionManager implements IClientPlay
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "clickSlot", at = @At("HEAD"), cancellable = true)
|
||||
private void removeClickActions(int syncId, int slotId, int button, SlotActionType actionType, PlayerEntity player, CallbackInfo ci) {
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2) && !actionType.equals(SlotActionType.PICKUP)) {
|
||||
ci.cancel();
|
||||
} else if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_4_6tor1_4_7) && !actionType.equals(SlotActionType.PICKUP) && !actionType.equals(SlotActionType.QUICK_MOVE) && !actionType.equals(SlotActionType.SWAP) && !actionType.equals(SlotActionType.CLONE)) {
|
||||
ci.cancel();
|
||||
}
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_15_2) && actionType == SlotActionType.SWAP && button == 40) { // Pressing 'F' in inventory
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@Unique
|
||||
private boolean viaFabricPlus$extinguishFire(BlockPos blockPos, final Direction direction) {
|
||||
blockPos = blockPos.offset(direction);
|
||||
@ -336,25 +248,4 @@ public abstract class MixinClientPlayerInteractionManager implements IClientPlay
|
||||
return false;
|
||||
}
|
||||
|
||||
@Unique
|
||||
private boolean viaFabricPlus$shouldBeEmpty(final SlotActionType type, final int slot) {
|
||||
// quick craft always uses empty stack for verification
|
||||
if (type == SlotActionType.QUICK_CRAFT) return true;
|
||||
|
||||
// Special case: throw always uses empty stack for verification
|
||||
if (type == SlotActionType.THROW) return true;
|
||||
|
||||
// quick move always uses empty stack for verification since 1.12
|
||||
if (type == SlotActionType.QUICK_MOVE && ProtocolTranslator.getTargetVersion().newerThan(ProtocolVersion.v1_11_1))
|
||||
return true;
|
||||
|
||||
// pickup with slot -999 (outside window) to throw items always uses empty stack for verification
|
||||
return type == SlotActionType.PICKUP && slot == -999;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientPlayerInteractionManager1_18_2 viaFabricPlus$get1_18_2InteractionManager() {
|
||||
return this.viaFabricPlus$1_18_2InteractionManager;
|
||||
}
|
||||
|
||||
}
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.replace_block_item_use_logic;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.replace_block_item_use_logic.item_and_block_use_at_same_time;
|
||||
|
||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus
|
||||
* Copyright (C) 2021-2024 the original authors
|
||||
* - FlorianMichael/EnZaXD <florian.michael07@gmail.com>
|
||||
* - RK_01/RaphiMC
|
||||
* Copyright (C) 2023-2024 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.v1_18_2_block_ack_emulation;
|
||||
|
||||
import com.viaversion.viafabricplus.features.interaction.v1_18_2_block_ack_emulation.ClientPlayerInteractionManager1_18_2;
|
||||
import com.viaversion.viafabricplus.injection.access.IClientPlayerInteractionManager;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import net.minecraft.client.network.ClientPlayerInteractionManager;
|
||||
import net.minecraft.client.network.SequencedPacketCreator;
|
||||
import net.minecraft.client.world.ClientWorld;
|
||||
import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(ClientPlayerInteractionManager.class)
|
||||
public abstract class MixinClientPlayerInteractionManager implements IClientPlayerInteractionManager {
|
||||
|
||||
@Unique
|
||||
private final ClientPlayerInteractionManager1_18_2 viaFabricPlus$1_18_2InteractionManager = new ClientPlayerInteractionManager1_18_2();
|
||||
|
||||
@Inject(method = "sendSequencedPacket", at = @At("HEAD"))
|
||||
private void trackPlayerAction(ClientWorld world, SequencedPacketCreator packetCreator, CallbackInfo ci) {
|
||||
if (ProtocolTranslator.getTargetVersion().betweenInclusive(ProtocolVersion.v1_14_4, ProtocolVersion.v1_18_2) && packetCreator instanceof PlayerActionC2SPacket playerActionC2SPacket) {
|
||||
this.viaFabricPlus$1_18_2InteractionManager.trackPlayerAction(playerActionC2SPacket.getAction(), playerActionC2SPacket.getPos());
|
||||
}
|
||||
}
|
||||
|
||||
@Redirect(method = {"attackBlock", "cancelBlockBreaking"}, at = @At(value = "NEW", target = "(Lnet/minecraft/network/packet/c2s/play/PlayerActionC2SPacket$Action;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/Direction;)Lnet/minecraft/network/packet/c2s/play/PlayerActionC2SPacket;"))
|
||||
private PlayerActionC2SPacket trackPlayerAction(PlayerActionC2SPacket.Action action, BlockPos pos, Direction direction) {
|
||||
if (ProtocolTranslator.getTargetVersion().betweenInclusive(ProtocolVersion.v1_14_4, ProtocolVersion.v1_18_2)) {
|
||||
this.viaFabricPlus$1_18_2InteractionManager.trackPlayerAction(action, pos);
|
||||
}
|
||||
return new PlayerActionC2SPacket(action, pos, direction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientPlayerInteractionManager1_18_2 viaFabricPlus$get1_18_2InteractionManager() {
|
||||
return this.viaFabricPlus$1_18_2InteractionManager;
|
||||
}
|
||||
|
||||
}
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction.v1_18_2_block_ack_emulation;
|
||||
|
||||
import com.viaversion.viafabricplus.base.sync_tasks.SyncTasks;
|
||||
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.item.attributes;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.item.attack_damage_changes;
|
||||
|
||||
import com.viaversion.nbt.tag.CompoundTag;
|
||||
import com.viaversion.nbt.tag.ListTag;
|
@ -0,0 +1,91 @@
|
||||
/*
|
||||
* This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus
|
||||
* Copyright (C) 2021-2024 the original authors
|
||||
* - FlorianMichael/EnZaXD <florian.michael07@gmail.com>
|
||||
* - RK_01/RaphiMC
|
||||
* Copyright (C) 2023-2024 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.item.attack_damage_changes;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viafabricplus.features.item.tooltip_changes.Enchantments1_14_4;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
||||
import com.viaversion.viafabricplus.util.ItemUtil;
|
||||
import net.minecraft.component.ComponentType;
|
||||
import net.minecraft.component.DataComponentTypes;
|
||||
import net.minecraft.component.type.ItemEnchantmentsComponent;
|
||||
import net.minecraft.enchantment.Enchantment;
|
||||
import net.minecraft.enchantment.EnchantmentHelper;
|
||||
import net.minecraft.enchantment.Enchantments;
|
||||
import net.minecraft.entity.attribute.EntityAttribute;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.tooltip.TooltipAppender;
|
||||
import net.minecraft.item.tooltip.TooltipType;
|
||||
import net.minecraft.nbt.NbtCompound;
|
||||
import net.minecraft.nbt.NbtElement;
|
||||
import net.minecraft.nbt.NbtList;
|
||||
import net.minecraft.registry.RegistryKey;
|
||||
import net.minecraft.registry.RegistryKeys;
|
||||
import net.minecraft.registry.RegistryWrapper;
|
||||
import net.minecraft.registry.entry.RegistryEntry;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@Mixin(ItemStack.class)
|
||||
public abstract class MixinItemStack {
|
||||
|
||||
@Shadow
|
||||
public abstract Item getItem();
|
||||
|
||||
@Redirect(method = "appendAttributeModifierTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;getAttributeBaseValue(Lnet/minecraft/registry/entry/RegistryEntry;)D", ordinal = 0))
|
||||
private double fixAttackDamageCalculation(PlayerEntity instance, RegistryEntry<EntityAttribute> registryEntry) {
|
||||
double value = 0.0;
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_20_5)) {
|
||||
final ItemEnchantmentsComponent enchantments = EnchantmentHelper.getEnchantments((ItemStack) (Object) this);
|
||||
for (RegistryEntry<Enchantment> enchantment : enchantments.getEnchantments()) {
|
||||
if (enchantment.matchesKey(Enchantments.SHARPNESS)) {
|
||||
final int level = enchantments.getLevel(enchantment);
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_8)) {
|
||||
value = level * 1.25F;
|
||||
} else {
|
||||
value = 1.0F + (float) Math.max(0, level - 1) * 0.5F;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_8)) {
|
||||
return value;
|
||||
} else {
|
||||
return instance.getAttributeBaseValue(registryEntry) + value;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -19,12 +19,12 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.item.tooltip_changes;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.item.gracefully_handle_enchantment_tooltips;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viafabricplus.features.item.tooltip_changes.Enchantments1_14_4;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
||||
import com.viaversion.viafabricplus.util.ItemUtil;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import net.minecraft.component.ComponentType;
|
||||
import net.minecraft.component.DataComponentTypes;
|
||||
import net.minecraft.component.type.ItemEnchantmentsComponent;
|
||||
@ -82,31 +82,6 @@ public abstract class MixinItemStack {
|
||||
}
|
||||
}
|
||||
|
||||
@Redirect(method = "appendAttributeModifierTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;getAttributeBaseValue(Lnet/minecraft/registry/entry/RegistryEntry;)D", ordinal = 0))
|
||||
private double fixAttackDamageCalculation(PlayerEntity instance, RegistryEntry<EntityAttribute> registryEntry) {
|
||||
double value = 0.0;
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_20_5)) {
|
||||
final ItemEnchantmentsComponent enchantments = EnchantmentHelper.getEnchantments((ItemStack) (Object) this);
|
||||
for (RegistryEntry<Enchantment> enchantment : enchantments.getEnchantments()) {
|
||||
if (enchantment.matchesKey(Enchantments.SHARPNESS)) {
|
||||
final int level = enchantments.getLevel(enchantment);
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_8)) {
|
||||
value = level * 1.25F;
|
||||
} else {
|
||||
value = 1.0F + (float) Math.max(0, level - 1) * 0.5F;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ProtocolTranslator.getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_8)) {
|
||||
return value;
|
||||
} else {
|
||||
return instance.getAttributeBaseValue(registryEntry) + value;
|
||||
}
|
||||
}
|
||||
|
||||
@Unique
|
||||
private void viaFabricPlus$appendEnchantments1_14_4(final String name, final NbtCompound nbt, Item.TooltipContext context, final Consumer<Text> tooltip) {
|
||||
final RegistryWrapper.WrapperLookup registryLookup = context.getRegistryLookup();
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.item.mining_speeds;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.item.protocol_level_value_fixes;
|
||||
|
||||
import com.viaversion.viafabricplus.api.events.LoadingCycleCallback;
|
||||
import com.viaversion.viafabricplus.base.Events;
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.interaction;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.item.sword_blocking;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.rewriter.BlockItemPacketRewriter1_21_4;
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.item.interactions;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.item.sword_blocking;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
@ -19,7 +19,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.item;
|
||||
package com.viaversion.viafabricplus.injection.mixin.features.movement.item;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viafabricplus.protocoltranslator.ProtocolTranslator;
|
@ -107,7 +107,6 @@
|
||||
"features.entity.metadata_handling.MixinEntityTracker1_9",
|
||||
"features.entity.pose.MixinOtherClientPlayerEntity",
|
||||
"features.entity.riding_offsets.MixinCamelEntity",
|
||||
"features.movement.entity.MixinAbstractBoatEntity",
|
||||
"features.entity.v1_8_boat.MixinEntityModels",
|
||||
"features.entity.v1_8_boat.MixinEntityRenderDispatcher",
|
||||
"features.execute_inputs_sync.MixinKeyboard",
|
||||
@ -117,21 +116,23 @@
|
||||
"features.footstep_particle.MixinParticleIdMappings1_13",
|
||||
"features.footstep_particle.MixinParticleMappings",
|
||||
"features.footstep_particle.MixinRegistrySyncManager",
|
||||
"features.interaction.MixinBlockItemPacketRewriter1_21_4",
|
||||
"features.interaction.MixinClientPlayerInteractionManager",
|
||||
"features.interaction.MixinEntityPacketRewriter1_20_5",
|
||||
"features.interaction.MixinItemPacketRewriter1_17",
|
||||
"features.interaction.MixinItemPlacementContext",
|
||||
"features.interaction.MixinMinecraftClient",
|
||||
"features.interaction.MixinScreenHandler",
|
||||
"features.interaction.MixinWorldPacketRewriter1_19",
|
||||
"features.interaction.inventory_clicking.MixinAbstractFurnaceScreenHandler",
|
||||
"features.interaction.inventory_clicking.MixinBrewingStandScreenHandler_FuelSlot",
|
||||
"features.interaction.inventory_clicking.MixinCraftingScreenHandler",
|
||||
"features.interaction.inventory_clicking.MixinPlayerScreenHandler",
|
||||
"features.interaction.container_clicking.MixinAbstractFurnaceScreenHandler",
|
||||
"features.interaction.container_clicking.MixinClientPlayerInteractionManager",
|
||||
"features.interaction.container_clicking.MixinCraftingScreenHandler",
|
||||
"features.interaction.container_clicking.MixinItemPacketRewriter1_17",
|
||||
"features.interaction.container_clicking.MixinScreenHandler",
|
||||
"features.interaction.replace_block_item_use_logic.item_and_block_use_at_same_time.MixinMinecraftClient",
|
||||
"features.interaction.merchant_emulation.MixinMerchantScreenHandler",
|
||||
"features.item.MixinItemEntity",
|
||||
"features.item.attributes.MixinItemPacketRewriter1_9",
|
||||
"features.interaction.remove_fuel_slot.MixinBrewingStandScreenHandler_FuelSlot",
|
||||
"features.interaction.remove_offhand_slot.MixinPlayerScreenHandler",
|
||||
"features.interaction.replace_block_item_use_logic.MixinClientPlayerInteractionManager",
|
||||
"features.interaction.replace_block_item_use_logic.MixinItemPlacementContext",
|
||||
"features.interaction.v1_18_2_block_ack_emulation.MixinClientPlayerInteractionManager",
|
||||
"features.interaction.v1_18_2_block_ack_emulation.MixinWorldPacketRewriter1_19",
|
||||
"features.movement.item.MixinItemEntity",
|
||||
"features.item.attack_damage_changes.MixinItemPacketRewriter1_9",
|
||||
"features.item.attack_damage_changes.MixinItemStack",
|
||||
"features.item.cooldown.MixinItemCooldownManager",
|
||||
"features.item.filter_creative_tabs.MixinItemGroup_EntriesImpl",
|
||||
"features.item.filter_creative_tabs.MixinItemGroups",
|
||||
@ -148,10 +149,10 @@
|
||||
"features.item.interactions.MixinKnowledgeBookItem",
|
||||
"features.item.interactions.MixinLeadItem",
|
||||
"features.item.interactions.MixinShovelItem",
|
||||
"features.item.interactions.MixinSwordItem",
|
||||
"features.item.mining_speeds.MixinBlockItemPacketRewriter1_20_5",
|
||||
"features.item.negative_items.MixinDrawContext",
|
||||
"features.item.tooltip_changes.MixinItemStack",
|
||||
"features.item.protocol_level_value_fixes.MixinBlockItemPacketRewriter1_20_5",
|
||||
"features.item.sword_blocking.MixinBlockItemPacketRewriter1_21_4",
|
||||
"features.item.sword_blocking.MixinSwordItem",
|
||||
"features.legacy_skin_loading.MixinPlayerListEntry",
|
||||
"features.legacy_tab_completions.MixinAbstractCommandBlockScreen",
|
||||
"features.legacy_tab_completions.MixinChatInputSuggestor",
|
||||
@ -167,6 +168,7 @@
|
||||
"features.movement.block.MixinHoneyBlock",
|
||||
"features.movement.block.MixinSoulSandBlock",
|
||||
"features.movement.elytra.MixinFireworkRocketItem",
|
||||
"features.movement.entity.MixinAbstractBoatEntity",
|
||||
"features.movement.entity.MixinClientPlayerEntity",
|
||||
"features.movement.entity.MixinEntity",
|
||||
"features.movement.entity.MixinLivingEntity",
|
||||
@ -223,16 +225,15 @@
|
||||
"features.world.item_picking.MixinMinecraftClient",
|
||||
"features.world.remove_server_view_distance.MixinGameOptions",
|
||||
"integration.viabedrock.MixinJoinPackets",
|
||||
"integration.vialegacy.MixinViaLegacyConfig"
|
||||
"integration.vialegacy.MixinViaLegacyConfig",
|
||||
"features.entity.interactions.MixinAbstractBoatEntity",
|
||||
"features.entity.riding_offsets.MixinAbstractBoatEntity",
|
||||
"features.item.gracefully_handle_enchantment_tooltips.MixinItemStack"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
},
|
||||
"overwrites": {
|
||||
"requireAnnotations": true
|
||||
},
|
||||
"mixins": [
|
||||
"features.entity.interactions.MixinAbstractBoatEntity",
|
||||
"features.entity.riding_offsets.MixinAbstractBoatEntity"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user