More work

This commit is contained in:
FlorianMichael 2024-12-26 13:57:32 +01:00
parent 396f2c80df
commit 05a62d8600
No known key found for this signature in database
GPG Key ID: C2FB87E71C425126
23 changed files with 351 additions and 194 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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 {

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
}
}

View File

@ -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();

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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"
]
}
}