separate block and item-on-block interaction again cause it causing issues but still use the callback
This commit is contained in:
parent
3047269bfc
commit
f67fc9fd28
@ -24,7 +24,6 @@ import net.minecraft.world.entity.item.ItemEntity;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.entity.projectile.Projectile;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.context.UseOnContext;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.DoorBlock;
|
||||
import net.minecraft.world.level.block.LecternBlock;
|
||||
@ -115,13 +114,11 @@ public class BlockInteractEvents {
|
||||
return InteractionResult.FAIL;
|
||||
}
|
||||
}
|
||||
InteractionResult res = ItemInteractEvents.onItemUseBlock(new UseOnContext(player, hand, hitResult));
|
||||
if (claim.canInteract(player, PermissionRegistry.INTERACTBLOCK, hitResult.getBlockPos(), false) || res == InteractionResult.FAIL) {
|
||||
if (res == InteractionResult.FAIL)
|
||||
boolean shift = player.isSecondaryUseActive() || stack.isEmpty();
|
||||
boolean res = claim.canInteract(player, PermissionRegistry.INTERACTBLOCK, hitResult.getBlockPos(), shift);
|
||||
if (!res && shift)
|
||||
PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.blockPosition().getY());
|
||||
return res;
|
||||
}
|
||||
return InteractionResult.PASS;
|
||||
return res ? InteractionResult.PASS : InteractionResult.FAIL;
|
||||
}
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
|
@ -26,6 +26,13 @@ import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.context.UseOnContext;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
|
||||
public class FlanFabric implements ModInitializer {
|
||||
|
||||
@ -36,7 +43,7 @@ public class FlanFabric implements ModInitializer {
|
||||
PlayerBlockBreakEvents.BEFORE.register(BlockInteractEvents::breakBlocks);
|
||||
AttackBlockCallback.EVENT.register(BlockInteractEvents::startBreakBlocks);
|
||||
UseBlockCallback.EVENT.addPhaseOrdering(EventPhase, Event.DEFAULT_PHASE);
|
||||
UseBlockCallback.EVENT.register(EventPhase, BlockInteractEvents::useBlocks);
|
||||
UseBlockCallback.EVENT.register(EventPhase, FlanFabric::useBlocks);
|
||||
UseEntityCallback.EVENT.register(EntityInteractEvents::useAtEntity);
|
||||
AttackEntityCallback.EVENT.register(EntityInteractEvents::attackEntity);
|
||||
UseItemCallback.EVENT.register(ItemInteractEvents::useItem);
|
||||
@ -63,4 +70,13 @@ public class FlanFabric implements ModInitializer {
|
||||
public static void serverFinishLoad(MinecraftServer server) {
|
||||
PlayerDataHandler.deleteInactivePlayerData(server);
|
||||
}
|
||||
|
||||
public static InteractionResult useBlocks(Player p, Level world, InteractionHand hand, BlockHitResult hitResult) {
|
||||
if (p instanceof ServerPlayer serverPlayer) {
|
||||
ItemUseBlockFlags flags = ItemUseBlockFlags.fromPlayer(serverPlayer);
|
||||
flags.stopCanUseBlocks(BlockInteractEvents.useBlocks(p, world, hand, hitResult) == InteractionResult.FAIL);
|
||||
flags.stopCanUseItems(ItemInteractEvents.onItemUseBlock(new UseOnContext(p, hand, hitResult)) == InteractionResult.FAIL);
|
||||
}
|
||||
return InteractionResult.PASS;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,14 @@
|
||||
package io.github.flemmli97.flan.fabric;
|
||||
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
|
||||
public interface ItemUseBlockFlags {
|
||||
|
||||
void stopCanUseBlocks(boolean flag);
|
||||
|
||||
void stopCanUseItems(boolean flag);
|
||||
|
||||
static ItemUseBlockFlags fromPlayer(ServerPlayer player) {
|
||||
return (ItemUseBlockFlags) player.gameMode;
|
||||
}
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
package io.github.flemmli97.flan.fabric.mixin;
|
||||
|
||||
import io.github.flemmli97.flan.fabric.ItemUseBlockFlags;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.server.level.ServerPlayerGameMode;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
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.ModifyVariable;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(ServerPlayerGameMode.class)
|
||||
public abstract class ServerPlayerGameModeMixin implements ItemUseBlockFlags {
|
||||
|
||||
@Unique
|
||||
private boolean stopInteractBlock;
|
||||
@Unique
|
||||
private boolean stopInteractItemBlock;
|
||||
|
||||
@ModifyVariable(method = "useItemOn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;copy()Lnet/minecraft/world/item/ItemStack;"), ordinal = 1)
|
||||
private boolean stopBlockUse(boolean orig) {
|
||||
if (this.stopInteractBlock)
|
||||
return true;
|
||||
return orig;
|
||||
}
|
||||
|
||||
@Inject(method = "useItemOn", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayerGameMode;isCreative()Z"), cancellable = true)
|
||||
private void stopItemOnBlock(ServerPlayer serverPlayer, Level level, ItemStack itemStack, InteractionHand interactionHand, BlockHitResult blockHitResult, CallbackInfoReturnable<InteractionResult> info) {
|
||||
if (this.stopInteractItemBlock) {
|
||||
info.setReturnValue(InteractionResult.PASS);
|
||||
info.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopCanUseBlocks(boolean flag) {
|
||||
this.stopInteractBlock = flag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopCanUseItems(boolean flag) {
|
||||
this.stopInteractItemBlock = flag;
|
||||
}
|
||||
}
|
@ -17,7 +17,8 @@
|
||||
"FabricFireMixin",
|
||||
"LightningHitMixin",
|
||||
"WorldSaveHandlerMixin",
|
||||
"PlayerManagerMixin"
|
||||
"PlayerManagerMixin",
|
||||
"ServerPlayerGameModeMixin"
|
||||
],
|
||||
"server": [
|
||||
],
|
||||
|
@ -1,11 +1,14 @@
|
||||
package io.github.flemmli97.flan.forgeevent;
|
||||
|
||||
import io.github.flemmli97.flan.event.BlockInteractEvents;
|
||||
import io.github.flemmli97.flan.event.ItemInteractEvents;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.item.context.UseOnContext;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
||||
import net.minecraftforge.event.world.BlockEvent;
|
||||
import net.minecraftforge.eventbus.api.Event;
|
||||
|
||||
public class BlockInteractEventsForge {
|
||||
|
||||
@ -25,9 +28,10 @@ public class BlockInteractEventsForge {
|
||||
|
||||
public static void useBlocks(PlayerInteractEvent.RightClickBlock event) {
|
||||
InteractionResult res = BlockInteractEvents.useBlocks(event.getPlayer(), event.getWorld(), event.getHand(), event.getHitVec());
|
||||
if (res != InteractionResult.PASS) {
|
||||
event.setCancellationResult(res);
|
||||
event.setCanceled(true);
|
||||
}
|
||||
if(res == InteractionResult.FAIL)
|
||||
event.setUseBlock(Event.Result.DENY);
|
||||
res = ItemInteractEvents.onItemUseBlock(new UseOnContext(event.getPlayer(), event.getHand(), event.getHitVec()));
|
||||
if(res == InteractionResult.FAIL)
|
||||
event.setUseItem(Event.Result.DENY);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user