make mixin working on block break

This commit is contained in:
Jörg Henke 2020-07-29 20:05:43 +02:00
parent 021ae584f0
commit f52175c1c4
14 changed files with 78 additions and 67 deletions

View File

@ -14,4 +14,4 @@ org.gradle.jvmargs=-Xmx1G
# Dependencies
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
fabric_version=0.13.1+build.370-1.16
fabric_version=0.16.2+build.385-1.16.1

View File

@ -4,7 +4,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.Random;
import de.jottyfan.minecraft.quickiefabric.items.Items;
import de.jottyfan.minecraft.quickiefabric.items.QuickieItems;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.block.BlockState;
import net.minecraft.block.Material;
@ -25,7 +25,7 @@ public class BlockOreNetherSulphor extends OreBlock {
@Override
public List<ItemStack> getDroppedStacks(BlockState state, Builder builder) {
return Arrays.asList(new ItemStack[] { new ItemStack(Items.SULPHOR) });
return Arrays.asList(new ItemStack[] { new ItemStack(QuickieItems.SULPHOR) });
}
@Override

View File

@ -4,7 +4,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.Random;
import de.jottyfan.minecraft.quickiefabric.items.Items;
import de.jottyfan.minecraft.quickiefabric.items.QuickieItems;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.block.BlockState;
import net.minecraft.block.Material;
@ -25,7 +25,7 @@ public class BlockOreSalpeter extends OreBlock {
@Override
public List<ItemStack> getDroppedStacks(BlockState state, Builder builder) {
return Arrays.asList(new ItemStack[] { new ItemStack(Items.SALPETER) });
return Arrays.asList(new ItemStack[] { new ItemStack(QuickieItems.SALPETER) });
}
@Override

View File

@ -4,7 +4,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.Random;
import de.jottyfan.minecraft.quickiefabric.items.Items;
import de.jottyfan.minecraft.quickiefabric.items.QuickieItems;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
@ -26,7 +26,7 @@ public class BlockOreSandSalpeter extends OreBlock {
@Override
public List<ItemStack> getDroppedStacks(BlockState state, Builder builder) {
return Arrays.asList(new ItemStack[] { new ItemStack(Items.SALPETER), new ItemStack(Blocks.SAND) });
return Arrays.asList(new ItemStack[] { new ItemStack(QuickieItems.SALPETER), new ItemStack(Blocks.SAND) });
}
@Override

View File

@ -4,7 +4,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.Random;
import de.jottyfan.minecraft.quickiefabric.items.Items;
import de.jottyfan.minecraft.quickiefabric.items.QuickieItems;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.block.BlockState;
import net.minecraft.block.Material;
@ -25,7 +25,7 @@ public class BlockOreSulphor extends OreBlock {
@Override
public List<ItemStack> getDroppedStacks(BlockState state, Builder builder) {
return Arrays.asList(new ItemStack[] { new ItemStack(Items.SULPHOR) });
return Arrays.asList(new ItemStack[] { new ItemStack(QuickieItems.SULPHOR) });
}
@Override

View File

@ -3,7 +3,7 @@ package de.jottyfan.minecraft.quickiefabric.blocks;
import java.util.Arrays;
import java.util.List;
import de.jottyfan.minecraft.quickiefabric.items.Items;
import de.jottyfan.minecraft.quickiefabric.items.QuickieItems;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
@ -25,6 +25,6 @@ public class BlockSandSalpeter extends GravelBlock {
@Override
public List<ItemStack> getDroppedStacks(BlockState state, Builder builder) {
return Arrays.asList(new ItemStack[] { new ItemStack(Items.SALPETER), new ItemStack(Blocks.SAND) });
return Arrays.asList(new ItemStack[] { new ItemStack(QuickieItems.SALPETER), new ItemStack(Blocks.SAND) });
}
}

View File

@ -1,32 +0,0 @@
package de.jottyfan.minecraft.quickiefabric.event;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.ActionResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
/**
*
* @author jotty
*
*/
@Mixin(Block.class)
public class BlockBreakMixin {
// @Inject(method = "injectBlockBreakCallback", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/Block;onBreak(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/entity/player/PlayerEntity;)V"), cancellable = true)
@Inject(method = "injectBlockBreakCallback", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/Block;onBroken(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)V"), cancellable = true)
private void interactOnBreak(final World world, final BlockPos blockPos, final BlockState blockState, final CallbackInfo info) {
ActionResult result = BreakBlockCallback.EVENT.invoker().injectBlockBreakCallback(world, blockPos, blockState);
if (result == ActionResult.FAIL) {
info.cancel();
}
}
}

View File

@ -15,9 +15,9 @@ import net.minecraft.world.World;
*/
public interface BreakBlockCallback {
Event<BreakBlockCallback> EVENT = EventFactory.createArrayBacked(BreakBlockCallback.class,
(listeners) -> (world, blockPos, blockState) -> {
(listeners) -> (world, blockPos, blockState, playerEntity) -> {
for (BreakBlockCallback listener : listeners) {
ActionResult result = listener.injectBlockBreakCallback(world, blockPos, blockState);
ActionResult result = listener.injectBlockBreakCallback(world, blockPos, blockState, playerEntity);
if (result != ActionResult.PASS) {
return result;
}
@ -25,5 +25,5 @@ public interface BreakBlockCallback {
return ActionResult.PASS;
});
ActionResult injectBlockBreakCallback(World world, BlockPos blockPos, BlockState blockState);
ActionResult injectBlockBreakCallback(World world, BlockPos blockPos, BlockState blockState, PlayerEntity playerEntity);
}

View File

@ -7,11 +7,12 @@ import org.apache.logging.log4j.Logger;
import de.jottyfan.minecraft.quickiefabric.blocks.QuickieBlocks;
import de.jottyfan.minecraft.quickiefabric.event.BreakBlockCallback;
import de.jottyfan.minecraft.quickiefabric.items.Items;
import de.jottyfan.minecraft.quickiefabric.tools.Tools;
import de.jottyfan.minecraft.quickiefabric.items.QuickieItems;
import de.jottyfan.minecraft.quickiefabric.tools.QuickieTools;
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
@ -37,13 +38,13 @@ public class RegistryManager {
private static final String QUICKIEFABRIC = "quickiefabric";
public static final ItemGroup QUICKIEFABRIC_GROUP = FabricItemGroupBuilder.create(new Identifier(QUICKIEFABRIC, "all")).icon(() -> new ItemStack(Items.SPEEDPOWDER)).appendItems(stacks -> {
stacks.add(new ItemStack(Items.SALPETER));
stacks.add(new ItemStack(Items.SULPHOR));
stacks.add(new ItemStack(Items.SPEEDPOWDER));
stacks.add(new ItemStack(Items.LEVELUP));
stacks.add(new ItemStack(Items.PENCIL));
stacks.add(new ItemStack(Tools.SPEEDPOWDERAXE));
public static final ItemGroup QUICKIEFABRIC_GROUP = FabricItemGroupBuilder.create(new Identifier(QUICKIEFABRIC, "all")).icon(() -> new ItemStack(QuickieItems.SPEEDPOWDER)).appendItems(stacks -> {
stacks.add(new ItemStack(QuickieItems.SALPETER));
stacks.add(new ItemStack(QuickieItems.SULPHOR));
stacks.add(new ItemStack(QuickieItems.SPEEDPOWDER));
stacks.add(new ItemStack(QuickieItems.LEVELUP));
stacks.add(new ItemStack(QuickieItems.PENCIL));
stacks.add(new ItemStack(QuickieTools.SPEEDPOWDERAXE));
stacks.add(new ItemStack(QuickieBlocks.ORE_NETHER_SULPHOR));
stacks.add(new ItemStack(QuickieBlocks.ORE_SALPETER));
stacks.add(new ItemStack(QuickieBlocks.ORE_SAND_SALPETER));
@ -71,25 +72,36 @@ public class RegistryManager {
public static final void registerItems() {
LOGGER.debug("registering quickiefabric items");
registerItem(Items.SPEEDPOWDER, "speedpowder");
registerItem(Items.LEVELUP, "levelup");
registerItem(Items.PENCIL, "pencil");
registerItem(Items.SALPETER, "salpeter");
registerItem(Items.SULPHOR, "sulphor");
registerItem(QuickieItems.SPEEDPOWDER, "speedpowder");
registerItem(QuickieItems.LEVELUP, "levelup");
registerItem(QuickieItems.PENCIL, "pencil");
registerItem(QuickieItems.SALPETER, "salpeter");
registerItem(QuickieItems.SULPHOR, "sulphor");
}
public static final void registerTools() {
LOGGER.debug("registering quickiefabric tools");
registerItem(Tools.SPEEDPOWDERAXE, "speedpowderaxe");
registerItem(QuickieTools.SPEEDPOWDERAXE, "speedpowderaxe");
}
public static final void registerEvents() {
LOGGER.debug("registering quickiefabric events");
BreakBlockCallback.EVENT.register((world, blockPos, blockState) -> {
BreakBlockCallback.EVENT.register((world, blockPos, blockState, playerEntity) -> {
// TODO: add code to break the corresponding surroundings also if hand hold the right tool
// return ActionResult.PASS; // if the breaking replaces another event, but this does not appear for the speedpowder tools
LOGGER.info("broke block %s at %s", blockState.getBlock().getName(), blockPos.toString());
LOGGER.info("{} broke block {} at {}", playerEntity.getName().asString(), blockState.getBlock().getTranslationKey(), blockPos.toString());
BlockState blockStateDown = world.getBlockState(blockPos);
if (!blockStateDown.isAir()) { // TODO: because we will only break the same blocks, that check becomes obsolete later
ItemStack itemStack = new ItemStack(blockStateDown.getBlock().asItem());
// spawn entity in world
Block.dropStack(world, blockPos.down(), itemStack);
world.setBlockState(blockPos.down(), Blocks.AIR.getDefaultState());
LOGGER.info("also broke block {} at {}", playerEntity.getName().asString(), blockState.getBlock().getTranslationKey(), blockPos.down().toString());
}
return ActionResult.SUCCESS;
});
}

View File

@ -5,7 +5,7 @@ package de.jottyfan.minecraft.quickiefabric.items;
* @author jotty
*
*/
public class Items {
public class QuickieItems {
public static final ItemSpeedpowder SPEEDPOWDER = new ItemSpeedpowder();
public static final ItemLevelup LEVELUP = new ItemLevelup();
public static final ItemPencil PENCIL = new ItemPencil();

View File

@ -0,0 +1,31 @@
package de.jottyfan.minecraft.quickiefabric.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import de.jottyfan.minecraft.quickiefabric.event.BreakBlockCallback;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.ActionResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
/**
*
* @author jotty
*
*/
@Mixin(Block.class)
public class BlockBreakMixin {
@Inject(at = @At("HEAD"), method = "onBreak(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/entity/player/PlayerEntity;)V")
private void onBreak(final World world, final BlockPos blockPos, final BlockState blockState, final PlayerEntity playerEntity, final CallbackInfo info) {
ActionResult result = BreakBlockCallback.EVENT.invoker().injectBlockBreakCallback(world, blockPos, blockState, playerEntity);
if (result == ActionResult.FAIL) {
info.cancel();
}
}
}

View File

@ -5,6 +5,6 @@ package de.jottyfan.minecraft.quickiefabric.tools;
* @author jotty
*
*/
public class Tools {
public class QuickieTools {
public static final ToolSpeedpowderAxe SPEEDPOWDERAXE = new ToolSpeedpowderAxe();
}

View File

@ -23,7 +23,7 @@
]
},
"mixins": [
// "quickiefabric.mixins.json"
"modid.mixins.json"
],
"depends": {
"fabricloader": ">=0.7.4",

View File

@ -1,7 +1,7 @@
{
"required": true,
"minVersion": "0.8",
"package": "de.jottyfan.minecraft.quickiefabric.event",
"package": "de.jottyfan.minecraft.quickiefabric.mixin",
"compatibilityLevel": "JAVA_8",
"mixins": [
"BlockBreakMixin"