diff --git a/.classpath b/.classpath
index be88c88..22fc6b2 100644
--- a/.classpath
+++ b/.classpath
@@ -1,5 +1,6 @@
+
@@ -12,7 +13,615 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.project b/.project
index 6b24044..a1b1dc8 100644
--- a/.project
+++ b/.project
@@ -2,22 +2,21 @@
quickiemod
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.buildship.core.gradleprojectbuilder
-
-
-
-
+
org.eclipse.jdt.core.javanature
org.eclipse.buildship.core.gradleprojectnature
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+ org.eclipse.buildship.core.gradleprojectbuilder
+
+
+
+
+
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 06d2104..f3eb3df 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,5 @@
#
-#Sat Jun 01 10:37:20 CEST 2024
+#Sat Jun 15 13:57:14 CEST 2024
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
diff --git a/gradle.properties b/gradle.properties
index 427b7ae..45528df 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -9,7 +9,7 @@ yarn_mappings=1.21+build.2
loader_version=0.15.11
# Mod Properties
-mod_version=1.21.0.0
+mod_version=1.21.0.1
maven_group=de.jottyfan.quickiemod
archives_base_name=quickiemod
diff --git a/src/main/java/de/jottyfan/quickiemod/QuickieMod.java b/src/main/java/de/jottyfan/quickiemod/QuickieMod.java
index a9f6fc5..4761c84 100644
--- a/src/main/java/de/jottyfan/quickiemod/QuickieMod.java
+++ b/src/main/java/de/jottyfan/quickiemod/QuickieMod.java
@@ -21,6 +21,7 @@ public class QuickieMod implements ModInitializer {
LOGGER.info("loading {}", MODID);
RegistryManager.registerBlockEntityTypes();
RegistryManager.registerItems();
+ RegistryManager.registerEvents();
RegistryManager.registerBlocks();
RegistryManager.registerFeatures();
RegistryManager.registerItemGroup();
diff --git a/src/main/java/de/jottyfan/quickiemod/api/Neighborhood.java b/src/main/java/de/jottyfan/quickiemod/api/Neighborhood.java
new file mode 100644
index 0000000..eea245a
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/api/Neighborhood.java
@@ -0,0 +1,84 @@
+package de.jottyfan.quickiemod.api;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class Neighborhood {
+
+ /**
+ * find the same blocks that is next to the current position pos
+ *
+ * @param world the world to look for the blocks
+ * @param pos the starting position
+ * @param seekLimit the limit of seek operations
+ * @param checkLambda check functionality
+ * @return a set of found block positions
+ */
+ public static final Set findEqualBlock(World world, BlockPos pos, int seekLimit,
+ BiFunction checkLambda) {
+ Set found = new HashSet<>();
+ found.add(new NeighborhoodBean(pos, true));
+
+ while (pos != null && found.size() < seekLimit) {
+ findNewNeihgbor(world, pos.east(), found, checkLambda);
+ findNewNeihgbor(world, pos.south(), found, checkLambda);
+ findNewNeihgbor(world, pos.west(), found, checkLambda);
+ findNewNeihgbor(world, pos.north(), found, checkLambda);
+ pos = findNextUncheckedField(found);
+ }
+
+ Set finals = new HashSet<>();
+ for (NeighborhoodBean bean : found) {
+ finals.add(bean.getPos());
+ }
+ return finals;
+ }
+
+ private static final BlockPos findNextUncheckedField(Set found) {
+ Iterator i = found.iterator();
+ while (i.hasNext()) {
+ NeighborhoodBean bean = i.next();
+ if (!bean.isChecked()) {
+ bean.setChecked(true);
+ return bean.getPos();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * find new neighbor at pos
+ *
+ * @param world the world
+ * @param pos the position
+ * @param found the set with all already found positions
+ * @return true or false
+ */
+ private static final boolean findNewNeihgbor(World world, BlockPos pos, Set found,
+ BiFunction checkLambda) {
+ NeighborhoodBean bean = new NeighborhoodBean(pos);
+ if (found.contains(bean) || found.contains(bean.over()) || found.contains(bean.below())) {
+ return false;
+ } else if (checkLambda.apply(world, pos).booleanValue()) {
+ found.add(bean);
+ return true;
+ } else if (checkLambda.apply(world, pos.up()).booleanValue()) {
+ found.add(new NeighborhoodBean(pos.up()));
+ return true;
+ } else if (checkLambda.apply(world, pos.down()).booleanValue()) {
+ found.add(new NeighborhoodBean(pos.down()));
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/api/NeighborhoodBean.java b/src/main/java/de/jottyfan/quickiemod/api/NeighborhoodBean.java
new file mode 100644
index 0000000..0acf23a
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/api/NeighborhoodBean.java
@@ -0,0 +1,77 @@
+package de.jottyfan.quickiemod.api;
+
+import java.util.Objects;
+
+import net.minecraft.util.math.BlockPos;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class NeighborhoodBean {
+ private final BlockPos pos;
+ private boolean checked;
+
+ public NeighborhoodBean(BlockPos pos, boolean checked) {
+ super();
+ this.pos = pos;
+ this.checked = checked;
+ }
+
+ public NeighborhoodBean(BlockPos pos) {
+ super();
+ this.pos = pos;
+ this.checked = false;
+ }
+
+ public NeighborhoodBean over() {
+ return new NeighborhoodBean(pos.up(), checked);
+ }
+
+ public NeighborhoodBean below() {
+ return new NeighborhoodBean(pos.down(), checked);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(pos);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ Boolean result = null;
+ if (this == obj) {
+ result = true;
+ } else if (obj == null) {
+ result = false;
+ } else if (getClass() != obj.getClass()) {
+ result = false;
+ } else {
+ NeighborhoodBean other = (NeighborhoodBean) obj;
+ result = Objects.equals(pos, other.pos);
+ }
+ return result;
+ }
+
+ /**
+ * @return the checked
+ */
+ public boolean isChecked() {
+ return checked;
+ }
+
+ /**
+ * @param checked the checked to set
+ */
+ public void setChecked(boolean checked) {
+ this.checked = checked;
+ }
+
+ /**
+ * @return the pos
+ */
+ public BlockPos getPos() {
+ return pos;
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreDeepslateSulphor.java b/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreDeepslateSulphor.java
index fad79b6..77bf6cd 100644
--- a/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreDeepslateSulphor.java
+++ b/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreDeepslateSulphor.java
@@ -5,11 +5,11 @@ import java.util.List;
import de.jottyfan.quickiemod.blocks.help.IntProviderHelper;
import de.jottyfan.quickiemod.items.QuickieItems;
-import net.minecraft.block.AbstractBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.ExperienceDroppingBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.loot.context.LootContextParameterSet.Builder;
+import net.minecraft.sound.BlockSoundGroup;
/**
@@ -20,7 +20,7 @@ import net.minecraft.loot.context.LootContextParameterSet.Builder;
public class BlockOreDeepslateSulphor extends ExperienceDroppingBlock {
public BlockOreDeepslateSulphor() {
- super(IntProviderHelper.of(0, 2), AbstractBlock.Settings.create().hardness(1.9f).requiresTool());
+ super(IntProviderHelper.of(0, 2), Settings.create().strength(2.5f).hardness(1.9f).sounds(BlockSoundGroup.SOUL_SAND).requiresTool());
}
@Override
diff --git a/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreNetherSulphor.java b/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreNetherSulphor.java
index 8350eae..8a5da41 100644
--- a/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreNetherSulphor.java
+++ b/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreNetherSulphor.java
@@ -5,11 +5,11 @@ import java.util.List;
import de.jottyfan.quickiemod.blocks.help.IntProviderHelper;
import de.jottyfan.quickiemod.items.QuickieItems;
-import net.minecraft.block.AbstractBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.ExperienceDroppingBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.loot.context.LootContextParameterSet.Builder;
+import net.minecraft.sound.BlockSoundGroup;
/**
*
@@ -19,7 +19,7 @@ import net.minecraft.loot.context.LootContextParameterSet.Builder;
public class BlockOreNetherSulphor extends ExperienceDroppingBlock {
public BlockOreNetherSulphor() {
- super(IntProviderHelper.of(0, 2), AbstractBlock.Settings.create().hardness(2.1f).requiresTool());
+ super(IntProviderHelper.of(0, 2), Settings.create().strength(2.5f).hardness(2.1f).sounds(BlockSoundGroup.SOUL_SAND).requiresTool());
}
@Override
diff --git a/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSalpeter.java b/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSalpeter.java
index 3c5d085..ff5f183 100644
--- a/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSalpeter.java
+++ b/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSalpeter.java
@@ -5,11 +5,11 @@ import java.util.List;
import de.jottyfan.quickiemod.blocks.help.IntProviderHelper;
import de.jottyfan.quickiemod.items.QuickieItems;
-import net.minecraft.block.AbstractBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.ExperienceDroppingBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.loot.context.LootContextParameterSet.Builder;
+import net.minecraft.sound.BlockSoundGroup;
import net.minecraft.util.math.random.Random;
/**
@@ -20,7 +20,7 @@ import net.minecraft.util.math.random.Random;
public class BlockOreSalpeter extends ExperienceDroppingBlock {
public BlockOreSalpeter() {
- super(IntProviderHelper.of(0, 2), AbstractBlock.Settings.create().hardness(3.1f).requiresTool());
+ super(IntProviderHelper.of(0, 2), Settings.create().strength(2.5f).hardness(3.1f).sounds(BlockSoundGroup.SOUL_SAND).requiresTool());
}
@Override
diff --git a/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSandSalpeter.java b/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSandSalpeter.java
index 6f40080..fe9432b 100644
--- a/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSandSalpeter.java
+++ b/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSandSalpeter.java
@@ -5,12 +5,12 @@ import java.util.List;
import de.jottyfan.quickiemod.blocks.help.IntProviderHelper;
import de.jottyfan.quickiemod.items.QuickieItems;
-import net.minecraft.block.AbstractBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.ExperienceDroppingBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.loot.context.LootContextParameterSet.Builder;
+import net.minecraft.sound.BlockSoundGroup;
import net.minecraft.util.math.random.Random;
/**
@@ -21,7 +21,7 @@ import net.minecraft.util.math.random.Random;
public class BlockOreSandSalpeter extends ExperienceDroppingBlock {
public BlockOreSandSalpeter() {
- super(IntProviderHelper.of(0, 2), AbstractBlock.Settings.create().hardness(2.9f).requiresTool());
+ super(IntProviderHelper.of(0, 2), Settings.create().strength(2.5f).hardness(2.9f).sounds(BlockSoundGroup.SOUL_SAND).requiresTool());
}
@Override
diff --git a/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSulphor.java b/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSulphor.java
index e1d22f4..b6c8930 100644
--- a/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSulphor.java
+++ b/src/main/java/de/jottyfan/quickiemod/blocks/BlockOreSulphor.java
@@ -5,11 +5,11 @@ import java.util.List;
import de.jottyfan.quickiemod.blocks.help.IntProviderHelper;
import de.jottyfan.quickiemod.items.QuickieItems;
-import net.minecraft.block.AbstractBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.ExperienceDroppingBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.loot.context.LootContextParameterSet.Builder;
+import net.minecraft.sound.BlockSoundGroup;
/**
@@ -20,7 +20,7 @@ import net.minecraft.loot.context.LootContextParameterSet.Builder;
public class BlockOreSulphor extends ExperienceDroppingBlock {
public BlockOreSulphor() {
- super(IntProviderHelper.of(0, 2), AbstractBlock.Settings.create().hardness(1.9f).requiresTool());
+ super(IntProviderHelper.of(0, 2), Settings.create().strength(2.5f).hardness(1.9f).sounds(BlockSoundGroup.SOUL_SAND).requiresTool());
}
@Override
diff --git a/src/main/java/de/jottyfan/quickiemod/blocks/BlockSalpeter.java b/src/main/java/de/jottyfan/quickiemod/blocks/BlockSalpeter.java
index 9a4426a..daf245d 100644
--- a/src/main/java/de/jottyfan/quickiemod/blocks/BlockSalpeter.java
+++ b/src/main/java/de/jottyfan/quickiemod/blocks/BlockSalpeter.java
@@ -5,11 +5,11 @@ import java.util.List;
import de.jottyfan.quickiemod.blocks.help.IntProviderHelper;
import de.jottyfan.quickiemod.items.QuickieItems;
-import net.minecraft.block.AbstractBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.ExperienceDroppingBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.loot.context.LootContextParameterSet.Builder;
+import net.minecraft.sound.BlockSoundGroup;
/**
*
@@ -19,7 +19,7 @@ import net.minecraft.loot.context.LootContextParameterSet.Builder;
public class BlockSalpeter extends ExperienceDroppingBlock {
public BlockSalpeter() {
- super(IntProviderHelper.of(0, 2), AbstractBlock.Settings.create().hardness(0.5f));
+ super(IntProviderHelper.of(0, 2), Settings.create().strength(2.5f).hardness(0.5f).sounds(BlockSoundGroup.SOUL_SAND).requiresTool());
}
@Override
diff --git a/src/main/java/de/jottyfan/quickiemod/blocks/BlockSandSalpeter.java b/src/main/java/de/jottyfan/quickiemod/blocks/BlockSandSalpeter.java
index 35c8be4..50bc957 100644
--- a/src/main/java/de/jottyfan/quickiemod/blocks/BlockSandSalpeter.java
+++ b/src/main/java/de/jottyfan/quickiemod/blocks/BlockSandSalpeter.java
@@ -6,12 +6,12 @@ import java.util.List;
import com.mojang.serialization.MapCodec;
import de.jottyfan.quickiemod.items.QuickieItems;
-import net.minecraft.block.AbstractBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.FallingBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.loot.context.LootContextParameterSet.Builder;
+import net.minecraft.sound.BlockSoundGroup;
import net.minecraft.util.math.random.Random;
/**
@@ -22,7 +22,7 @@ import net.minecraft.util.math.random.Random;
public class BlockSandSalpeter extends FallingBlock {
public BlockSandSalpeter() {
- super(AbstractBlock.Settings.create().hardness(3.1f).requiresTool());
+ super(Settings.create().strength(2.5f).hardness(3.1f).sounds(BlockSoundGroup.SOUL_SAND).requiresTool());
}
@Override
diff --git a/src/main/java/de/jottyfan/quickiemod/blocks/BlockSulphor.java b/src/main/java/de/jottyfan/quickiemod/blocks/BlockSulphor.java
index 5769b06..cfe8dd0 100644
--- a/src/main/java/de/jottyfan/quickiemod/blocks/BlockSulphor.java
+++ b/src/main/java/de/jottyfan/quickiemod/blocks/BlockSulphor.java
@@ -5,11 +5,11 @@ import java.util.List;
import de.jottyfan.quickiemod.blocks.help.IntProviderHelper;
import de.jottyfan.quickiemod.items.QuickieItems;
-import net.minecraft.block.AbstractBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.ExperienceDroppingBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.loot.context.LootContextParameterSet.Builder;
+import net.minecraft.sound.BlockSoundGroup;
/**
*
@@ -19,7 +19,7 @@ import net.minecraft.loot.context.LootContextParameterSet.Builder;
public class BlockSulphor extends ExperienceDroppingBlock {
public BlockSulphor() {
- super(IntProviderHelper.of(0, 2), AbstractBlock.Settings.create().hardness(0.5f));
+ super(IntProviderHelper.of(0, 2), Settings.create().strength(2.5f).hardness(0.5f).sounds(BlockSoundGroup.SOUL_SAND).requiresTool());
}
@Override
diff --git a/src/main/java/de/jottyfan/quickiemod/event/BreakBlockCallback.java b/src/main/java/de/jottyfan/quickiemod/event/BreakBlockCallback.java
new file mode 100644
index 0000000..b1ab672
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/event/BreakBlockCallback.java
@@ -0,0 +1,29 @@
+package de.jottyfan.quickiemod.event;
+
+import net.fabricmc.fabric.api.event.Event;
+import net.fabricmc.fabric.api.event.EventFactory;
+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
+ *
+ */
+public interface BreakBlockCallback {
+ Event EVENT = EventFactory.createArrayBacked(BreakBlockCallback.class,
+ (listeners) -> (world, blockPos, blockState, playerEntity) -> {
+ for (BreakBlockCallback listener : listeners) {
+ ActionResult result = listener.injectBlockBreakCallback(world, blockPos, blockState, playerEntity);
+ if (result != ActionResult.PASS) {
+ return result;
+ }
+ }
+ return ActionResult.PASS;
+ });
+
+ ActionResult injectBlockBreakCallback(World world, BlockPos blockPos, BlockState blockState, PlayerEntity playerEntity);
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/event/EventBlockBreak.java b/src/main/java/de/jottyfan/quickiemod/event/EventBlockBreak.java
new file mode 100644
index 0000000..7e790c4
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/event/EventBlockBreak.java
@@ -0,0 +1,193 @@
+package de.jottyfan.quickiemod.event;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import de.jottyfan.quickiemod.QuickieMod;
+import de.jottyfan.quickiemod.items.HarvestRange;
+import de.jottyfan.quickiemod.items.QuickieItems;
+import de.jottyfan.quickiemod.items.ToolRangeable;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.entity.EquipmentSlot;
+import net.minecraft.entity.ExperienceOrbEntity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class EventBlockBreak {
+ private static final Logger LOGGER = LogManager.getLogger(QuickieMod.MODID);
+
+ private enum BlockBreakDirection {
+ UPWARDS, ALL;
+ }
+
+ public void doBreakBlock(World world, BlockPos blockPos, BlockState blockState, PlayerEntity playerEntity) {
+ ItemStack mainHandItemStack = playerEntity.getEquippedStack(EquipmentSlot.MAINHAND);
+ if (mainHandItemStack != null) {
+ Item item = mainHandItemStack.getItem();
+ if (item instanceof ToolRangeable) {
+ ToolRangeable tool = (ToolRangeable) item;
+ Block block = blockState.getBlock();
+ int handled = handleRangeableTools(tool, mainHandItemStack, world, block, blockPos, playerEntity);
+ if (handled >= 255) {
+ // reward for using rangeable tool very successful
+ world.spawnEntity(
+ new ExperienceOrbEntity(world, blockPos.getX(), blockPos.getY(), blockPos.getZ(), handled / 255));
+ }
+ }
+ }
+ }
+
+ /**
+ * handle the rangeable tools break event
+ *
+ * @param tool the tool that has been used
+ * @param itemStack the item stack
+ * @param world the world
+ * @param block the block to break
+ * @param pos the position of the current block
+ * @param player the current player
+ * @return number of affected blocks
+ */
+ private int handleRangeableTools(ToolRangeable tool, ItemStack itemStack, World world, Block currentBlock,
+ BlockPos pos, PlayerEntity player) {
+ List validBlocks = tool.getBlockList(currentBlock);
+ HarvestRange range = tool.getRange(itemStack);
+
+ LOGGER.info("current tool: {}", tool);
+
+ if (QuickieItems.SPEEDPOWDERAXE.getItem().equals(tool)) {
+ return breakBlockRecursive(new ArrayList<>(), world, validBlocks, pos, tool, range, BlockBreakDirection.UPWARDS,
+ player, true);
+ } else if (QuickieItems.SPEEDPOWDERPICKAXE.getItem().equals(tool)) {
+ return breakBlockRecursive(new ArrayList<>(), world, validBlocks, pos, tool, range, BlockBreakDirection.ALL,
+ player, false);
+ } else if (QuickieItems.SPEEDPOWDERSHOVEL.getItem().equals(tool)) {
+ return breakBlockRecursive(new ArrayList<>(), world, validBlocks, pos, tool, range, BlockBreakDirection.ALL,
+ player, false);
+ } else if (QuickieItems.SPEEDPOWDERHOE.getItem().equals(tool)) {
+ return breakBlockRecursive(new ArrayList<>(), world, validBlocks, pos, tool, range, BlockBreakDirection.ALL,
+ player, false);
+ } else if (QuickieItems.QUICKIEPOWDERAXE.getItem().equals(tool)) {
+ return breakBlockRecursive(new ArrayList<>(), world, validBlocks, pos, tool, range, BlockBreakDirection.UPWARDS,
+ player, true);
+ } else if (QuickieItems.QUICKIEPOWDERPICKAXE.getItem().equals(tool)) {
+ return breakBlockRecursive(new ArrayList<>(), world, validBlocks, pos, tool, range, BlockBreakDirection.ALL,
+ player, false);
+ } else if (QuickieItems.QUICKIEPOWDERSHOVEL.getItem().equals(tool)) {
+ return breakBlockRecursive(new ArrayList<>(), world, validBlocks, pos, tool, range, BlockBreakDirection.ALL,
+ player, false);
+ } else if (QuickieItems.QUICKIEPOWDERHOE.getItem().equals(tool)) {
+ return breakBlockRecursive(new ArrayList<>(), world, validBlocks, pos, tool, range, BlockBreakDirection.ALL,
+ player, false);
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * break block recursively;
+ *
+ * @param visitedBlocks the positions of visited blocks
+ * @param world the world
+ * @param validBlocks the blocks to break
+ * @param tool the tool used
+ * @param range the range left over
+ * @param pos the position
+ * @param blockBreakDirection the direction for the recursive call
+ * @param player the player
+ * @return number of affected blocks
+ */
+ private int breakBlockRecursive(List visitedBlocks, World world, List validBlocks, BlockPos pos,
+ ToolRangeable tool, HarvestRange range, BlockBreakDirection blockBreakDirection, PlayerEntity player,
+ boolean breakLeaves) {
+ if (visitedBlocks.contains(pos.toString())) {
+ return 0;
+ } else if (validBlocks == null) {
+ return 0;
+ } else {
+ visitedBlocks.add(pos.toString());
+ }
+ Integer affected = 0;
+ BlockState blockState = world.getBlockState(pos);
+ if (tool.canBreakNeighbors(blockState)) {
+ Block currentBlock = blockState.getBlock();
+ if (validBlocks.contains(currentBlock)) {
+ Block.dropStacks(blockState, world, pos); // includes xorbs
+ affected += 1;
+ world.setBlockState(pos, Blocks.AIR.getDefaultState());
+ if (range == null || range.getxRange() > 1 || range.getyRange() > 1 || range.getzRange() > 1) {
+ HarvestRange nextRadius = range == null ? null : range.addXYZ(-1);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.north(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.north().east(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.north().west(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.south(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.south().east(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.south().west(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.east(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.west(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.up(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.up().north(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.up().north().east(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.up().north().west(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.up().east(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.up().west(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.up().south().east(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.up().south().west(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.up().south(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+
+ if (BlockBreakDirection.ALL.equals(blockBreakDirection)) {
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.down(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.down().north(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.down().south(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.down().east(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.down().west(), tool, nextRadius,
+ blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.down().north().east(), tool,
+ nextRadius, blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.down().north().west(), tool,
+ nextRadius, blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.down().south().east(), tool,
+ nextRadius, blockBreakDirection, player, breakLeaves);
+ affected += breakBlockRecursive(visitedBlocks, world, validBlocks, pos.down().south().west(), tool,
+ nextRadius, blockBreakDirection, player, breakLeaves);
+ }
+ }
+ }
+ }
+ return affected;
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/init/RegistryManager.java b/src/main/java/de/jottyfan/quickiemod/init/RegistryManager.java
index 630455a..c13c900 100644
--- a/src/main/java/de/jottyfan/quickiemod/init/RegistryManager.java
+++ b/src/main/java/de/jottyfan/quickiemod/init/RegistryManager.java
@@ -6,6 +6,8 @@ import org.slf4j.LoggerFactory;
import de.jottyfan.quickiemod.QuickieMod;
import de.jottyfan.quickiemod.blockentity.BlockEntityTypes;
import de.jottyfan.quickiemod.blocks.QuickieBlocks;
+import de.jottyfan.quickiemod.event.BreakBlockCallback;
+import de.jottyfan.quickiemod.event.EventBlockBreak;
import de.jottyfan.quickiemod.items.QuickieItems;
import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
@@ -21,6 +23,7 @@ import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKey;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.text.Text;
+import net.minecraft.util.ActionResult;
import net.minecraft.util.Identifier;
/**
@@ -47,7 +50,7 @@ public class RegistryManager {
}
public static final void registerItems() {
- LOGGER.debug("registering items");
+ LOGGER.info("registering items");
for (QuickieItems i : QuickieItems.values()) {
Registry.register(Registries.ITEM, Identifier.of(QuickieMod.MODID, i.getName()), i.getItem());
}
@@ -60,7 +63,7 @@ public class RegistryManager {
}
public static final void registerBlocks() {
- LOGGER.debug("registering blocks");
+ LOGGER.info("registering blocks");
for (QuickieBlocks b : QuickieBlocks.values()) {
Registry.register(Registries.BLOCK, Identifier.of(QuickieMod.MODID, b.getName()), b.getBlock());
Registry.register(Registries.ITEM, Identifier.of(QuickieMod.MODID, b.getName()), new BlockItem(b.getBlock(), new Settings()));
@@ -77,6 +80,14 @@ public class RegistryManager {
FeaturesManager.netherOres());
}
+ public static final void registerEvents() {
+ LOGGER.info("registering events");
+ BreakBlockCallback.EVENT.register((world, blockPos, blockState, playerEntity) -> {
+ new EventBlockBreak().doBreakBlock(world, blockPos, blockState, playerEntity);
+ return ActionResult.SUCCESS;
+ });
+ }
+
public static final void registerBlockEntityTypes() {
new BlockEntityTypes();
}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/HarvestRange.java b/src/main/java/de/jottyfan/quickiemod/items/HarvestRange.java
new file mode 100644
index 0000000..4e5efc3
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/HarvestRange.java
@@ -0,0 +1,101 @@
+package de.jottyfan.quickiemod.items;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class HarvestRange implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private int xRange;
+ private int yRange;
+ private int zRange;
+
+ public HarvestRange(int xyzRange) {
+ super();
+ this.xRange = xyzRange;
+ this.yRange = xyzRange;
+ this.zRange = xyzRange;
+ }
+
+ public HarvestRange(int[] xyzRange) {
+ super();
+ this.xRange = xyzRange[0];
+ this.yRange = xyzRange[1];
+ this.zRange = xyzRange[2];
+ }
+
+ public HarvestRange(int xRange, int yRange, int zRange) {
+ super();
+ this.xRange = xRange;
+ this.yRange = yRange;
+ this.zRange = zRange;
+ }
+
+ /**
+ * add i to x, y and z and return the resulting class as a new one
+ *
+ * @param i
+ * the summand
+ * @return the new class
+ */
+ public HarvestRange addXYZ(int i) {
+ return new HarvestRange(xRange + i, yRange + i, zRange + i);
+ }
+
+ /**
+ * get range as int array
+ *
+ * @return the int array
+ */
+ public int[] getRangeAsArray() {
+ return new int[] {xRange, yRange, zRange};
+ }
+
+ /**
+ * @return the xRange
+ */
+ public int getxRange() {
+ return xRange;
+ }
+
+ /**
+ * @param xRange
+ * the xRange to set
+ */
+ public void setxRange(int xRange) {
+ this.xRange = xRange;
+ }
+
+ /**
+ * @return the yRange
+ */
+ public int getyRange() {
+ return yRange;
+ }
+
+ /**
+ * @param yRange
+ * the yRange to set
+ */
+ public void setyRange(int yRange) {
+ this.yRange = yRange;
+ }
+
+ /**
+ * @return the zRange
+ */
+ public int getzRange() {
+ return zRange;
+ }
+
+ /**
+ * @param zRange
+ * the zRange to set
+ */
+ public void setzRange(int zRange) {
+ this.zRange = zRange;
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/QuickieItems.java b/src/main/java/de/jottyfan/quickiemod/items/QuickieItems.java
index 2106a80..cb9ae0e 100644
--- a/src/main/java/de/jottyfan/quickiemod/items/QuickieItems.java
+++ b/src/main/java/de/jottyfan/quickiemod/items/QuickieItems.java
@@ -9,7 +9,22 @@ import net.minecraft.item.Item;
*/
public enum QuickieItems {
// @formatter:off
- SPEEDPOWDERSHEARS(new ItemSpeedpowdershears(), "speedpowdershears"),
+ SPEEDPOWDER(new ItemSpeedpowder(), "speedpowder"),
+ QUICKIEPOWDER(new ItemQuickiepowder(), "quickiepowder"),
+ OXIDIZEDCOPPERPOWDER(new ItemOxidizedcopperpowder(), "oxidizedcopperpowder"),
+ SPEEDINGOT(new ItemSpeedingot(), "speedingot"),
+ QUICKIEINGOT(new ItemQuickieingot(), "quickieingot"),
+ SPEEDPOWDERAXE(new ToolSpeedpowderAxe(), "speedpowderaxe"),
+ SPEEDPOWDERPICKAXE(new ToolSpeedpowderPickaxe(), "speedpowderpickaxe"),
+ SPEEDPOWDERSHOVEL(new ToolSpeedpowderShovel(), "speedpowdershovel"),
+ SPEEDPOWDERHOE(new ToolSpeedpowderHoe(), "speedpowderhoe"),
+ SPEEDPOWDERWATERHOE(new ToolSpeedpowderWaterHoe(), "speedpowderwaterhoe"),
+ SPEEDPOWDERSHEARS(new ToolSpeedpowderShears(), "speedpowdershears"),
+ QUICKIEPOWDERAXE(new ToolQuickiepowderAxe(), "quickiepowderaxe"),
+ QUICKIEPOWDERPICKAXE(new ToolQuickiepowderPickaxe(), "quickiepowderpickaxe"),
+ QUICKIEPOWDERSHOVEL(new ToolQuickiepowderShovel(), "quickiepowdershovel"),
+ QUICKIEPOWDERHOE(new ToolQuickiepowderHoe(), "quickiepowderhoe"),
+ QUICKIEPOWDERWATERHOE(new ToolQuickiepowderWaterHoe(), "quickiepowderwaterhoe"),
ROTTEN_FLESH_STRIPES(new ItemRottenFleshStripes(), "rotten_flesh_stripes"),
CARROTSTACK(new ItemCarrotstack(), "carrotstack"),
COTTON(new ItemCotton(), "cotton"),
@@ -20,12 +35,7 @@ public enum QuickieItems {
CANOLABOTTLESTACK(new ItemCanolabottlestack(), "canolabottlestack"),
STUB(new ItemStub(), "stub"),
SALPETER(new ItemSalpeter(), "salpeter"),
- SULPHOR(new ItemSulphor(), "sulphor"),
- SPEEDPOWDER(new ItemSpeedpowder(), "speedpowder"),
- QUICKIEPOWDER(new ItemQuickiepowder(), "quickiepowder"),
- OXIDIZEDCOPPERPOWDER(new ItemOxidizedcopperpowder(), "oxidizedcopperpowder"),
- SPEEDINGOT(new ItemSpeedingot(), "speedingot"),
- QUICKIEINGOT(new ItemQuickieingot(), "quickieingot");
+ SULPHOR(new ItemSulphor(), "sulphor");
// @formatter:on
private final Item item;
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderAxe.java b/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderAxe.java
new file mode 100644
index 0000000..74829f4
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderAxe.java
@@ -0,0 +1,26 @@
+package de.jottyfan.quickiemod.items;
+
+import de.jottyfan.quickiemod.items.mat.QuickieToolMaterial;
+import net.minecraft.item.AxeItem;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class ToolQuickiepowderAxe extends ToolRangeableAxe {
+
+ private final static QuickieToolMaterial MATERIAL = QuickieToolMaterial.of(7f, 2400, 15, 1f, QuickieItems.SPEEDINGOT.getItem());
+
+ public ToolQuickiepowderAxe() {
+ super(MATERIAL, new Item.Settings().attributeModifiers(AxeItem.createAttributeModifiers(MATERIAL, 7F, -3.1F)));
+ }
+
+ @Override
+ public HarvestRange getRange(ItemStack stack) {
+ // TODO: get the range from the stack
+ return new HarvestRange(64, 128, 64); // trees bigger than that are too heavy for one small axe...
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderHoe.java b/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderHoe.java
new file mode 100644
index 0000000..a036c49
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderHoe.java
@@ -0,0 +1,20 @@
+package de.jottyfan.quickiemod.items;
+
+import de.jottyfan.quickiemod.items.mat.QuickieToolMaterial;
+import net.minecraft.item.HoeItem;
+import net.minecraft.item.Item;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class ToolQuickiepowderHoe extends ToolRangeableHoe {
+
+ public static final Integer DEFAULT_PLOW_RANGE = 4;
+ private final static QuickieToolMaterial MATERIAL = QuickieToolMaterial.of(7f, 2400, 15, 1f, QuickieItems.SPEEDINGOT.getItem());
+
+ public ToolQuickiepowderHoe() {
+ super(MATERIAL, new Item.Settings().attributeModifiers(HoeItem.createAttributeModifiers(MATERIAL, 7F, -3.1F)), new HarvestRange(DEFAULT_PLOW_RANGE));
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderPickaxe.java b/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderPickaxe.java
new file mode 100644
index 0000000..dc1dbcc
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderPickaxe.java
@@ -0,0 +1,54 @@
+package de.jottyfan.quickiemod.items;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import de.jottyfan.quickiemod.items.mat.QuickieToolMaterial;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.PickaxeItem;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class ToolQuickiepowderPickaxe extends PickaxeItem implements ToolRangeable {
+
+ public static final int[] DEFAULT_HARVEST_RANGE = new int[] { 6, 6, 6 };
+ private final static QuickieToolMaterial MATERIAL = QuickieToolMaterial.of(7f, 2400, 15, 1f, QuickieItems.SPEEDINGOT.getItem());
+
+ public ToolQuickiepowderPickaxe() {
+ super(MATERIAL, new Item.Settings().attributeModifiers(PickaxeItem.createAttributeModifiers(MATERIAL, 7F, -3.1F)));
+ }
+
+ @Override
+ public HarvestRange getRange(ItemStack stack) {
+ return new HarvestRange(DEFAULT_HARVEST_RANGE);
+ }
+
+ @Override
+ public boolean canBreakNeighbors(BlockState blockIn) {
+ return new ItemStack(this).isSuitableFor(blockIn);
+ }
+
+ @Override
+ public List getBlockList(Block block) {
+ return Lists.newArrayList(block);
+ }
+
+// @Override
+// public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
+// CommonToolCode.onItemRightClick(worldIn, playerIn, handIn);
+// return super.onItemRightClick(worldIn, playerIn, handIn);
+// }
+//
+// @Override
+// public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) {
+// CommonToolCode.addInformation(stack, worldIn, tooltip, flagIn);
+// super.addInformation(stack, worldIn, tooltip, flagIn);
+// }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderShovel.java b/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderShovel.java
new file mode 100644
index 0000000..3ee6f49
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderShovel.java
@@ -0,0 +1,97 @@
+package de.jottyfan.quickiemod.items;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import de.jottyfan.quickiemod.items.mat.QuickieToolMaterial;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemUsageContext;
+import net.minecraft.item.ShovelItem;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.Direction;
+import net.minecraft.world.World;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class ToolQuickiepowderShovel extends ShovelItem implements ToolRangeable {
+ public static final Integer DEFAULT_HARVEST_RANGE = 6;
+ private final static QuickieToolMaterial MATERIAL = QuickieToolMaterial.of(7f, 2400, 15, 1f, QuickieItems.SPEEDINGOT.getItem());
+ public HarvestRange range;
+
+ public ToolQuickiepowderShovel() {
+ super(MATERIAL, new Item.Settings().attributeModifiers(ShovelItem.createAttributeModifiers(MATERIAL, 7F, -3.1F)));
+ this.range = new HarvestRange(DEFAULT_HARVEST_RANGE);
+ }
+
+ private void createPathOnGrass(World world, BlockPos pos, Direction side) {
+ BlockState blockState = world.getBlockState(pos);
+ if (blockState.isAir()) {
+ // try to find one underneath
+ pos = pos.down();
+ blockState = world.getBlockState(pos);
+ } else if (!world.getBlockState(pos.up()).isAir()) {
+ pos = pos.up();
+ blockState = world.getBlockState(pos);
+ }
+ if (side != Direction.DOWN) {
+ BlockState blockState2 = (BlockState) PATH_STATES.get(blockState.getBlock());
+ if (blockState2 != null && world.getBlockState(pos.up()).isAir()) {
+ if (!world.isClient) {
+ world.setBlockState(pos, blockState2, 11);
+ }
+ }
+ }
+ }
+
+ @Override
+ public ActionResult useOnBlock(ItemUsageContext context) {
+ World world = context.getWorld();
+ BlockPos pos = context.getBlockPos();
+ BlockPos[] positions = new BlockPos[] { pos.north().north().west().west(), pos.north().north().west(),
+ pos.north().north(), pos.north().north().east(), pos.north().north().east().east(), pos.north().west().west(),
+ pos.north().west(), pos.north(), pos.north().east(), pos.north().east().east(), pos.west().west(), pos.west(),
+ pos, pos.east(), pos.east().east(), pos.south().west().west(), pos.south().west(), pos.south(),
+ pos.south().east(), pos.south().east().east(), pos.south().south().west().west(), pos.south().south().west(),
+ pos.south().south(), pos.south().south().east(), pos.south().south().east().east() };
+ for (BlockPos p : positions) {
+ createPathOnGrass(world, p, context.getSide());
+ }
+ return super.useOnBlock(context);
+ }
+
+ @Override
+ public HarvestRange getRange(ItemStack stack) {
+ // TODO: get range from stack
+ return range;
+ }
+
+ @Override
+ public boolean canBreakNeighbors(BlockState blockState) {
+ return new ItemStack(this).isSuitableFor(blockState);
+ }
+
+ @Override
+ public List getBlockList(Block block) {
+ return Lists.newArrayList(block);
+ }
+
+// @Override
+// public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
+// CommonToolCode.onItemRightClick(worldIn, playerIn, handIn);
+// return super.onItemRightClick(worldIn, playerIn, handIn);
+// }
+//
+// @Override
+// public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) {
+// CommonToolCode.addInformation(stack, worldIn, tooltip, flagIn);
+// super.addInformation(stack, worldIn, tooltip, flagIn);
+// }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderWaterHoe.java b/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderWaterHoe.java
new file mode 100644
index 0000000..4d9189e
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolQuickiepowderWaterHoe.java
@@ -0,0 +1,38 @@
+package de.jottyfan.quickiemod.items;
+
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.entity.ItemEntity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemUsageContext;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.Hand;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class ToolQuickiepowderWaterHoe extends ToolQuickiepowderHoe {
+ @Override
+ public ActionResult useOnBlock(ItemUsageContext context) {
+ ActionResult res = super.useOnBlock(context);
+ if (!ActionResult.PASS.equals(res)) {
+ BlockPos pos = context.getBlockPos();
+ World world = context.getWorld();
+ BlockState oldBlockState = world.getBlockState(pos);
+ world.setBlockState(pos, Blocks.WATER.getDefaultState());
+ Hand hand = context.getHand();
+ PlayerEntity player = context.getPlayer();
+ ItemStack oldTool = player.getStackInHand(hand);
+ ItemStack newTool = new ItemStack(QuickieItems.QUICKIEPOWDERHOE.getItem());
+ newTool.setDamage(oldTool.getDamage());
+ world.spawnEntity(new ItemEntity(world, pos.getX(), pos.getY(), pos.getZ(), new ItemStack(oldBlockState.getBlock())));
+ player.setStackInHand(hand, newTool);
+ }
+ return res;
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolRangeable.java b/src/main/java/de/jottyfan/quickiemod/items/ToolRangeable.java
new file mode 100644
index 0000000..a793612
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolRangeable.java
@@ -0,0 +1,38 @@
+package de.jottyfan.quickiemod.items;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.item.ItemStack;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public interface ToolRangeable {
+
+ /**
+ * @param stack the item stack that keeps the range
+ * @return range of blocks to be harvested
+ */
+ public HarvestRange getRange(ItemStack stack);
+
+ /**
+ * check if this block state is one that affects the neighbor blocks to break
+ * also if they are from the same type
+ *
+ * @param blockState the block state of the current block
+ * @return true or false
+ */
+ public boolean canBreakNeighbors(BlockState blockState);
+
+ /**
+ * get list of blocks that belong together (could be useful for stripped logs)
+ *
+ * @param block of the set
+ * @return the list of blocks or null if not found
+ */
+ public List getBlockList(Block block);
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolRangeableAxe.java b/src/main/java/de/jottyfan/quickiemod/items/ToolRangeableAxe.java
new file mode 100644
index 0000000..253011c
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolRangeableAxe.java
@@ -0,0 +1,63 @@
+package de.jottyfan.quickiemod.items;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.LeavesBlock;
+import net.minecraft.item.AxeItem;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ToolMaterial;
+import net.minecraft.registry.tag.BlockTags;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public abstract class ToolRangeableAxe extends AxeItem implements ToolRangeable {
+
+ protected ToolRangeableAxe(ToolMaterial material, Item.Settings settings) {
+ super(material, settings);
+ }
+
+ @Override
+ public HarvestRange getRange(ItemStack stack) {
+ // TODO: get the range from the stack
+ return new HarvestRange(16, 32, 16);
+ }
+
+ /**
+ * check if the block is a leaves block
+ *
+ * @param blockIn the block
+ * @return true or false
+ */
+ private boolean isLeavesBlock(BlockState blockIn) {
+ boolean vanillaLeaves = blockIn.getBlock() instanceof LeavesBlock;
+ boolean terrestriaLeaves = false;
+ try {
+ Class> extendedLeavesBlock = Class.forName("com.terraformersmc.terraform.leaves.block.ExtendedLeavesBlock");
+ terrestriaLeaves = extendedLeavesBlock.isInstance(blockIn.getBlock());
+ } catch (ClassNotFoundException e) {
+ // no terrestria mod available, so ignore this
+ // using this approach instead of the instanceof functionality, we don't need to refer to terrestria
+ // and omit a crash on installations that do not have or want terrestria available
+ }
+ boolean blockTagLeaves = blockIn.isIn(BlockTags.LEAVES);
+ return vanillaLeaves || terrestriaLeaves || blockTagLeaves;
+ }
+
+ @Override
+ public boolean canBreakNeighbors(BlockState blockIn) {
+ return new ItemStack(this).isSuitableFor(blockIn) || isLeavesBlock(blockIn) || blockIn.isIn(BlockTags.LOGS);
+ }
+
+ @Override
+ public List getBlockList(Block block) {
+ return Lists.newArrayList(block);
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolRangeableHoe.java b/src/main/java/de/jottyfan/quickiemod/items/ToolRangeableHoe.java
new file mode 100644
index 0000000..51d3b3f
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolRangeableHoe.java
@@ -0,0 +1,97 @@
+package de.jottyfan.quickiemod.items;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.CropBlock;
+import net.minecraft.item.HoeItem;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemUsageContext;
+import net.minecraft.item.ToolMaterial;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.hit.BlockHitResult;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.Direction;
+import net.minecraft.util.math.Vec3i;
+import net.minecraft.world.World;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public abstract class ToolRangeableHoe extends HoeItem implements ToolRangeable {
+
+ public HarvestRange range;
+
+ public ToolRangeableHoe(ToolMaterial material, Settings settings, HarvestRange range) {
+ super(material, settings);
+ this.range = range;
+ }
+
+ @Override
+ public ActionResult useOnBlock(ItemUsageContext context) {
+ ActionResult res = super.useOnBlock(context);
+ boolean isCrop = context.getWorld().getBlockState(context.getBlockPos()).getBlock() instanceof CropBlock;
+ if (!ActionResult.PASS.equals(res) || isCrop) {
+ for (int x = -this.range.getxRange(); x <= this.range.getxRange(); x++) {
+ for (int y = -this.range.getyRange(); y <= this.range.getyRange(); y++) {
+ for (int z = -this.range.getzRange(); z <= this.range.getzRange(); z++) {
+ if (!isCrop) {
+ removePossibleGrass(context.getWorld(), new BlockPos(x, y, z));
+ BlockHitResult bhr = new BlockHitResult(context.getHitPos(), Direction.UP,
+ context.getBlockPos().add(new Vec3i(x, y, z)), false);
+ ItemUsageContext ctx = new ItemUsageContext(context.getPlayer(), context.getHand(), bhr);
+ super.useOnBlock(ctx);
+ } else {
+ harvestIfPossible(context.getBlockPos().add(x, y, z), context.getWorld());
+ }
+ }
+ }
+ }
+ }
+ return res;
+ }
+
+ private void removePossibleGrass(World world, BlockPos pos) {
+ Block block = world.getBlockState(pos).getBlock();
+ Boolean grassFound = Blocks.FERN.equals(block) || Blocks.LARGE_FERN.equals(block)
+ || Blocks.SHORT_GRASS.equals(block) || Blocks.TALL_GRASS.equals(block);
+ if (grassFound) {
+ world.breakBlock(pos, true);
+ }
+ }
+
+ private void harvestIfPossible(BlockPos pos, World world) {
+ BlockState blockState = world.getBlockState(pos);
+ Block block = blockState.getBlock();
+ if (block instanceof CropBlock) {
+ CropBlock cBlock = (CropBlock) block;
+ if (cBlock.isMature(blockState)) {
+ Block.dropStacks(blockState, world, pos);
+ world.setBlockState(pos, cBlock.withAge(0));
+ }
+ }
+ }
+
+ @Override
+ public HarvestRange getRange(ItemStack stack) {
+ // TODO: get range from stack
+ return range;
+ }
+
+ @Override
+ public boolean canBreakNeighbors(BlockState blockState) {
+ return new ItemStack(this).isSuitableFor(blockState) || Blocks.TALL_GRASS.equals(blockState.getBlock())
+ || Blocks.FERN.equals(blockState.getBlock()) || Blocks.LARGE_FERN.equals(blockState.getBlock());
+ }
+
+ @Override
+ public List getBlockList(Block block) {
+ return Lists.newArrayList(block);
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderAxe.java b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderAxe.java
new file mode 100644
index 0000000..73e926a
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderAxe.java
@@ -0,0 +1,26 @@
+package de.jottyfan.quickiemod.items;
+
+import de.jottyfan.quickiemod.items.mat.QuickieToolMaterial;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.PickaxeItem;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class ToolSpeedpowderAxe extends ToolRangeableAxe {
+
+ private final static QuickieToolMaterial MATERIAL = QuickieToolMaterial.of(7f, 800, 15, 1f, QuickieItems.SPEEDINGOT.getItem());
+
+ public ToolSpeedpowderAxe() {
+ super(MATERIAL, new Item.Settings().attributeModifiers(PickaxeItem.createAttributeModifiers(MATERIAL, 7f, -3.1f)));
+ }
+
+ @Override
+ public HarvestRange getRange(ItemStack stack) {
+ // TODO: get the range from the stack
+ return new HarvestRange(32, 64, 32);
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderHoe.java b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderHoe.java
new file mode 100644
index 0000000..14edd2a
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderHoe.java
@@ -0,0 +1,20 @@
+package de.jottyfan.quickiemod.items;
+
+import de.jottyfan.quickiemod.items.mat.QuickieToolMaterial;
+import net.minecraft.item.HoeItem;
+import net.minecraft.item.Item;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class ToolSpeedpowderHoe extends ToolRangeableHoe {
+
+ public static final Integer DEFAULT_PLOW_RANGE = 2;
+ private final static QuickieToolMaterial MATERIAL = QuickieToolMaterial.of(7f, 800, 15, 1f, QuickieItems.SPEEDINGOT.getItem());
+
+ public ToolSpeedpowderHoe() {
+ super(MATERIAL, new Item.Settings().attributeModifiers(HoeItem.createAttributeModifiers(MATERIAL, 7F, -3.1F)), new HarvestRange(DEFAULT_PLOW_RANGE));
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderPickaxe.java b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderPickaxe.java
new file mode 100644
index 0000000..2d5d3de
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderPickaxe.java
@@ -0,0 +1,55 @@
+package de.jottyfan.quickiemod.items;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import de.jottyfan.quickiemod.items.mat.QuickieToolMaterial;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.item.AxeItem;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.PickaxeItem;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class ToolSpeedpowderPickaxe extends PickaxeItem implements ToolRangeable {
+
+ public static final int[] DEFAULT_HARVEST_RANGE = new int[] { 3, 3, 3 };
+ private final static QuickieToolMaterial MATERIAL = QuickieToolMaterial.of(7f, 800, 15, 1f, QuickieItems.SPEEDINGOT.getItem());
+
+ public ToolSpeedpowderPickaxe() {
+ super(MATERIAL, new Item.Settings().attributeModifiers(AxeItem.createAttributeModifiers(MATERIAL, 7F, -3.1F)));
+ }
+
+ @Override
+ public HarvestRange getRange(ItemStack stack) {
+ return new HarvestRange(DEFAULT_HARVEST_RANGE);
+ }
+
+ @Override
+ public boolean canBreakNeighbors(BlockState blockIn) {
+ return new ItemStack(this).isSuitableFor(blockIn);
+ }
+
+ @Override
+ public List getBlockList(Block block) {
+ return Lists.newArrayList(block);
+ }
+
+// @Override
+// public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
+// CommonToolCode.onItemRightClick(worldIn, playerIn, handIn);
+// return super.onItemRightClick(worldIn, playerIn, handIn);
+// }
+//
+// @Override
+// public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) {
+// CommonToolCode.addInformation(stack, worldIn, tooltip, flagIn);
+// super.addInformation(stack, worldIn, tooltip, flagIn);
+// }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderShears.java b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderShears.java
new file mode 100644
index 0000000..ae75d84
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderShears.java
@@ -0,0 +1,96 @@
+package de.jottyfan.quickiemod.items;
+
+import java.util.Random;
+
+import net.minecraft.component.DataComponentTypes;
+import net.minecraft.entity.ItemEntity;
+import net.minecraft.entity.LivingEntity;
+import net.minecraft.entity.passive.ChickenEntity;
+import net.minecraft.entity.passive.CowEntity;
+import net.minecraft.entity.passive.HorseEntity;
+import net.minecraft.entity.passive.SheepEntity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.item.ShearsItem;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.DyeColor;
+import net.minecraft.util.Hand;
+import net.minecraft.util.math.Vec3d;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class ToolSpeedpowderShears extends ShearsItem {
+
+ public ToolSpeedpowderShears() {
+ super(new Item.Settings().component(DataComponentTypes.TOOL, ShearsItem.createToolComponent()));
+ }
+
+ @Override
+ public ActionResult useOnEntity(ItemStack stack, PlayerEntity user, LivingEntity entity, Hand hand) {
+ Vec3d pos = entity.getPos();
+ Integer amount = 3 + new Random().nextInt(4);
+ if (entity instanceof SheepEntity) {
+ SheepEntity sheep = (SheepEntity) entity;
+ if (sheep.isShearable()) {
+ sheep.setSheared(true);
+ sheep.playAmbientSound();
+ DyeColor color = sheep.getColor();
+ Item item = Items.WHITE_WOOL;
+ if (color.equals(DyeColor.BLACK)) {
+ item = Items.BLACK_WOOL;
+ } else if (color.equals(DyeColor.GRAY)) {
+ item = Items.GRAY_WOOL;
+ } else if (color.equals(DyeColor.LIGHT_GRAY)) {
+ item = Items.LIGHT_GRAY_WOOL;
+ } else if (color.equals(DyeColor.BROWN)) {
+ item = Items.BROWN_WOOL;
+ } else if (color.equals(DyeColor.BLUE)) {
+ item = Items.BLUE_WOOL;
+ } else if (color.equals(DyeColor.LIGHT_BLUE)) {
+ item = Items.LIGHT_BLUE_WOOL;
+ } else if (color.equals(DyeColor.GREEN)) {
+ item = Items.GREEN_WOOL;
+ } else if (color.equals(DyeColor.LIME)) {
+ item = Items.LIME_WOOL;
+ } else if (color.equals(DyeColor.CYAN)) {
+ item = Items.CYAN_WOOL;
+ } else if (color.equals(DyeColor.MAGENTA)) {
+ item = Items.MAGENTA_WOOL;
+ } else if (color.equals(DyeColor.ORANGE)) {
+ item = Items.ORANGE_WOOL;
+ } else if (color.equals(DyeColor.PINK)) {
+ item = Items.PINK_WOOL;
+ } else if (color.equals(DyeColor.PURPLE)) {
+ item = Items.PURPLE_WOOL;
+ } else if (color.equals(DyeColor.RED)) {
+ item = Items.RED_WOOL;
+ } else if (color.equals(DyeColor.YELLOW)) {
+ item = Items.YELLOW_WOOL;
+ }
+ user.getWorld().spawnEntity(new ItemEntity(user.getWorld(), pos.getX(), pos.getY(), pos.getZ(), new ItemStack(item, amount)));
+ return ActionResult.SUCCESS;
+ }
+ } else if (entity instanceof HorseEntity) {
+ HorseEntity horse = (HorseEntity) entity;
+ horse.playAmbientSound();
+ user.getWorld().spawnEntity(new ItemEntity(user.getWorld(), pos.getX(), pos.getY(), pos.getZ(), new ItemStack(Items.LEATHER, amount)));
+ return ActionResult.SUCCESS;
+ } else if (entity instanceof CowEntity) {
+ CowEntity cow = (CowEntity) entity;
+ cow.playAmbientSound();
+ user.getWorld().spawnEntity(new ItemEntity(user.getWorld(), pos.getX(), pos.getY(), pos.getZ(), new ItemStack(Items.LEATHER, amount)));
+ return ActionResult.SUCCESS;
+ } else if (entity instanceof ChickenEntity) {
+ ChickenEntity cow = (ChickenEntity) entity;
+ cow.playAmbientSound();
+ user.getWorld().spawnEntity(new ItemEntity(user.getWorld(), pos.getX(), pos.getY(), pos.getZ(), new ItemStack(Items.FEATHER, amount)));
+ return ActionResult.SUCCESS;
+ }
+ return ActionResult.PASS;
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderShovel.java b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderShovel.java
new file mode 100644
index 0000000..b26e527
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderShovel.java
@@ -0,0 +1,96 @@
+package de.jottyfan.quickiemod.items;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import de.jottyfan.quickiemod.items.mat.QuickieToolMaterial;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemUsageContext;
+import net.minecraft.item.ShovelItem;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.Direction;
+import net.minecraft.world.World;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class ToolSpeedpowderShovel extends ShovelItem implements ToolRangeable {
+ public static final Integer DEFAULT_HARVEST_RANGE = 3;
+ private final static QuickieToolMaterial MATERIAL = QuickieToolMaterial.of(7f, 800, 15, 1f, QuickieItems.SPEEDINGOT.getItem());
+ public HarvestRange range;
+
+ public ToolSpeedpowderShovel() {
+ super(MATERIAL, new Item.Settings().attributeModifiers(ShovelItem.createAttributeModifiers(MATERIAL, 7F, -3.1F)));
+ this.range = new HarvestRange(DEFAULT_HARVEST_RANGE);
+ }
+
+ private void createPathOnGrass(World world, BlockPos pos, Direction side) {
+ BlockState blockState = world.getBlockState(pos);
+ if (blockState.isAir()) {
+ // try to find one underneath
+ pos = pos.down();
+ blockState = world.getBlockState(pos);
+ } else if (!world.getBlockState(pos.up()).isAir()) {
+ pos = pos.up();
+ blockState = world.getBlockState(pos);
+ }
+ if (side != Direction.DOWN) {
+ BlockState blockState2 = (BlockState) PATH_STATES.get(blockState.getBlock());
+ if (blockState2 != null && world.getBlockState(pos.up()).isAir()) {
+ if (!world.isClient) {
+ world.setBlockState(pos, blockState2, 11);
+ }
+ }
+ }
+ }
+
+ @Override
+ public ActionResult useOnBlock(ItemUsageContext context) {
+ World world = context.getWorld();
+ BlockPos pos = context.getBlockPos();
+ createPathOnGrass(world, pos.north(), context.getSide());
+ createPathOnGrass(world, pos.north().east(), context.getSide());
+ createPathOnGrass(world, pos.north().west(), context.getSide());
+ createPathOnGrass(world, pos.east(), context.getSide());
+ createPathOnGrass(world, pos.west(), context.getSide());
+ createPathOnGrass(world, pos.south(), context.getSide());
+ createPathOnGrass(world, pos.south().east(), context.getSide());
+ createPathOnGrass(world, pos.south().west(), context.getSide());
+ return super.useOnBlock(context);
+ }
+
+ @Override
+ public HarvestRange getRange(ItemStack stack) {
+ // TODO: get range from stack
+ return range;
+ }
+
+ @Override
+ public boolean canBreakNeighbors(BlockState blockState) {
+ return new ItemStack(this).isSuitableFor(blockState);
+ }
+
+ @Override
+ public List getBlockList(Block block) {
+ return Lists.newArrayList(block);
+ }
+
+// @Override
+// public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
+// CommonToolCode.onItemRightClick(worldIn, playerIn, handIn);
+// return super.onItemRightClick(worldIn, playerIn, handIn);
+// }
+//
+// @Override
+// public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) {
+// CommonToolCode.addInformation(stack, worldIn, tooltip, flagIn);
+// super.addInformation(stack, worldIn, tooltip, flagIn);
+// }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderWaterHoe.java b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderWaterHoe.java
new file mode 100644
index 0000000..c7381fb
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/ToolSpeedpowderWaterHoe.java
@@ -0,0 +1,38 @@
+package de.jottyfan.quickiemod.items;
+
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.entity.ItemEntity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemUsageContext;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.Hand;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class ToolSpeedpowderWaterHoe extends ToolSpeedpowderHoe {
+ @Override
+ public ActionResult useOnBlock(ItemUsageContext context) {
+ ActionResult res = super.useOnBlock(context);
+ if (!ActionResult.PASS.equals(res)) {
+ BlockPos pos = context.getBlockPos();
+ World world = context.getWorld();
+ BlockState oldBlockState = world.getBlockState(pos);
+ world.setBlockState(pos, Blocks.WATER.getDefaultState());
+ Hand hand = context.getHand();
+ PlayerEntity player = context.getPlayer();
+ ItemStack oldTool = player.getStackInHand(hand);
+ ItemStack newTool = new ItemStack(QuickieItems.SPEEDPOWDERHOE.getItem());
+ newTool.setDamage(oldTool.getDamage());
+ world.spawnEntity(new ItemEntity(world, pos.getX(), pos.getY(), pos.getZ(), new ItemStack(oldBlockState.getBlock())));
+ player.setStackInHand(hand, newTool);
+ }
+ return res;
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/items/mat/QuickieToolMaterial.java b/src/main/java/de/jottyfan/quickiemod/items/mat/QuickieToolMaterial.java
new file mode 100644
index 0000000..dc7028d
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/items/mat/QuickieToolMaterial.java
@@ -0,0 +1,64 @@
+package de.jottyfan.quickiemod.items.mat;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ToolMaterial;
+import net.minecraft.recipe.Ingredient;
+import net.minecraft.registry.tag.BlockTags;
+import net.minecraft.registry.tag.TagKey;
+
+/**
+ *
+ * @author jotty
+ *
+ */
+public class QuickieToolMaterial implements ToolMaterial {
+
+ private final float attackDamage;
+ private final int durability;
+ private final int enchantability;
+ private final float miningSpeedMuliplier;
+ private final Item item;
+
+ private QuickieToolMaterial(float attackDamage, int durability, int enchantability, float miningSpeedMultiplier, Item item) {
+ this.attackDamage = attackDamage;
+ this.durability = durability;
+ this.enchantability = enchantability;
+ this.miningSpeedMuliplier = miningSpeedMultiplier;
+ this.item = item;
+ }
+
+ public static final QuickieToolMaterial of(float attackDamage, int durability, int enchantability, float miningSpeedMultiplier, Item item) {
+ return new QuickieToolMaterial(attackDamage, durability, enchantability, miningSpeedMultiplier, item);
+ }
+
+ @Override
+ public float getAttackDamage() {
+ return attackDamage;
+ }
+
+ @Override
+ public int getDurability() {
+ return durability;
+ }
+
+ @Override
+ public int getEnchantability() {
+ return enchantability;
+ }
+
+ @Override
+ public TagKey getInverseTag() {
+ return BlockTags.INCORRECT_FOR_IRON_TOOL;
+ }
+
+ @Override
+ public float getMiningSpeedMultiplier() {
+ return miningSpeedMuliplier;
+ }
+
+ @Override
+ public Ingredient getRepairIngredient() {
+ return Ingredient.ofItems(item);
+ }
+}
diff --git a/src/main/java/de/jottyfan/quickiemod/mixin/BlockBreakMixin.java b/src/main/java/de/jottyfan/quickiemod/mixin/BlockBreakMixin.java
new file mode 100644
index 0000000..537dca3
--- /dev/null
+++ b/src/main/java/de/jottyfan/quickiemod/mixin/BlockBreakMixin.java
@@ -0,0 +1,33 @@
+package de.jottyfan.quickiemod.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.CallbackInfoReturnable;
+
+import de.jottyfan.quickiemod.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;)Lnet/minecraft/block/BlockState;")
+ private void onBreak(final World world, final BlockPos blockPos, final BlockState blockState,
+ final PlayerEntity playerEntity, final CallbackInfoReturnable info) {
+ ActionResult result = BreakBlockCallback.EVENT.invoker().injectBlockBreakCallback(world, blockPos, blockState,
+ playerEntity);
+ if (result == ActionResult.FAIL) {
+ info.cancel();
+ }
+ }
+}
diff --git a/src/main/resources/assets/quickiemod/models/item/quickiepowderaxe.json b/src/main/resources/assets/quickiemod/models/item/quickiepowderaxe.json
new file mode 100644
index 0000000..0cea2f2
--- /dev/null
+++ b/src/main/resources/assets/quickiemod/models/item/quickiepowderaxe.json
@@ -0,0 +1,6 @@
+{
+ "parent": "minecraft:item/handheld",
+ "textures": {
+ "layer0": "quickiemod:item/quickiepowderaxe"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/quickiemod/models/item/quickiepowderhoe.json b/src/main/resources/assets/quickiemod/models/item/quickiepowderhoe.json
new file mode 100644
index 0000000..ead1c19
--- /dev/null
+++ b/src/main/resources/assets/quickiemod/models/item/quickiepowderhoe.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "quickiemod:item/quickiepowderhoe"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/quickiemod/models/item/quickiepowderpickaxe.json b/src/main/resources/assets/quickiemod/models/item/quickiepowderpickaxe.json
new file mode 100644
index 0000000..1f56799
--- /dev/null
+++ b/src/main/resources/assets/quickiemod/models/item/quickiepowderpickaxe.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "quickiemod:item/quickiepowderpickaxe"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/quickiemod/models/item/quickiepowdershovel.json b/src/main/resources/assets/quickiemod/models/item/quickiepowdershovel.json
new file mode 100644
index 0000000..a4d63b1
--- /dev/null
+++ b/src/main/resources/assets/quickiemod/models/item/quickiepowdershovel.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "quickiemod:item/quickiepowdershovel"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/quickiemod/models/item/quickiepowderwaterhoe.json b/src/main/resources/assets/quickiemod/models/item/quickiepowderwaterhoe.json
new file mode 100644
index 0000000..e64a3ba
--- /dev/null
+++ b/src/main/resources/assets/quickiemod/models/item/quickiepowderwaterhoe.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "quickiemod:item/quickiepowderwaterhoe"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/quickiemod/models/item/speedpowderaxe.json b/src/main/resources/assets/quickiemod/models/item/speedpowderaxe.json
new file mode 100644
index 0000000..60144a3
--- /dev/null
+++ b/src/main/resources/assets/quickiemod/models/item/speedpowderaxe.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "quickiemod:item/speedpowderaxe"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/quickiemod/models/item/speedpowderhoe.json b/src/main/resources/assets/quickiemod/models/item/speedpowderhoe.json
new file mode 100644
index 0000000..9a41b20
--- /dev/null
+++ b/src/main/resources/assets/quickiemod/models/item/speedpowderhoe.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "quickiemod:item/speedpowderhoe"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/quickiemod/models/item/speedpowderpickaxe.json b/src/main/resources/assets/quickiemod/models/item/speedpowderpickaxe.json
new file mode 100644
index 0000000..3e7d09b
--- /dev/null
+++ b/src/main/resources/assets/quickiemod/models/item/speedpowderpickaxe.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "quickiemod:item/speedpowderpickaxe"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/quickiemod/models/item/speedpowdershovel.json b/src/main/resources/assets/quickiemod/models/item/speedpowdershovel.json
new file mode 100644
index 0000000..a99ff48
--- /dev/null
+++ b/src/main/resources/assets/quickiemod/models/item/speedpowdershovel.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "quickiemod:item/speedpowdershovel"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/quickiemod/models/item/speedpowderwaterhoe.json b/src/main/resources/assets/quickiemod/models/item/speedpowderwaterhoe.json
new file mode 100644
index 0000000..37507fc
--- /dev/null
+++ b/src/main/resources/assets/quickiemod/models/item/speedpowderwaterhoe.json
@@ -0,0 +1,6 @@
+{
+ "parent": "item/generated",
+ "textures": {
+ "layer0": "quickiemod:item/speedpowderwaterhoe"
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/quickiemod/textures/item/quickiepowderaxe.png b/src/main/resources/assets/quickiemod/textures/item/quickiepowderaxe.png
new file mode 100644
index 0000000..c658e6d
Binary files /dev/null and b/src/main/resources/assets/quickiemod/textures/item/quickiepowderaxe.png differ
diff --git a/src/main/resources/assets/quickiemod/textures/item/quickiepowderhoe.png b/src/main/resources/assets/quickiemod/textures/item/quickiepowderhoe.png
new file mode 100644
index 0000000..b74b377
Binary files /dev/null and b/src/main/resources/assets/quickiemod/textures/item/quickiepowderhoe.png differ
diff --git a/src/main/resources/assets/quickiemod/textures/item/quickiepowderpickaxe.png b/src/main/resources/assets/quickiemod/textures/item/quickiepowderpickaxe.png
new file mode 100644
index 0000000..f12ad7e
Binary files /dev/null and b/src/main/resources/assets/quickiemod/textures/item/quickiepowderpickaxe.png differ
diff --git a/src/main/resources/assets/quickiemod/textures/item/quickiepowdershovel.png b/src/main/resources/assets/quickiemod/textures/item/quickiepowdershovel.png
new file mode 100644
index 0000000..9a86273
Binary files /dev/null and b/src/main/resources/assets/quickiemod/textures/item/quickiepowdershovel.png differ
diff --git a/src/main/resources/assets/quickiemod/textures/item/quickiepowderwaterhoe.png b/src/main/resources/assets/quickiemod/textures/item/quickiepowderwaterhoe.png
new file mode 100644
index 0000000..4629099
Binary files /dev/null and b/src/main/resources/assets/quickiemod/textures/item/quickiepowderwaterhoe.png differ
diff --git a/src/main/resources/assets/quickiemod/textures/item/speedpowderaxe.png b/src/main/resources/assets/quickiemod/textures/item/speedpowderaxe.png
new file mode 100644
index 0000000..c933955
Binary files /dev/null and b/src/main/resources/assets/quickiemod/textures/item/speedpowderaxe.png differ
diff --git a/src/main/resources/assets/quickiemod/textures/item/speedpowderhoe.png b/src/main/resources/assets/quickiemod/textures/item/speedpowderhoe.png
new file mode 100644
index 0000000..87e0627
Binary files /dev/null and b/src/main/resources/assets/quickiemod/textures/item/speedpowderhoe.png differ
diff --git a/src/main/resources/assets/quickiemod/textures/item/speedpowderpickaxe.png b/src/main/resources/assets/quickiemod/textures/item/speedpowderpickaxe.png
new file mode 100644
index 0000000..6a7a71d
Binary files /dev/null and b/src/main/resources/assets/quickiemod/textures/item/speedpowderpickaxe.png differ
diff --git a/src/main/resources/assets/quickiemod/textures/item/speedpowdershovel.png b/src/main/resources/assets/quickiemod/textures/item/speedpowdershovel.png
new file mode 100644
index 0000000..b1a4458
Binary files /dev/null and b/src/main/resources/assets/quickiemod/textures/item/speedpowdershovel.png differ
diff --git a/src/main/resources/assets/quickiemod/textures/item/speedpowderwaterhoe.png b/src/main/resources/assets/quickiemod/textures/item/speedpowderwaterhoe.png
new file mode 100644
index 0000000..0966368
Binary files /dev/null and b/src/main/resources/assets/quickiemod/textures/item/speedpowderwaterhoe.png differ
diff --git a/src/main/resources/data/c/tags/item/axes.json b/src/main/resources/data/c/tags/item/axes.json
new file mode 100644
index 0000000..de1bbae
--- /dev/null
+++ b/src/main/resources/data/c/tags/item/axes.json
@@ -0,0 +1,7 @@
+{
+ "replace": false,
+ "values": [
+ "quickiemod:speedpowderaxe",
+ "quickiemod:quickiepowderaxe"
+ ]
+}
\ No newline at end of file
diff --git a/src/main/resources/data/c/tags/item/hoes.json b/src/main/resources/data/c/tags/item/hoes.json
new file mode 100644
index 0000000..1bceade
--- /dev/null
+++ b/src/main/resources/data/c/tags/item/hoes.json
@@ -0,0 +1,9 @@
+{
+ "replace": false,
+ "values": [
+ "quickiemod:speedpowderhoe",
+ "quickiemod:speedpowderwaterhoe",
+ "quickiemod:quickiepowderhoe",
+ "quickiemod:quickiepowderwaterhoe"
+ ]
+}
\ No newline at end of file
diff --git a/src/main/resources/data/c/tags/item/pickaxes.json b/src/main/resources/data/c/tags/item/pickaxes.json
new file mode 100644
index 0000000..9bbc032
--- /dev/null
+++ b/src/main/resources/data/c/tags/item/pickaxes.json
@@ -0,0 +1,7 @@
+{
+ "replace": false,
+ "values": [
+ "quickiemod:speedpowderpickaxe",
+ "quickiemod:quickiepowderpickaxe"
+ ]
+}
\ No newline at end of file
diff --git a/src/main/resources/data/c/tags/item/shovels.json b/src/main/resources/data/c/tags/item/shovels.json
new file mode 100644
index 0000000..bc7e63b
--- /dev/null
+++ b/src/main/resources/data/c/tags/item/shovels.json
@@ -0,0 +1,7 @@
+{
+ "replace": false,
+ "values": [
+ "quickiemod:speedpowdershovel",
+ "quickiemod:quickiepowdershovel"
+ ]
+}
\ No newline at end of file
diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json
similarity index 100%
rename from src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json
rename to src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json
diff --git a/src/main/resources/data/quickiemod/recipes/blasting_oxidized_copper_powder1.json b/src/main/resources/data/quickiemod/recipe/blasting_oxidized_copper_powder1.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/blasting_oxidized_copper_powder1.json
rename to src/main/resources/data/quickiemod/recipe/blasting_oxidized_copper_powder1.json
diff --git a/src/main/resources/data/quickiemod/recipes/blasting_oxidized_copper_powder2.json b/src/main/resources/data/quickiemod/recipe/blasting_oxidized_copper_powder2.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/blasting_oxidized_copper_powder2.json
rename to src/main/resources/data/quickiemod/recipe/blasting_oxidized_copper_powder2.json
diff --git a/src/main/resources/data/quickiemod/recipes/blasting_oxidized_copper_powder3.json b/src/main/resources/data/quickiemod/recipe/blasting_oxidized_copper_powder3.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/blasting_oxidized_copper_powder3.json
rename to src/main/resources/data/quickiemod/recipe/blasting_oxidized_copper_powder3.json
diff --git a/src/main/resources/data/quickiemod/recipes/blasting_oxidized_copper_powder4.json b/src/main/resources/data/quickiemod/recipe/blasting_oxidized_copper_powder4.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/blasting_oxidized_copper_powder4.json
rename to src/main/resources/data/quickiemod/recipe/blasting_oxidized_copper_powder4.json
diff --git a/src/main/resources/data/quickiemod/recipes/blasting_quickieingot.json b/src/main/resources/data/quickiemod/recipe/blasting_quickieingot.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/blasting_quickieingot.json
rename to src/main/resources/data/quickiemod/recipe/blasting_quickieingot.json
diff --git a/src/main/resources/data/quickiemod/recipes/blasting_salpeter_from_brain_coral.json b/src/main/resources/data/quickiemod/recipe/blasting_salpeter_from_brain_coral.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/blasting_salpeter_from_brain_coral.json
rename to src/main/resources/data/quickiemod/recipe/blasting_salpeter_from_brain_coral.json
diff --git a/src/main/resources/data/quickiemod/recipes/blasting_salpeter_from_bubble_coral.json b/src/main/resources/data/quickiemod/recipe/blasting_salpeter_from_bubble_coral.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/blasting_salpeter_from_bubble_coral.json
rename to src/main/resources/data/quickiemod/recipe/blasting_salpeter_from_bubble_coral.json
diff --git a/src/main/resources/data/quickiemod/recipes/blasting_salpeter_from_fire_coral.json b/src/main/resources/data/quickiemod/recipe/blasting_salpeter_from_fire_coral.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/blasting_salpeter_from_fire_coral.json
rename to src/main/resources/data/quickiemod/recipe/blasting_salpeter_from_fire_coral.json
diff --git a/src/main/resources/data/quickiemod/recipes/blasting_salpeter_from_horn_coral.json b/src/main/resources/data/quickiemod/recipe/blasting_salpeter_from_horn_coral.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/blasting_salpeter_from_horn_coral.json
rename to src/main/resources/data/quickiemod/recipe/blasting_salpeter_from_horn_coral.json
diff --git a/src/main/resources/data/quickiemod/recipes/blasting_salpeter_from_tube_coral.json b/src/main/resources/data/quickiemod/recipe/blasting_salpeter_from_tube_coral.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/blasting_salpeter_from_tube_coral.json
rename to src/main/resources/data/quickiemod/recipe/blasting_salpeter_from_tube_coral.json
diff --git a/src/main/resources/data/quickiemod/recipes/blasting_speedingot.json b/src/main/resources/data/quickiemod/recipe/blasting_speedingot.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/blasting_speedingot.json
rename to src/main/resources/data/quickiemod/recipe/blasting_speedingot.json
diff --git a/src/main/resources/data/quickiemod/recipes/campfire_dried_kelpblock.json b/src/main/resources/data/quickiemod/recipe/campfire_dried_kelpblock.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/campfire_dried_kelpblock.json
rename to src/main/resources/data/quickiemod/recipe/campfire_dried_kelpblock.json
diff --git a/src/main/resources/data/quickiemod/recipes/campfire_torch.json b/src/main/resources/data/quickiemod/recipe/campfire_torch.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/campfire_torch.json
rename to src/main/resources/data/quickiemod/recipe/campfire_torch.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_blockquickiepowder_from_quickiepowder.json b/src/main/resources/data/quickiemod/recipe/shaped_blockquickiepowder_from_quickiepowder.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_blockquickiepowder_from_quickiepowder.json
rename to src/main/resources/data/quickiemod/recipe/shaped_blockquickiepowder_from_quickiepowder.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_blocksalpeter.json b/src/main/resources/data/quickiemod/recipe/shaped_blocksalpeter.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_blocksalpeter.json
rename to src/main/resources/data/quickiemod/recipe/shaped_blocksalpeter.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_blockspeedpowder_from_speedpowder.json b/src/main/resources/data/quickiemod/recipe/shaped_blockspeedpowder_from_speedpowder.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_blockspeedpowder_from_speedpowder.json
rename to src/main/resources/data/quickiemod/recipe/shaped_blockspeedpowder_from_speedpowder.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_blocksulphor.json b/src/main/resources/data/quickiemod/recipe/shaped_blocksulphor.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_blocksulphor.json
rename to src/main/resources/data/quickiemod/recipe/shaped_blocksulphor.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_canolabottlestack.json b/src/main/resources/data/quickiemod/recipe/shaped_canolabottlestack.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_canolabottlestack.json
rename to src/main/resources/data/quickiemod/recipe/shaped_canolabottlestack.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_carrotstack_from_carrots.json b/src/main/resources/data/quickiemod/recipe/shaped_carrotstack_from_carrots.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_carrotstack_from_carrots.json
rename to src/main/resources/data/quickiemod/recipe/shaped_carrotstack_from_carrots.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_drill.json b/src/main/resources/data/quickiemod/recipe/shaped_drill.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_drill.json
rename to src/main/resources/data/quickiemod/recipe/shaped_drill.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_drillstop.json b/src/main/resources/data/quickiemod/recipe/shaped_drillstop.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_drillstop.json
rename to src/main/resources/data/quickiemod/recipe/shaped_drillstop.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_emptylavahoarder.json b/src/main/resources/data/quickiemod/recipe/shaped_emptylavahoarder.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_emptylavahoarder.json
rename to src/main/resources/data/quickiemod/recipe/shaped_emptylavahoarder.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_itemhoarder_from_barrel.json b/src/main/resources/data/quickiemod/recipe/shaped_itemhoarder_from_barrel.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_itemhoarder_from_barrel.json
rename to src/main/resources/data/quickiemod/recipe/shaped_itemhoarder_from_barrel.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_itemhoarder_from_chest.json b/src/main/resources/data/quickiemod/recipe/shaped_itemhoarder_from_chest.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_itemhoarder_from_chest.json
rename to src/main/resources/data/quickiemod/recipe/shaped_itemhoarder_from_chest.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_kelpstack_from_kelp.json b/src/main/resources/data/quickiemod/recipe/shaped_kelpstack_from_kelp.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_kelpstack_from_kelp.json
rename to src/main/resources/data/quickiemod/recipe/shaped_kelpstack_from_kelp.json
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_monsterhoarder.json b/src/main/resources/data/quickiemod/recipe/shaped_monsterhoarder.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_monsterhoarder.json
rename to src/main/resources/data/quickiemod/recipe/shaped_monsterhoarder.json
diff --git a/src/main/resources/data/quickiemod/recipe/shaped_quickiepowderaxe.json b/src/main/resources/data/quickiemod/recipe/shaped_quickiepowderaxe.json
new file mode 100644
index 0000000..74ad2d4
--- /dev/null
+++ b/src/main/resources/data/quickiemod/recipe/shaped_quickiepowderaxe.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "category": "tools",
+ "pattern": [
+ "ss",
+ "s|",
+ " |"
+ ],
+ "key": {
+ "s": {
+ "item": "quickiemod:quickieingot"
+ },
+ "|": {
+ "item": "minecraft:stick"
+ }
+ },
+ "result": {
+ "id": "quickiemod:quickiepowderaxe",
+ "count": 1
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/recipe/shaped_quickiepowderhoe.json b/src/main/resources/data/quickiemod/recipe/shaped_quickiepowderhoe.json
new file mode 100644
index 0000000..18155a1
--- /dev/null
+++ b/src/main/resources/data/quickiemod/recipe/shaped_quickiepowderhoe.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "category": "tools",
+ "pattern": [
+ "ss",
+ " |",
+ " |"
+ ],
+ "key": {
+ "s": {
+ "item": "quickiemod:quickieingot"
+ },
+ "|": {
+ "item": "minecraft:stick"
+ }
+ },
+ "result": {
+ "id": "quickiemod:quickiepowderhoe",
+ "count": 1
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/recipe/shaped_quickiepowderpickaxe.json b/src/main/resources/data/quickiemod/recipe/shaped_quickiepowderpickaxe.json
new file mode 100644
index 0000000..45cae5e
--- /dev/null
+++ b/src/main/resources/data/quickiemod/recipe/shaped_quickiepowderpickaxe.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "category": "tools",
+ "pattern": [
+ "sss",
+ " | ",
+ " | "
+ ],
+ "key": {
+ "s": {
+ "item": "quickiemod:quickieingot"
+ },
+ "|": {
+ "item": "minecraft:stick"
+ }
+ },
+ "result": {
+ "id": "quickiemod:quickiepowderpickaxe",
+ "count": 1
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/recipe/shaped_quickiepowdershovel.json b/src/main/resources/data/quickiemod/recipe/shaped_quickiepowdershovel.json
new file mode 100644
index 0000000..e53cf7c
--- /dev/null
+++ b/src/main/resources/data/quickiemod/recipe/shaped_quickiepowdershovel.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "category": "tools",
+ "pattern": [
+ "s",
+ "|",
+ "|"
+ ],
+ "key": {
+ "s": {
+ "item": "quickiemod:quickieingot"
+ },
+ "|": {
+ "item": "minecraft:stick"
+ }
+ },
+ "result": {
+ "id": "quickiemod:quickiepowdershovel",
+ "count": 1
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_speedpowder_shears.json b/src/main/resources/data/quickiemod/recipe/shaped_speedpowder_shears.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_speedpowder_shears.json
rename to src/main/resources/data/quickiemod/recipe/shaped_speedpowder_shears.json
diff --git a/src/main/resources/data/quickiemod/recipe/shaped_speedpowderaxe.json b/src/main/resources/data/quickiemod/recipe/shaped_speedpowderaxe.json
new file mode 100644
index 0000000..7e152ca
--- /dev/null
+++ b/src/main/resources/data/quickiemod/recipe/shaped_speedpowderaxe.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "category": "tools",
+ "pattern": [
+ "ss",
+ "s|",
+ " |"
+ ],
+ "key": {
+ "s": {
+ "item": "quickiemod:speedingot"
+ },
+ "|": {
+ "item": "minecraft:stick"
+ }
+ },
+ "result": {
+ "id": "quickiemod:speedpowderaxe",
+ "count": 1
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/recipe/shaped_speedpowderhoe.json b/src/main/resources/data/quickiemod/recipe/shaped_speedpowderhoe.json
new file mode 100644
index 0000000..b92631a
--- /dev/null
+++ b/src/main/resources/data/quickiemod/recipe/shaped_speedpowderhoe.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "category": "tools",
+ "pattern": [
+ "ss",
+ " |",
+ " |"
+ ],
+ "key": {
+ "s": {
+ "item": "quickiemod:speedingot"
+ },
+ "|": {
+ "item": "minecraft:stick"
+ }
+ },
+ "result": {
+ "id": "quickiemod:speedpowderhoe",
+ "count": 1
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/recipe/shaped_speedpowderpickaxe.json b/src/main/resources/data/quickiemod/recipe/shaped_speedpowderpickaxe.json
new file mode 100644
index 0000000..9feb58c
--- /dev/null
+++ b/src/main/resources/data/quickiemod/recipe/shaped_speedpowderpickaxe.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "category": "tools",
+ "pattern": [
+ "sss",
+ " | ",
+ " | "
+ ],
+ "key": {
+ "s": {
+ "item": "quickiemod:speedingot"
+ },
+ "|": {
+ "item": "minecraft:stick"
+ }
+ },
+ "result": {
+ "id": "quickiemod:speedpowderpickaxe",
+ "count": 1
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/recipe/shaped_speedpowdershovel.json b/src/main/resources/data/quickiemod/recipe/shaped_speedpowdershovel.json
new file mode 100644
index 0000000..604e513
--- /dev/null
+++ b/src/main/resources/data/quickiemod/recipe/shaped_speedpowdershovel.json
@@ -0,0 +1,21 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "category": "tools",
+ "pattern": [
+ "s",
+ "|",
+ "|"
+ ],
+ "key": {
+ "s": {
+ "item": "quickiemod:speedingot"
+ },
+ "|": {
+ "item": "minecraft:stick"
+ }
+ },
+ "result": {
+ "id": "quickiemod:speedpowdershovel",
+ "count": 1
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/recipes/shaped_string_from_cotton.json b/src/main/resources/data/quickiemod/recipe/shaped_string_from_cotton.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shaped_string_from_cotton.json
rename to src/main/resources/data/quickiemod/recipe/shaped_string_from_cotton.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_blockquickiepowder_from_slimeblockandspeedpowderblock.json b/src/main/resources/data/quickiemod/recipe/shapeless_blockquickiepowder_from_slimeblockandspeedpowderblock.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_blockquickiepowder_from_slimeblockandspeedpowderblock.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_blockquickiepowder_from_slimeblockandspeedpowderblock.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_blockspeedpowder_from_salpetersulforcoalblock.json b/src/main/resources/data/quickiemod/recipe/shapeless_blockspeedpowder_from_salpetersulforcoalblock.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_blockspeedpowder_from_salpetersulforcoalblock.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_blockspeedpowder_from_salpetersulforcoalblock.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_canolabottle.json b/src/main/resources/data/quickiemod/recipe/shapeless_canolabottle.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_canolabottle.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_canolabottle.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_canolabottle_from_stack.json b/src/main/resources/data/quickiemod/recipe/shapeless_canolabottle_from_stack.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_canolabottle_from_stack.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_canolabottle_from_stack.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_carrots_from_carrotstack.json b/src/main/resources/data/quickiemod/recipe/shapeless_carrots_from_carrotstack.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_carrots_from_carrotstack.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_carrots_from_carrotstack.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_drill_fromdrillnorth.json b/src/main/resources/data/quickiemod/recipe/shapeless_drill_fromdrillnorth.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_drill_fromdrillnorth.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_drill_fromdrillnorth.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_drilleast_fromdrill.json b/src/main/resources/data/quickiemod/recipe/shapeless_drilleast_fromdrill.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_drilleast_fromdrill.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_drilleast_fromdrill.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_drillnorth_fromdrillwest.json b/src/main/resources/data/quickiemod/recipe/shapeless_drillnorth_fromdrillwest.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_drillnorth_fromdrillwest.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_drillnorth_fromdrillwest.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_drillsouth_fromdrilleast.json b/src/main/resources/data/quickiemod/recipe/shapeless_drillsouth_fromdrilleast.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_drillsouth_fromdrilleast.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_drillsouth_fromdrilleast.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_drillwest_fromdrillsouth.json b/src/main/resources/data/quickiemod/recipe/shapeless_drillwest_fromdrillsouth.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_drillwest_fromdrillsouth.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_drillwest_fromdrillsouth.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_glowstone_item_frame.json b/src/main/resources/data/quickiemod/recipe/shapeless_glowstone_item_frame.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_glowstone_item_frame.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_glowstone_item_frame.json
diff --git a/src/main/resources/data/quickiemod/recipe/shapeless_gunpowder.json b/src/main/resources/data/quickiemod/recipe/shapeless_gunpowder.json
new file mode 100644
index 0000000..fb6c0df
--- /dev/null
+++ b/src/main/resources/data/quickiemod/recipe/shapeless_gunpowder.json
@@ -0,0 +1,18 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:coal"
+ },
+ {
+ "item": "quickiemod:sulphor"
+ },
+ {
+ "item": "quickiemod:salpeter"
+ }
+ ],
+ "result": {
+ "id": "minecraft:gunpowder",
+ "count": 1
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_quickiepowder_from_block.json b/src/main/resources/data/quickiemod/recipe/shapeless_quickiepowder_from_block.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_quickiepowder_from_block.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_quickiepowder_from_block.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_quickiepowder_from_oxidizedcopperpowder.json b/src/main/resources/data/quickiemod/recipe/shapeless_quickiepowder_from_oxidizedcopperpowder.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_quickiepowder_from_oxidizedcopperpowder.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_quickiepowder_from_oxidizedcopperpowder.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_quickiepowder_from_slimeball.json b/src/main/resources/data/quickiemod/recipe/shapeless_quickiepowder_from_slimeball.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_quickiepowder_from_slimeball.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_quickiepowder_from_slimeball.json
diff --git a/src/main/resources/data/quickiemod/recipe/shapeless_quickiepowderwaterhoe.json b/src/main/resources/data/quickiemod/recipe/shapeless_quickiepowderwaterhoe.json
new file mode 100644
index 0000000..f583622
--- /dev/null
+++ b/src/main/resources/data/quickiemod/recipe/shapeless_quickiepowderwaterhoe.json
@@ -0,0 +1,15 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:water_bucket"
+ },
+ {
+ "item": "quickiemod:quickiepowderhoe"
+ }
+ ],
+ "result": {
+ "id": "quickiemod:quickiepowderwaterhoe",
+ "count": 1
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_salpeter_from_block.json b/src/main/resources/data/quickiemod/recipe/shapeless_salpeter_from_block.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_salpeter_from_block.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_salpeter_from_block.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_speedpowder.json b/src/main/resources/data/quickiemod/recipe/shapeless_speedpowder.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_speedpowder.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_speedpowder.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_speedpowder_from_block.json b/src/main/resources/data/quickiemod/recipe/shapeless_speedpowder_from_block.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_speedpowder_from_block.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_speedpowder_from_block.json
diff --git a/src/main/resources/data/quickiemod/recipe/shapeless_speedpowderwaterhoe.json b/src/main/resources/data/quickiemod/recipe/shapeless_speedpowderwaterhoe.json
new file mode 100644
index 0000000..309d718
--- /dev/null
+++ b/src/main/resources/data/quickiemod/recipe/shapeless_speedpowderwaterhoe.json
@@ -0,0 +1,15 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "minecraft:water_bucket"
+ },
+ {
+ "item": "quickiemod:speedpowderhoe"
+ }
+ ],
+ "result": {
+ "id": "quickiemod:speedpowderwaterhoe",
+ "count": 1
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_string_from_wool.json b/src/main/resources/data/quickiemod/recipe/shapeless_string_from_wool.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_string_from_wool.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_string_from_wool.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_stub.json b/src/main/resources/data/quickiemod/recipe/shapeless_stub.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_stub.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_stub.json
diff --git a/src/main/resources/data/quickiemod/recipes/shapeless_sulphor_from_block.json b/src/main/resources/data/quickiemod/recipe/shapeless_sulphor_from_block.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/shapeless_sulphor_from_block.json
rename to src/main/resources/data/quickiemod/recipe/shapeless_sulphor_from_block.json
diff --git a/src/main/resources/data/quickiemod/recipes/smelting_salpeter1.json b/src/main/resources/data/quickiemod/recipe/smelting_salpeter1.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/smelting_salpeter1.json
rename to src/main/resources/data/quickiemod/recipe/smelting_salpeter1.json
diff --git a/src/main/resources/data/quickiemod/recipes/smelting_salpeter2.json b/src/main/resources/data/quickiemod/recipe/smelting_salpeter2.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/smelting_salpeter2.json
rename to src/main/resources/data/quickiemod/recipe/smelting_salpeter2.json
diff --git a/src/main/resources/data/quickiemod/recipes/smelting_salpeter3.json b/src/main/resources/data/quickiemod/recipe/smelting_salpeter3.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/smelting_salpeter3.json
rename to src/main/resources/data/quickiemod/recipe/smelting_salpeter3.json
diff --git a/src/main/resources/data/quickiemod/recipes/smelting_salpeter4.json b/src/main/resources/data/quickiemod/recipe/smelting_salpeter4.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/smelting_salpeter4.json
rename to src/main/resources/data/quickiemod/recipe/smelting_salpeter4.json
diff --git a/src/main/resources/data/quickiemod/recipes/smelting_sulfur1.json b/src/main/resources/data/quickiemod/recipe/smelting_sulfur1.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/smelting_sulfur1.json
rename to src/main/resources/data/quickiemod/recipe/smelting_sulfur1.json
diff --git a/src/main/resources/data/quickiemod/recipes/smelting_sulfur2.json b/src/main/resources/data/quickiemod/recipe/smelting_sulfur2.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/smelting_sulfur2.json
rename to src/main/resources/data/quickiemod/recipe/smelting_sulfur2.json
diff --git a/src/main/resources/data/quickiemod/recipes/smoking_dried_kelpblock.json b/src/main/resources/data/quickiemod/recipe/smoking_dried_kelpblock.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/smoking_dried_kelpblock.json
rename to src/main/resources/data/quickiemod/recipe/smoking_dried_kelpblock.json
diff --git a/src/main/resources/data/quickiemod/recipes/smoking_leather_from_flesh_stripes.json b/src/main/resources/data/quickiemod/recipe/smoking_leather_from_flesh_stripes.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/smoking_leather_from_flesh_stripes.json
rename to src/main/resources/data/quickiemod/recipe/smoking_leather_from_flesh_stripes.json
diff --git a/src/main/resources/data/quickiemod/recipes/stonecutting_flesh_stripes.json b/src/main/resources/data/quickiemod/recipe/stonecutting_flesh_stripes.json
similarity index 100%
rename from src/main/resources/data/quickiemod/recipes/stonecutting_flesh_stripes.json
rename to src/main/resources/data/quickiemod/recipe/stonecutting_flesh_stripes.json
diff --git a/src/main/resources/data/quickiemod/tags/block/mineable/pickaxe.json b/src/main/resources/data/quickiemod/tags/block/mineable/pickaxe.json
new file mode 100644
index 0000000..406d026
--- /dev/null
+++ b/src/main/resources/data/quickiemod/tags/block/mineable/pickaxe.json
@@ -0,0 +1,12 @@
+ {
+ "replace": false,
+ "values": [
+ "quickiemod:oresulphor",
+ "quickiemod:oredeepslatesulphor",
+ "quickiemod:orenethersulphor",
+ "quickiemod:oresalpeter",
+ "quickiemod:oresandsalpeter",
+ "quickiemod:sandsalpeter",
+ "quickiemod:dirtsalpeter"
+ ]
+ }
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/worldgen/placed_feature/blocksulphor.json b/src/main/resources/data/quickiemod/worldgen/placed_feature/blocksulphor.json
index f60d526..5248784 100644
--- a/src/main/resources/data/quickiemod/worldgen/placed_feature/blocksulphor.json
+++ b/src/main/resources/data/quickiemod/worldgen/placed_feature/blocksulphor.json
@@ -19,6 +19,9 @@
"absolute": 5
}
}
+ },
+ {
+ "type": "minecraft:biome"
}
]
}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/worldgen/placed_feature/dirtsalpeter.json b/src/main/resources/data/quickiemod/worldgen/placed_feature/dirtsalpeter.json
index 7e9cc41..fce5675 100644
--- a/src/main/resources/data/quickiemod/worldgen/placed_feature/dirtsalpeter.json
+++ b/src/main/resources/data/quickiemod/worldgen/placed_feature/dirtsalpeter.json
@@ -19,6 +19,9 @@
"absolute": 16
}
}
+ },
+ {
+ "type": "minecraft:biome"
}
]
}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/worldgen/placed_feature/oredeepslatesulphor.json b/src/main/resources/data/quickiemod/worldgen/placed_feature/oredeepslatesulphor.json
index d05d339..7d6a9e6 100644
--- a/src/main/resources/data/quickiemod/worldgen/placed_feature/oredeepslatesulphor.json
+++ b/src/main/resources/data/quickiemod/worldgen/placed_feature/oredeepslatesulphor.json
@@ -19,6 +19,9 @@
"absolute": -125
}
}
+ },
+ {
+ "type": "minecraft:biome"
}
]
}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/worldgen/placed_feature/orenethersulphor.json b/src/main/resources/data/quickiemod/worldgen/placed_feature/orenethersulphor.json
index 9beffb3..b0d3c7a 100644
--- a/src/main/resources/data/quickiemod/worldgen/placed_feature/orenethersulphor.json
+++ b/src/main/resources/data/quickiemod/worldgen/placed_feature/orenethersulphor.json
@@ -19,6 +19,9 @@
"absolute": 5
}
}
+ },
+ {
+ "type": "minecraft:biome"
}
]
}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/worldgen/placed_feature/oresalpeter.json b/src/main/resources/data/quickiemod/worldgen/placed_feature/oresalpeter.json
index 7c5f6e6..ef3d295 100644
--- a/src/main/resources/data/quickiemod/worldgen/placed_feature/oresalpeter.json
+++ b/src/main/resources/data/quickiemod/worldgen/placed_feature/oresalpeter.json
@@ -19,6 +19,9 @@
"absolute": 0
}
}
+ },
+ {
+ "type": "minecraft:biome"
}
]
}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/worldgen/placed_feature/oresandsalpeter.json b/src/main/resources/data/quickiemod/worldgen/placed_feature/oresandsalpeter.json
index 0c62c27..9869c1e 100644
--- a/src/main/resources/data/quickiemod/worldgen/placed_feature/oresandsalpeter.json
+++ b/src/main/resources/data/quickiemod/worldgen/placed_feature/oresandsalpeter.json
@@ -19,6 +19,9 @@
"absolute": 32
}
}
+ },
+ {
+ "type": "minecraft:biome"
}
]
}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/worldgen/placed_feature/oresulphor.json b/src/main/resources/data/quickiemod/worldgen/placed_feature/oresulphor.json
index b6a3f9b..9903c6a 100644
--- a/src/main/resources/data/quickiemod/worldgen/placed_feature/oresulphor.json
+++ b/src/main/resources/data/quickiemod/worldgen/placed_feature/oresulphor.json
@@ -19,6 +19,9 @@
"absolute": 0
}
}
+ },
+ {
+ "type": "minecraft:biome"
}
]
}
\ No newline at end of file
diff --git a/src/main/resources/data/quickiemod/worldgen/placed_feature/sandsalpeter.json b/src/main/resources/data/quickiemod/worldgen/placed_feature/sandsalpeter.json
index 3a95911..8653de0 100644
--- a/src/main/resources/data/quickiemod/worldgen/placed_feature/sandsalpeter.json
+++ b/src/main/resources/data/quickiemod/worldgen/placed_feature/sandsalpeter.json
@@ -19,6 +19,9 @@
"absolute": 32
}
}
+ },
+ {
+ "type": "minecraft:biome"
}
]
}
\ No newline at end of file
diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json
index 4d82238..7285e31 100644
--- a/src/main/resources/fabric.mod.json
+++ b/src/main/resources/fabric.mod.json
@@ -25,6 +25,9 @@
"de.jottyfan.quickiemod.QuickieModClient"
]
},
+ "mixins": [
+ "quickiemod.mixins.json"
+ ],
"depends": {
"fabricloader": ">=0.15.11",
"minecraft": "~1.21",
diff --git a/src/main/resources/quickiemod.mixins.json b/src/main/resources/quickiemod.mixins.json
new file mode 100644
index 0000000..f2859fb
--- /dev/null
+++ b/src/main/resources/quickiemod.mixins.json
@@ -0,0 +1,14 @@
+{
+ "required": true,
+ "minVersion": "0.8",
+ "package": "de.jottyfan.quickiemod.mixin",
+ "compatibilityLevel": "JAVA_21",
+ "mixins": [
+ "BlockBreakMixin"
+ ],
+ "client": [
+ ],
+ "injectors": {
+ "defaultRequire": 1
+ }
+}
\ No newline at end of file